Python爬取淘宝商品信息进行比价,运行无错但只有表头没有商品信息怎么回事
"""淘宝商品定向比价"""import requests
import re
def getHTMLText(url):
try:
kv={'user-agent':'Mozilla/5.0'}
r=requests.get(url,headers=kv,timeout=30)
r.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except:
return ""
def parsePage(ilt,html): #对每一个页面进行解析
try:
plt=re.findall(r'\"view_price\"\:\"[\d.]*\"',html)#正则表达式将view_price和后面的价格\d.表示出来
tlt=re.findall(r'\"raw_title\"\:\".*?\"',html)#*?表示最小匹配,匹配的是"raw_title"为键,""为值的键值对,最小匹配表明她只取得最后一个双引号为止得内容,进行约束
for i in range(len(plt)):
price=eval(plt.split(':'))
#对price类型进行提取,去掉前面得view_price字段,只保留价格部分,这里的eval函数可以将我们获得的字符串的最外面的”“去掉,用split来进行分割
title=eval(tlt.split(':'))
ilt.append()
except:
print("")
def printGoodsList(ilt):
#定义一个tplt模板,表示我们希望我们获取的信息以怎样的方式打印出来,用{}来指定第一个位置长度为4,第二个为8
tplt="{:4}\t{:8}\t{:16}"
print(tplt.format("序号","价格","商品名称"))
count=0 #定义一个输出信息的计数器count
for g in ilt:
count=count+1
print(tplt.format(count,g,g)) #count商品序号,gg为名称和价格
def main():
goods='书包'
depth=2#设定爬取深度为2,就是爬取当前页面和第2页
start_url='https://s.taobao.com/search?q=' + goods#通过将url与goods结合实现对商品的检索
infoList=[]
for i in range(depth):
try:
url=start_url + '&s=' +str(44*i)
#这里的44*i是指对每一个页面,地址后面的有一个变量s是44的倍数
html=getHTMLText(url)
parsePage(infoList,html)
except:
continue
#这里用try-except来进行异常处理,如果访问第一个页面有问题,跳转到下一页
printGoodsList(infoList)
main()
运行结果:
序号 价格 商品名称
Process finished with exit code 0
我跟着北理工一个老师的教学视频写的此代码,但是我却爬取不到商品信息,是哪里出了问题呢?求助大神! 请问是不是现在淘宝进行了信息保护,我这种方法已经爬取不到了?还是我代码有问题呢? 冲动小郭 发表于 2020-4-5 22:08
请问是不是现在淘宝进行了信息保护,我这种方法已经爬取不到了?还是我代码有问题呢?
我之前也写过,淘宝加了反爬策略。
我是用了cookie来绕过。你加上cookie试试。
但是每次都加比较麻烦,所以推荐先post登录信息,得到cookie,然后再进行爬取。 prophet-1 发表于 2020-4-5 22:41
我之前也写过,淘宝加了反爬策略。
我是用了cookie来绕过。你加上cookie试试。
但是每次都加比较麻烦, ...
原来是这样,感谢您的提示。那看来我还需要再了解一下有关您提到的内容再进行完善代码了,我是最近才刚开始接触python爬虫,很多东西还了解的不多。您能写一下有关您提到部分的代码吗?方便我学习一下。万分感谢! prophet-1 发表于 2020-4-5 22:41
我之前也写过,淘宝加了反爬策略。
我是用了cookie来绕过。你加上cookie试试。
但是每次都加比较麻烦, ...
我查询到了相关的文章,感谢您的回复了!不需要您写代码提示了,嘿嘿。:D 冲动小郭 发表于 2020-4-5 23:00
原来是这样,感谢您的提示。那看来我还需要再了解一下有关您提到的内容再进行完善代码了,我是最近才刚开 ...
def getHTMLText(url):
cookie = ''#你淘宝的cookie
try:
kv={'user-agent':'Mozilla/5.0','Cookie': cookie}
r=requests.get(url,headers=kv,timeout=30)
r.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except:
return ""
这是手动添加cookie。因为当时临时使用的,所以没有写自动获取cookie的代码。
明天我写个demo给你。 def getHTMLText(url):
try:
kv={'user-agent':'Mozilla/5.0'}
post_url="https://login.taobao.com/member/login.jhtml?from=taobaoindex&f=top&style=&sub=true&redirect_url=https%3A%2F%2Fi.taobao.com%2Fmy_taobao.htm%3Fspm%3Da230r.1.1997525045.1.16f52cd4t3S4VE"
userdate={'username':'','password':''}
post_res=requests.post(post_url,userdata)
#cookie
print(post_res.cookies)
print(post_res.cookies.get_dict())
r=requests.get(url,headers=kv,timeout=30)
r.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except:
return ""
我添加了post和cookies可还是运行不出来,请问是哪里的问题呢?(代码里的用户名和密码我在运行的时候都有填写,在这里删除了) prophet-1 发表于 2020-4-5 23:06
这是手动添加cookie。因为当时临时使用的,所以没有写自动获取cookie的代码。
明天我写个demo给你。
好的!谢谢你!:D 冲动小郭 发表于 2020-4-5 23:20
好的!谢谢你!:D
我测试了一下,只需要得到一次cookie就行了,之后可以一直使用。
我一年前的cookie都还可以使用,并且能得到数据。:)
所以直接添加cookie就行。 prophet-1 发表于 2020-4-5 23:36
我测试了一下,只需要得到一次cookie就行了,之后可以一直使用。
我一年前的cookie都还可以使用,并且能 ...
我从csdn上找到一个文章,按着它的样子,修改了这段代码,运行成功了。可是我不太明白它代码中'coo='这一部分的内容的含义以及这个是怎么得来的,想请教一下您{:10_266:}。
[code
]def getHTMLText(url):
try:
kv={'user-agent':'Mozilla/5.0'}
#cookie
coo = 't=85db5e7cb0133f23f29f98c7d6955615; cna=3uklFEhvXUoCAd9H6ovaVLTG; isg=BM3NGT0Oqmp6Mg4qfcGPnvDY3-pNqzF2joji8w9SGWTYBu241_taTS6UdFrF3Rk0; miid=983575671563913813; thw=cn; um=535523100CBE37C36EEFF761CFAC96BC4CD04CD48E6631C3112393F438E181DF6B34171FDA66B2C2CD43AD3E795C914C34A100CE538767508DAD6914FD9E61CE; _cc_=W5iHLLyFfA%3D%3D; tg=0; enc=oRI1V9aX5p%2BnPbULesXvnR%2BUwIh9CHIuErw0qljnmbKe0Ecu1Gxwa4C4%2FzONeGVH9StU4Isw64KTx9EHQEhI2g%3D%3D; hng=CN%7Czh-CN%7CCNY%7C156; mt=ci=0_0; hibext_instdsigdipv2=1; JSESSIONID=EC33B48CDDBA7F11577AA9FEB44F0DF3'
cookies = {}
for line in coo.split(';'):# 浏览器伪装
name, value = line.strip().split('=', 1)
#split('.',1)代表按某一个字符分割,且分割n次
#s.strip(rm)删除s字符串中开头结尾处位于rm删除序列的字符,当rm为空时,默认删除空白符(包括\n,\r,\t)
cookies = value
r=requests.get(url,headers=kv,cookies=cookies,timeout=30)
r.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except:
return ""
prophet-1 发表于 2020-4-5 23:36
我测试了一下,只需要得到一次cookie就行了,之后可以一直使用。
我一年前的cookie都还可以使用,并且能 ...
我找不到我的cookie...我去浏览器里开发者工具里,network找不到对应的网页响应。
C:\Users\Guo\Desktop\1.png
冲动小郭 发表于 2020-4-6 16:37
我从csdn上找到一个文章,按着它的样子,修改了这段代码,运行成功了。可是我不太明白它代码中'coo='这一 ...
coo就是cookie。这个是,你登录淘宝后,给你的一个凭证,之后就不用再进行登录了(有的cookie具有时效)。
获得的方法:
登录你的淘宝,然后F12,点击控制台。
输入:document.cookie
输出的就是cookie。
其实不需要他这么麻烦,直接在kv中添加Cookie就行。
kv={'user-agent':'Mozilla/5.0','Cookie': coo}
r = requests.get(url,headers=kv) 冲动小郭 发表于 2020-4-6 17:09
我找不到我的cookie...我去浏览器里开发者工具里,network找不到对应的网页响应。
我找到了!刷新了几下。。做这个例子没有运行成功反而让我学到了很多之前不知道的内容,很感激你的回复。
祝好!!!{:7_112:} 冲动小郭 发表于 2020-4-6 16:37
我从csdn上找到一个文章,按着它的样子,修改了这段代码,运行成功了。可是我不太明白它代码中'coo='这一 ...
我成功找到我的cookie并且运行了。 冲动小郭 发表于 2020-4-6 17:26
我成功找到我的cookie并且运行了。
:)加油!:) prophet-1 发表于 2020-4-6 17:13
coo就是cookie。这个是,你登录淘宝后,给你的一个凭证,之后就不用再进行登录了(有的cookie具有时效) ...
嗯嗯,我百度了半天也是这样成功找到的。
最后也是修改代码简化按你的这个运行成功啦!!!
我继续探索更多未知的python世界了!感谢你哦!!{:7_112:}
页:
[1]