scrapy爬虫返回[ ]并且代码完全正确

scrapy爬虫返回[ ]并且代码完全正确

注意:经过大量经验补充?这种情况一半以上就是因为路径没有写对,也就是选择里面的路径代码有问题。因此在看我这篇文章之前请在三看几次是否代码无误!!!!!

第一种情况,也是我面对的:

此时应该是相关IDE出现问题,比如我的:
终端命令scrapy crawl name运行:
在这里插入图片描述
点击右上角快捷符号运行:
在这里插入图片描述
结果都不一样,因此推荐大家使用终端,并且可以重新尝试几次。

另外可能的原因:

  1. ip封锁爬取
  2. xpath路径不对
  3. xpath路径出现font,tbody标签
  4. xpath路径不够明确
  5. robot协议
  6. 请求头封锁

废话不多说,直接上图
在这里插入图片描述
1,在dos窗口,输入 scrapy shell https://news.sina.com.cn/gov/xlxw/2019-07-12/doc-ihytcerm3070493.shtml 回车 (注意这里是你的网址)
在这里插入图片描述
2,观察上图1号位置,response的返回状态码是200(200~300间都可以),说明返回成功!执行2号位置的 view(response) 就可以进入你要爬取的网页了,这说明了你要爬取的网页没有在IP上对你进行反爬

http状态码200,300,404等是什么意思?可以参考以下网址
https://www.cnblogs.com/cjwxf/p/6186287.html

3,3号位置我执行 response.xpath(’/html/body/div[3]/h1/text()’).extract()
这里的xpath路径是我在网页源代码中copy来的,我要显示他的文本内容,它返回了一个空值,这告诉我copy的东西不一定是有用的,当然正常情况下是有用的,建议xpath路径自己写,不断测试,copy的xpath路径仅做内容可以爬取的检测

4,之前有碰到过在xpath路径中有font或者是tbody标签的,把它去掉之后内容可以正常显示,说明scrapy识别不了这两个标签

5,4号位置的xpath路径是自己写的,观察你要爬取网页html结构,对要爬取的元素位置,最好把它的类名或者是id名写上,以保证路径的唯一性

6,如果在dos窗口中已经可以提取出要爬取的内容了,说明xpath路径正确,但是在编写的爬虫文件中,执行spider却不能爬取到结果,而在执行爬虫程序的dos窗口中,你仔细观察,发现有robot错误,response的返回编码是503之类的异常编码,那就需要你在setting.py中,
ROBOTSTXT_OBEY = True改为 ROBOTSTXT_OBEY = False

7,请求头封锁:比如你执行scrapy shell https://www.qiushibaike.com/
这个网址在浏览器中可以打开,但是scrapy中不行,执行后出现下图连接错误
在这里插入图片描述
这是因为scrapy的默认请求头是:

“User-Agent”:“Scrapy/1.1.2 (+http://scrapy.org)”

被网站封锁了,所以你需要伪造一个网站的请求头去进入这个网站
你执行

scrapy shell https://www.qiushibaike.com/ -s USER_AGENT=‘Mozilla/5.0’

神奇的发现,可以成功访问这个网站了,所以在编写爬虫文件时,记得伪造请求头

最后一种情况:

摘自 scrapy 官方文档

在处理爬虫项目时,完全去掉命名空间而仅仅处理元素名字,写更多简单/实用的XPath会方便很多。你可以为此使用 Selector.remove_namespaces() 方法。

以Github博客的atom订阅来解释这个情况。

首先,我们使用想爬取的url来打开shell:

$ scrapy shell https://github.com/blog.atom

一旦进入shell,我们可以尝试选择所有的 对象,可以看到没有结果(因为Atom XML命名空间混淆了这些节点):

 response.xpath("//link")
[]
但一旦我们调用 Selector.remove_namespaces() 方法,所有的节点都可以直接通过他们的名字来访问:

 response.selector.remove_namespaces()
 response.xpath("//link")
[<Selector xpath='//link' data=u'<link xmlns="http://www.w3.org/2005/Atom'>,
 <Selector xpath='//link' data=u'<link xmlns="http://www.w3.org/2005/Atom'>,

如果你对为什么命名空间移除操作并不总是被调用,而需要手动调用有疑惑。这是因为存在如下两个原因,按照相关顺序如下:

  1. 移除命名空间需要迭代并修改文件的所有节点,而这对于Scrapy爬取的所有文档操作需要一定的性能消耗
  2. 会存在这样的情况,确实需要使用命名空间,但有些元素的名字与命名空间冲突。尽管这些情况非常少见。

参考:https://blog.csdn.net/wangwentao_v/article/details/84317265

参考:https://blog.csdn.net/weixin_44841312/article/details/95670015

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值