Scrapy框架之细数到目前为止我遇到的坑

本篇博客会在我学习Scrapy的途中不断更新,记录大大小小的我遇到的坑。直接正题。


问1:Python3.7版本使用Scrapy Shell遇到invalid syntax
答1:如果出现SyntaxError:invalid syntax,在“ from twisted.conch import manhole ”而且提示符 ‘^’ 指向async,那么很有可能是因为你的版本是Python3.7,这个版本把async变成了关键字,这个时候就需要自己动手去找到并打开 manhole.py (在错误信息里面找)这个文件,然后找到(CTRL+F)所有 “async” 关键字并修改成关键字无关的标识符如“async_” 。

问2:Scrapy爬虫提示 list index out of range
答2:extract()返回信息列表,extract()[0]显示 index out of range 错误信息,将extract()[0]换成extract_first()即可。

问3:Scrapy爬取URL在cmd中显示url编码
答3:cmd默认使用的gbk编码,在项目的py文件中使用urllib.parse.unquote()函数将url编码转化为gbk编码。该函数的输出是对应中文在gbk下的编码。


这里插着写一下windows控制台cmd乱码的解决方法(与本篇博客无关)

有时在cmd中输出的中文乱码,解决办法如下:

在cmd中输入 CHCP 65001
CHCP是一个计算机指令,能够显示或设置活动代码页编号。
          

代码页 描述
65001 UTF-8
950 繁体中文
936 中国 - 简体中文(GB2312)
437 MS-DOS 美国英语

问4:DEBUG: Filtered offsite request to…
答4:输出crawl命令后显示 [scrapy.spidermiddlewares.offsite] DEBUG: Filtered offsite request to ‘http://jcoffeezph.top,原来是二次解析的域名被过滤掉了。解决办法yield scrapy.Request(url=detail_url, meta={‘item’: item}, callback=self.parse_info, dont_filter=True),原理是忽略allowed_domains的过滤。如果需要多次提交表单,且url一样,那么就必须加此参数dont_filter,防止被当成重复网页过滤掉。

这篇链接对于此问题的解释也很清楚:https://www.jianshu.com/p/c31e53fd45f6

问5:Scrapy 爬取顺序每次都不一样
答5:异步处理请求,也就是说Scrapy发送请求之后,不会等待这个请求的响应(也就是不会阻塞),而是可以同时发送其他请求或者做别的事情。而我们知道服务器对于请求的响应是由很多方面的因素影响的,如网络速度、解析速度、资源抢占等等,其响应的顺序是难以预测的。

Scrapy异步的根源,在于它依赖于Twisted框架。Twisted框架是一个Python的event-driven的框架,这里你可以理解为是异步I/O的。

问6:数组的索引值是从0开始的,Xpath的元素值是从几开始的
答6:1

问7:json.dumps的参数ensure_ascii=False:
答7:在使用json.dumps时要注意一个问题

1
2
3
4
5
6
>>> import json
>>> print json.dumps('中国')

输出:"\u4e2d\u56fd"
输出的会是
'中国' 中的ascii 字符码,而不是真正的中文。

因为json.dumps 序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False;

问8:中文保存到json文件中产生乱码
答8:通过str.encode转换为’UTF-8’编码,因为str.encode返回值是一个bytes对象,因此打开文件的方式要写成 ‘wb’ 。
也可以通过在settings.py中添加如下代码:

FEED_EXPORT_ENCODING = ‘UTF-8’

问9:Scrapy爬取图片报错:raise ValueError(‘Missing scheme in request url: %s’ % self._url)
答9:items.py定义的image_urls属性需要在spider.py中爬取时赋值为列表,以便在下载管道中进行迭代下载。

问10:Scrapy爬取图片报错:’NoneType’ object is not subscriptable
答10:可能是管道下载获取图片URL时碰到了一些无法获取到的图片,例如本地图片等等…

问11:爬取豆瓣时scrapy crawl spider报错403
答11:这是因为豆瓣有反爬机质,需要加上scrapy crawl spider -s USER_AGENT=”Mozilla/5.0”

问12:xpath如何获取当前节点的兄弟标签
答12:

  • 获取第三个a标签的下一个a标签:”/following-sibling::a[1]”
  • 获取第三个a标签后面的第N个标签:”/following-sibling::*[N]”
  • 获取第三个a标签的上一个a标签:”/preceding-sibling::a[1]”
  • 获取第三个a标签的前面的第N个标签:”/preceding-sibling::*[N]”
  • 获取第三个a标签的父标签:”/..”