电商网站爬取-1688
这次的爬取目标是1688网站的搜索界面商品信息,比如在搜索栏输入“笔记本”,然后就可以爬取所有“笔记本”商品信息
创建项目/略
输入搜索信息
with open('input.txt', 'r', encoding='utf-8')as f:
keywordstr = f.readline()
f.close()
这里input.txt文件里只写了一行信息,所以读一次就可以了。如果要多行读入,可以加个循环
keyword = quote(keywordstr, encoding='gbk')
1688搜索栏url里用的是gbk编码
配置基本参数
请求头
headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36', 'referer': 'https://www.1688.com/'}
不遵守robots协议
ROBOTSTXT_OBEY = False
获取商品列表页
输入列表页地址
seach_url = 'https://s.1688.com/selloffer/offer_search.htm?keywords={}&n=y&netType=1%2C11&encode=utf-8&spm=a260k.dacugeneral.search.0'.format(self.keyword)
发送请求,回调parse_list函数
yield scrapy.Request(
url=seach_url,
callback=self.parse_list,
headers=self.headers
# meta={'item': copy.deepcopy(item)}
)
检索需要的商品详情页地址
首先查看返回的商品列表页的response.text中是否包含商品详情页地址
# with open('response.txt', 'w')as f:
# f.write(response.text)
# f.close()
然后将商品详情页地址用xpath或css或re提取出来
li_list_name = response.xpath('//*[@class="sm-offer-item sw-dpl-offer-item "]//a')
offerid = li_list_name.xpath('//*/a/@offerid').extract()
for i in set(offerid):
detail_url = 'https://detail.1688.com/offer/{}.html?clickid=db79f70e97ba4557a6590450c3c2b110&sessionid=8432c87670a448c65271639e7e051d61'.format(i)
这里我没有直接提取商品地址,而是选择提取商品ID,然后编辑成商品地址。这样地址中直接携带了“clickid”和“sessionid”两个重要参数,避免跳转到登录页
这时已经得到了最重要的商品详情页地址,后续就交给parse_detail函数处理商品具体信息的分类与下载
翻页
maxpage = response.xpath('//*/div/@data-total-page').extract_first()
if self.page < int(maxpage):
self.page += 1
seach_url = 'https://s.1688.com/selloffer/offer_search.htm?keywords={}&n=y&netType=1%2C11&encode=utf-8&spm=a260k.dacugeneral.search.0&beginPage={}#sm-filtbar'.format(self.keyword, self.page)
yield scrapy.Request(
url=seach_url,
callback=self.parse_list,
headers=self.headers
# meta={'item': copy.deepcopy(item)}
)
这里参照了上面的方法,没有从response中直接获取下一页地址,而是手动编辑url。而为了避免翻页值溢出,就单独获取了data-total-page参数,即商品总页数,避免访问无效地址。
处理下载商品信息/略
因为已经获取到了具体的商品详情页,所以商品的所有信息都可以从详情页直接获取。
自行定义parse_detail函数即可