请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师,运行京东网的爬虫出现错误

我在运行京东网爬虫爬取其他书的信息时,有时会出现下面的错误:图片描述
上网查询后,发现是京东网在title列表中的值是空,因为爬不到东西,所以越界了。
后来我修改了代码,做了一个逻辑运算,当title[0]为空时输出‘无’,有东西时就直接输出,代码如下:
图片描述
可是,结果还是报错:
图片描述
请问老师,我的想法是对的吗?错在哪里了?

老师,我后面发现是京东网的网页源代码有两种,所以有时爬虫运行正常有时又报错:
图片描述
这里class后面的是“p-name”

图片描述
这里class后面又变成了“p-name p-name-type-2”了

怎样做出一个逻辑判断,让在爬取第一个@class="p-name"取不到内容时,自动去爬取@class="p-name p-name-type-2"里面
的内容呢?还是if else判断吗?

正在回答

1回答

你这是两个问题,首先,爬取不到数据,是因为京东网站做了调整,添加了反扒机制。这些网站会更新,会导致我们的爬虫程序也要不断的调整。在请求中添加请求头就可以爬去啦。

resp = requests.get(url, headers={
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6776.400 QQBrowser/10.3.2601.400'
    })


第二个问题,你的条件表达式思路错了。IndexError表示小标越界。从你提供截图中,说明title的长度为0,所以title[0]会报错。

所以你的print代码可以调整为:

print(title[0] if title else '无')


1 回复 有任何疑惑可以回复我~
  • 提问者 慕慕8105830 #1
    老师,我后面发现是京东网网页源代码不同,我修改了下问题,请你再看看
    回复 有任何疑惑可以回复我~ 2019-04-20 10:19:41
  • NavCat 回复 提问者 慕慕8105830 #2
    两种方法都可以的。
    你可以自己使用if  else  进行判断,也可以将xpath进行完善。
    从你的两张截图里面,我们可以得出结论,两个div的class都是以“p-name”开头的,所以xpath可以这样写(给你个参考):
    link = li.xpath('div/div[starts-with(@class,"p-name")]/a/@href')
    回复 有任何疑惑可以回复我~ 2019-04-22 15:22:07
  • 爬虫和反爬虫果然是在不断较量的过程,还是要多像老师学习才行。
    回复 有任何疑惑可以回复我~ 2019-04-25 23:41:19
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信