淘宝商品比价定向爬虫
1、“淘宝商品比价定向爬虫”实例介绍(1)功能描述(2)定向爬虫可行性(3)程序的结构设计2、“淘宝商品比价定向爬虫”实例编写3、小结1、“淘宝商品比价定向爬虫”实例介绍
/
(1)功能描述
目标:获取淘宝搜索页面的信息,提取其中的商品名称和价格
理解: 淘宝的搜索接口、翻页的处理
技术路线:requests‐bs4‐re
在淘宝中搜索书包:
起始页:
/search?q=%E4%B9%A6%E5%8C%85&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo..56-taobao-item.1&ie=utf8&initiative_id=tbindexz_0306
第二页:
/search?q=%E4%B9%A6%E5%8C%85&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo..56-taobao-item.1&ie=utf8&initiative_id=tbindexz_0306&bcoffset=3&ntoffset=3&p4ppushleft=1%2C48&s=44
第三页:
/search?q=%E4%B9%A6%E5%8C%85&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo..56-taobao-item.1&ie=utf8&initiative_id=tbindexz_0306&bcoffset=0&ntoffset=6&p4ppushleft=1%2C48&s=88
每页44个商品
搜索接口和翻页的URL对应属性
(2)定向爬虫可行性
/robots.txt
User‐agent: * Disallow: /
请注意:这个例子仅探讨技术实现,请不要不加限制的爬取该网站
(3)程序的结构设计
步骤1:提交商品搜索请求,循环获取页面
步骤2:对于每个页面,提取商品名称和价格信息
步骤3:将信息输出到屏幕上
2、“淘宝商品比价定向爬虫”实例编写
F12先看看网页源代码:
每页有44个数据,具体点开,其中的属性如下所示:
更正,看视频应该是直接右键,查看源代码,在view_price里面是价钱。
问题1:爬取错误,需要登陆
显示“淘、我喜欢……”,网上有一些方法,参考python爬虫笔记(六)网络爬虫之实战(1)——淘宝商品比价定向爬虫(解决淘宝爬虫限制:使用cookies),这个方法试了不行,参考python爬虫爬取淘宝商品比价(附淘宝反爬虫机制解决小办法)和Python爬虫入门实例五之淘宝商品信息定向爬取(优化版),就是要加上Headers和Cookie就行了,获取就是F12谷歌浏览器获取
问题2:爬取失败
这个是cookie,不是cookies,注意
'cookie': 'cna=4EY9GBCGi24CAX0hoxPCSh3o; lgc=tb016326075; tracknick=tb016326075; enc=vAQP3%2BDiMCsmpBTPzOYmEIf8ck2VCf7vC7nkQZ8%2FaWvOxPgNQ%2Bq9Tqk7CeUAsuxbNycLP1m34NetTpzAHUGLY6%2BIoDKIGwerwubCYx%2BRGgU%3D; thw=cn; hng=CN%7Czh-CN%7CCNY%7C156; miid=2129683386431328771; uc3=nk2=F5RFgYsblJqh%2Fxg%3D&lg2=URm48syIIVrSKA%3D%3D&id2=UUphyu%2BMQePK3ZcJpg%3D%3D&vt3=F8dCuAAj3fWCuQmoFRA%3D; sgcookie=E1001PKHlEpHPIwgZdgXqmuN4zNC5c2rLh0ZZl2qrrU2tpqYBo4DeiGoYkBtV2vrW8la5C5mno3THPQIol2aGJP%2B1g%3D%3D; uc4=id4=0%40U2grEanNorSHEVC%2FCJPnu1dyk6%2Fm%2Blb%2B&nk4=0%40FY4O6GMel1dzoUGz33V%2BnooVPIKaeQ%3D%3D; _cc_=V32FPkk%2Fhw%3D%3D; mt=ci=-1_0; t=d6a7916c433234b48b3736ab03124eb3; _tb_token_=ebb07d739b617; _m_h5_tk=1552cdc6833858830d8b3ce0002ff6a3_1610964559834; _m_h5_tk_enc=e17584be300f3e8c02a520783ff33afe; xlly_s=1; alitrackid=; lastalitrackid=; cookie2=1b2930486c1a521557fda231d6bea006; uc1=cookie14=Uoe1gqFMHiHajw%3D%3D; l=eBxIxLbROluIR8QEBO5Zhurza77T3IOfGsPzaNbMiInca6OF6e2h0NCINVIeJdtjgtCXhetyAv1yVdHyJNUKg2HvCbKrCyCuQxJO.; tfstk=c2jFB009-kEFUAx7kHtrO0JWacndaWRkGcJ2-aCGJq4z1mTpgsfSwdqLJdJyMlYh.; isg=BNLSjHOo5mgFdCUsNcrbgSaEI5i049Z9mBe_c5wq5AVJr3aphHPPjYYNHwuT304V; JSESSIONID=2D6B9CE4E9E5A60BCE2129936E482C77'}
这个是headers,不是header,注意
r = requests.get(url, headers=kv, timeout=30)
以上两个地方卡了我好久,解决完之后就能模拟浏览器进行免登录了
问题3:第一页爬取有时失败
try没进去,直接就进到except里头了。解决办法:多试几次。或者尝试不加timeout,但把timeout去了第二页又出不来了……这个问题有点玄学
以及第一面的view_price个数有时是44,有时是48,在浏览器里面直接数也是的
关于eval() 函数,是用来执行一个字符串表达式,并返回表达式的值,用法如下:
>>>x = 7>>> eval( '3 * x' )21>>> eval('pow(2,2)')4>>> eval('2 + 2')4>>> n=81>>> eval("n + 4")85
代码如下:
import requestsimport redef getHTMLText(url):try:kv = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36','cookie': 'cna=4EY9GBCGi24CAX0hoxPCSh3o; lgc=tb016326075; tracknick=tb016326075; enc=vAQP3%2BDiMCsmpBTPzOYmEIf8ck2VCf7vC7nkQZ8%2FaWvOxPgNQ%2Bq9Tqk7CeUAsuxbNycLP1m34NetTpzAHUGLY6%2BIoDKIGwerwubCYx%2BRGgU%3D; thw=cn; hng=CN%7Czh-CN%7CCNY%7C156; miid=2129683386431328771; uc3=nk2=F5RFgYsblJqh%2Fxg%3D&lg2=URm48syIIVrSKA%3D%3D&id2=UUphyu%2BMQePK3ZcJpg%3D%3D&vt3=F8dCuAAj3fWCuQmoFRA%3D; sgcookie=E1001PKHlEpHPIwgZdgXqmuN4zNC5c2rLh0ZZl2qrrU2tpqYBo4DeiGoYkBtV2vrW8la5C5mno3THPQIol2aGJP%2B1g%3D%3D; uc4=id4=0%40U2grEanNorSHEVC%2FCJPnu1dyk6%2Fm%2Blb%2B&nk4=0%40FY4O6GMel1dzoUGz33V%2BnooVPIKaeQ%3D%3D; _cc_=V32FPkk%2Fhw%3D%3D; mt=ci=-1_0; t=d6a7916c433234b48b3736ab03124eb3; _tb_token_=ebb07d739b617; _m_h5_tk=1552cdc6833858830d8b3ce0002ff6a3_1610964559834; _m_h5_tk_enc=e17584be300f3e8c02a520783ff33afe; xlly_s=1; alitrackid=; lastalitrackid=; cookie2=1b2930486c1a521557fda231d6bea006; uc1=cookie14=Uoe1gqFMHiHajw%3D%3D; l=eBxIxLbROluIR8QEBO5Zhurza77T3IOfGsPzaNbMiInca6OF6e2h0NCINVIeJdtjgtCXhetyAv1yVdHyJNUKg2HvCbKrCyCuQxJO.; tfstk=c2jFB009-kEFUAx7kHtrO0JWacndaWRkGcJ2-aCGJq4z1mTpgsfSwdqLJdJyMlYh.; isg=BNLSjHOo5mgFdCUsNcrbgSaEI5i049Z9mBe_c5wq5AVJr3aphHPPjYYNHwuT304V; JSESSIONID=2D6B9CE4E9E5A60BCE2129936E482C77'}r = requests.get(url, headers=kv, timeout=30)r.raise_for_status()r.encoding = r.apparent_encodingreturn r.textexcept:print('Error:获取失败')def parsePage(ilt, html):try:plt = re.findall(r'\"view_price\"\:\"[\d\.]*\"', html)tlt = re.findall(r'\"raw_title\"\:\".*?\"', html)for i in range(len(plt)):price = eval(plt[i].split(':')[1])title = eval(tlt[i].split(':')[1])ilt.append([price, title])except:print('Error!')def printGoodsList(ilt):tplt = '{:4}\t{:8}\t{:16}'print(tplt.format('序号','价格','商品名称'))count = 0for g in ilt:count += 1print(tplt.format(count, g[0], g[1]))def main():goods = '书包'depth = 2start_url = '/search?q=' + goodsinfolist = []for i in range(depth):try:url = start_url + '&s=' + str(44 * i)html = getHTMLText(url)parsePage(infolist, html)except:continueprintGoodsList(infolist)if __name__ == '__main__':main()
结果如下所示(共92条,仅显示前20条):
序号 价格商品名称 1790.00 kipling女款背包新款时尚企鹅包书包2169.00 Puma彪马男女包夏季新款高中大学生书包运动双肩包背包0767033229.00 Adidas阿迪达斯背包男包女包新款运动包学生书包双肩包FS83424666.00 国家地理Cordura户外双肩包潮学生书包休闲背包德国杜邦面料防水5279.00 National Geographic国家地理双肩包学生书包时尚旅行情侣背包ins6149.00 鳄鱼男士双肩包商务休闲电脑背包大容量旅行时尚潮流初中学生书包7458.00 backcare小学生书包儿童一二三到六年级男女孩超轻便减负护脊背包8198.00 瑞士军刀双肩包男休闲大容量书包瑞士军士刀男士电脑商务旅行背包9419.00 UNIKER初高中小学生拉杆书包可爬楼梯大轮子30升男女孩儿童拉杆包10318.00 欧洲站男士双肩包时尚潮流真皮背包电脑包休闲旅行大容量书包男包11438.00 荷兰Backcare小学生书包一二三到六年级男孩女儿童减负护脊超轻便12298.00 牛津布双肩包女新款韩版百搭时尚学生书包大容量旅行背包小包1359.00 大容量男士双肩包休闲旅行电脑背包时尚潮流女初中学生书包大学生14289.00 欧洲站双肩包真皮男旅游包时尚男士背包大容量真皮包包学生书包15288.00 欧洲站男士真皮双肩包旅行背包时尚潮流书包韩版商务大容量电脑包1699.00 南极人小学生书包女日本一二三到六年级护脊减负儿童双肩背包轻便17169.00 双肩包男士包包多功能商务17寸电脑包休闲书包大容量出差旅行背包18299.00 BOPAI博牌电脑背包男户外旅行休闲双肩包大学生书包商务功能男包19229.00 牛津大学书包小学生一三到六年级男童减负学生包女护脊儿童二四五2059.00 双肩包男士大容量电脑旅行背包女时尚潮流大学生高中初中学生书包
3、小结
采用requests‐re路线实现了淘宝商品比价定向爬虫,熟练掌握正则表达式在信息提取方面的应用