爬虫技巧

来源:互联网 发布:sql查询多表相同列名 编辑:程序博客网 时间:2024/06/05 17:44

你就老实的用Requests、用BeautifulSoup4、用lxml、用正则表达式、用多线程、用异步、用分布式
如果你需要的话、用代理设计代理策略、自己设计抓取策略。然后突然有一天你上手了Scrapy框架,你感觉发现了新大陆,渐渐的你不满足于Scrapy的速度,你开始读它的源码,你发现它的策略有不足之处,你竟然能改造这个框架了。


1 限制ip
用requests代理,买代理,或者网上免费代理
2 伪装成浏览器
requests切换user agent
3 先登录,保存cookies
requests用session先post拿到cookies,再爬
4 URL参数太多,不明白什么意思
webdriver和phantomjs
5 JavaScript和ajax问题
浏览器f12分析请求规律,直接requests请求。
或者用webdriver和phantomjs,如果用scrapy的话,用scrapyjs
6 爬的太慢
多线程,别说gil,一般是网络io慢,cpu等io
7 还是慢
scrapy异步(做过几个项目了,挺好用的),pyspider(这个支持Python3)
8 还是慢
分布式(暂时还没涉及),redis,scrapyd
9 验证码
对不起,帮不了你。简单的可以pil,灰度二值化切割识别
10 如果你想自己实现异步请求的话
grequests不错


个人建议还是先使用scrapy快速上手写几个爬虫出来,再学习使用requests+bs4自己写爬虫。

原因如下:
1、学习一个新东西,首先是先用起来,然后在使用中发现问题,再究其原理,才能深入学习;
2、scrapy不管是否支持python3,如果想学习爬虫原理,都无碍的,因为学习思想最重要;
3、scrapy封装了爬虫的一些核心组件,而且上手简单,如果想以后自己写爬虫框架,它的实现思路还是很值得借鉴的;

等你用scrapy写出几个爬虫抓几个网站后,这基本算是入门了。

等你要抓的网站非常多时,就会遇到几个问题:

1、一些网站开始防抓,IP被封?
随机User-Agent,随机代理,开始用到scrapy的插件。

2、网页太多,抓的太慢,scrapy默认是不支持分布式的,怎么实现分布式?
一些分布式的插件就会用起来,例如scrapy-redis。

3、网页越来越多,会不会抓重复?
哦,原来不会重复抓。看一看scrapy源码,基于url指纹过滤重复的。啊,过滤规则自己可以替换,不错!

4、网站如何深度抓取,如何广度抓取?
看一看scrapy源码,哦,原来通过实现了栈和队列改变任务的入队顺序,结合配置来控制。

如果你有足够的兴趣和耐心,有没有发现,从开始使用它,慢慢地你开始关注scrapy的是如何实现了,继续深入源码,你就会发现它的实现思想很巧妙,代码结构低耦合插件威力巨大!

好了,下一步你就可以构建自己的爬虫框架了。

为什么要自己写?

1、觉得scrapy很多功能用不到?自己喜欢造轮子?
理解了它的原理,自己精简写一个,还不容易?

2、觉得scrapy的一些功能没有实现?
例如,如何实现增量抓取?如何基于数据库的任务调度和数据存储?如何分布式抓取?如何做可视化监控?

3、平时很常用的scrapy插件,太多,太散?
自己封装常用插件、形成组件化,快速配置。

其实这每一步都是学习、思考、再学习的过程,从使用框架、学习框架、到自己写框架,并不是那么难。

我当初就是以这样一个思路学习爬虫,深入爬虫的。

附上自己的当初(一年前)学习scrapy源码时,抽离和精简出的scrapy架构,并且用gevent替换了twisted,自己实现了一套简版的mini-scrapy,仅供学习使用。

github地址:github.com/kaito-kidd/m
注:不更新,仅供学习使用。
编辑于 2016-10-28
419 条评论
分享
收藏感谢收起

Scrapy源码分析(一)架构概览

原创粉丝点击