https://www.taobao.com/
目标:获取淘宝搜索页面的信息,提取其中的商品名称和价格
理解: 淘宝的搜索接口、翻页的处理
技术路线:requests‐bs4‐re
在淘宝中搜索书包:
起始页:
https://s.taobao.com/search?q=%E4%B9%A6%E5%8C%85&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306
第二页:
https://s.taobao.com/search?q=%E4%B9%A6%E5%8C%85&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306&bcoffset=3&ntoffset=3&p4ppushleft=1%2C48&s=44
第三页:
https://s.taobao.com/search?q=%E4%B9%A6%E5%8C%85&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306&bcoffset=0&ntoffset=6&p4ppushleft=1%2C48&s=88
每页44个商品
搜索接口和翻页的URL对应属性
https://s.taobao.com/robots.txt
User‐agent: *
Disallow: /
请注意:这个例子仅探讨技术实现,请不要不加限制的爬取该网站
步骤1:提交商品搜索请求,循环获取页面
步骤2:对于每个页面,提取商品名称和价格信息
步骤3:将信息输出到屏幕上
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=www.taobao.com; lastalitrackid=www.taobao.com; 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 requests
import re
def 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=www.taobao.com; lastalitrackid=www.taobao.com; 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_encoding
return r.text
except:
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 = 0
for g in ilt:
count += 1
print(tplt.format(count, g[0], g[1]))
def main():
goods = '书包'
depth = 2
start_url = 'https://s.taobao.com/search?q=' + goods
infolist = []
for i in range(depth):
try:
url = start_url + '&s=' + str(44 * i)
html = getHTMLText(url)
parsePage(infolist, html)
except:
continue
printGoodsList(infolist)
if __name__ == '__main__':
main()
结果如下所示(共92条,仅显示前20条):
序号 价格 商品名称
1 790.00 kipling女款背包2020年新款时尚企鹅包书包
2 169.00 Puma彪马男女包2020夏季新款高中大学生书包运动双肩包背包076703
3 229.00 Adidas阿迪达斯背包男包女包2020新款运动包学生书包双肩包FS8342
4 666.00 国家地理Cordura户外双肩包潮学生书包休闲背包德国杜邦面料防水
5 279.00 National Geographic国家地理双肩包学生书包时尚旅行情侣背包ins
6 149.00 鳄鱼男士双肩包商务休闲电脑背包大容量旅行时尚潮流初中学生书包
7 458.00 backcare小学生书包儿童一二三到六年级男女孩超轻便减负护脊背包
8 198.00 瑞士军刀双肩包男休闲大容量书包瑞士军士刀男士电脑商务旅行背包
9 419.00 UNIKER初高中小学生拉杆书包可爬楼梯大轮子30升男女孩儿童拉杆包
10 318.00 欧洲站男士双肩包时尚潮流真皮背包电脑包休闲旅行大容量书包男包
11 438.00 荷兰Backcare小学生书包一二三到六年级男孩女儿童减负护脊超轻便
12 298.00 牛津布双肩包女2020新款韩版百搭时尚学生书包大容量旅行背包小包
13 59.00 大容量男士双肩包休闲旅行电脑背包时尚潮流女初中学生书包大学生
14 289.00 欧洲站双肩包真皮男旅游包时尚男士背包大容量真皮包包学生书包
15 288.00 欧洲站男士真皮双肩包旅行背包时尚潮流书包韩版商务大容量电脑包
16 99.00 南极人小学生书包女日本一二三到六年级护脊减负儿童双肩背包轻便
17 169.00 双肩包男士包包多功能商务17寸电脑包休闲书包大容量出差旅行背包
18 299.00 BOPAI博牌电脑背包男户外旅行休闲双肩包大学生书包商务功能男包
19 229.00 牛津大学书包小学生一三到六年级男童减负学生包女护脊儿童二四五
20 59.00 双肩包男士大容量电脑旅行背包女时尚潮流大学生高中初中学生书包
采用requests‐re路线实现了淘宝商品比价定向爬虫,熟练掌握正则表达式在信息提取方面的应用