016:Scrapy使用中必须得会的问题

2021-11-22 18:45:07 浏览数 (1)

Scrapy 的优缺点?

(1)优点:scrapy 是异步的

采取可读性更强的 xpath 代替正则强大的统计和 log 系统,同时在不同的 url 上爬行支持 shell 方式,方便独立调试写 middleware,方便写一些统一的过滤器,通过管道的方式存入数据库

(2)缺点:基于 python 的爬虫框架,扩展性比较差

基于 twisted 框架,运行中的 exception 是不会干掉 reactor,并且异步框架出错后是不会停掉其他任务的,数据出错后难以察觉。

那简单介绍下 scrapy 的异步处理?

scrapy 框架的异步机制是基于 twisted 异步网络框架处理的,在 settings.py 文件里可以设置具体的并发量数值(默认是并发量 16)。

scrapy去重原理

对于每一个url的请求,调度器都会根据请求得相关信息加密(request_fingerprint)得到一个指纹信息,并且将指纹信息和set()集合中的指纹信息进行比对,如果set()集合中已经存在这个数据,就不在将这个Request放入队列中。如果set()集合中没有存在这个加密后的数据,就将这个Request对象放入队列中,等待被调度。

这里两个条件控制:

首先是dont_filte如果是 False、是要筛选的。

然后request_seen()在默认内置的筛选方法中,就是 RFPDupeFilter()中的方法,检查 request 是否已经存在。只有要筛选且没有见过这个 request,才会去筛选 url。

scrapy-redis去重和scrapy默认的去重一致

区别在于:

去执行scrapy_redis中的 scheduler.py 中的enqueue_request()

scrapy是深度优先还是广度优先的,要怎么自定义:

scrapy使用的是后进先出队列,基本可以看成是深度优先。

如果需要设置广度优先(BFO),可以在settings中添加以下代码。另外当DEPTH_PRIORITY为正值时越靠广度优先,负值则越靠深度优先,默认值为0

settings中设置方法:

DEPTH_PRIORITY = 1

SCHEDULER_DISK_QUEUE = ‘scrapy.squeues.PickleFifoDiskQueue’

SCHEDULER_MEMORY_QUEUE = ‘scrapy.squeues.FifoMemoryQueue’

全链接爬取时如何记录已经访问过的url:

已知服务器信息时,如何过滤存在别名的url地址:

所以要规范化url:

如何避免在动态虚拟web空间的循环和重复?

规范化url、 广度优先爬行策略、 节流、 限制url的大小、

设置站点黑名单、 模式检测、 内容指纹、 人工监视、

详情可看博客:https://blog.csdn.net/weixin_43582101/article/details/89431997

scrapy爬取深度设置(url的深度)

通过在settings.py中设置DEPTH_LIMIT的值可以限制爬取深度,这个深度是与start_urls中定义url的相对值。也就是相对 url的深度。

scrapy随机切换用户代理User-Agent

自定义一个Downloader Middleware,可以做到每次请求时,拦截一下,给请求头自动随机更换User-Agent。我们使用fake-useragent这个开源库。

scrapy随机更换代理ip策略

下载中间件中process_request方法里设置:request.meta‘proxy’ = proxy‘host’

然后在settings中进行配置Downloader Middleware

scrapy框架利用start_requests方法改写post请求

scrapy默认发起的是get请求。我们必须重写start_request方法。改变里面的url,

method改变为POST,callback为self.parse_post,构建parse_post方法。

scrapy如何实现大文件的下载?

当使用requests的get下载大文件/数据时,建议使用使用stream模式。

当把get函数的stream参数设置成False时,它会立即开始下载文件并放到内存中,如果文件过大,有可能导致内存不足。

当把get函数的stream参数设置成True时,它不会立即开始下载,当你使用iter_content或iter_lines遍历内容或访问内容属性时才开始下载。需要注意一点:文件没有下载之前,它也需要保持连接。

iter_content:一块一块的遍历要下载的内容

iter_lines:一行一行的遍历要下载的内容

使用上面两个函数下载大文件可以防止占用过多的内存,因为每次只下载小部分数据。

将所有item 转存(dump)到 JSON/CSV/XML 文件的最简单的方法?

dump 到 JSON 文件:

scrapy crawl myspider -o items.json

dump 到 CSV 文件:

scrapy crawl myspider -o items.csv

dump 到 XML 文件:

scrapy crawl myspider -o items.xml

你遇到验证码是如何处理:

1.登陆验证码处理:

图片验证码:先将验证码图片下载到本地,然后使用云打码识别;

滑动验证码:使用selenium模拟人工拖动,对比验证图片的像素差异,找到滑动的位置然后获取它的location和size,然后 top,bottom,left,right = location‘y’ ,location‘y’ size‘height’ location‘x’ size‘width’ ,然后截图,最后抠图填入这四个位置就行。

2.爬取速度过快出现的验证码处理

设置setting.py中的DOWNLOAD_DELAY,降低爬取速度;

用xpath获取验证码关键字,当出现验证码时,识别验证码后再继续运行。

如何处理网站传参加密的情况:

加密的三种情况:

1、加密 访问次数限制 每个页面相关信息的条目需要点详情进行二次请求;

2、复杂的加密算法进行参数 时间戳 sig值,后台进行 参数 时间限制;

3、定时同步cookie 每个界面一个cookie。

破解方法:

1、使用selenium模拟点击获取详情页面;

2、获取其相应的api接口,GET接口URL,获取它的json表格内容;

3、反向分析网页JS加载内容;

0 人点赞