在工做中,已经陆陆续续使用爬虫作需求将近半年时间了,在这半年时间里,从一个python小白到爬虫入门,再至功能实现。从上午PHP到下午Python忙的焦头烂额到如今的PHP/Python随心切换,其中的曲折不言而喻,也着实走了很多弯路。但好在功夫不负有心人,在半年的时光里,使用Python的同时也和它一块儿成长。现在总结一下,但愿能够帮助到有须要的同窗。html
以前也有写过几篇Python和Scrapy的笔记,传送门:python
从最开始接触爬虫,首先最须要了解的就是python的环境搭建、语法及特性,网络上有不少相关的教程,如下列举几个我在学习过程当中使用到的教程,对于Python的快速入门都能起到很大的做用git
等到Python的基础语法了解的差很少的时候,就能够开始着手学习python相关的爬虫框架了。Python的爬虫框架,其中比较著名的就是Scrapy框架了。主要是了解Scrapy框架的运行原理,以及学习如何使用它。经过阅读文档、博文、观看视频来学习Scrapy,下面我贴出几个我在学习过程当中看到的几篇比较好的Scrapy博客以及视频github
除了上面介绍的学习连接以外,github上也有一些比较完善的Python以及Scrapy项目,能够尝试着理解一下。正则表达式
XPath 用于在 XML 文档中经过元素和属性进行导航。换句话来讲可使用Xpath定位页面上的元素位置,获取元素内容。我编写的爬虫代码几乎都是采用Xpath来获取页面内容的。因此,学习Xpath也是颇有必要的。redis
Xpath就像Javascript的Dom同样,能够根据id、class等来定位到指定元素所在的位置,并获取到相应的内容,比较常见的使用方式我简单列举一二算法
/
下一级元素//
子元素.
当前节点get
获取单个值getall
获取全部值具体能够参考W3school上的Xpath教程,里面介绍的很详细了。shell
爬虫天然离不开正则了,须要用到正则获取到字符串中指定内容的场景不少不少。若是不会正则或者对正则不熟,那么就会直接影响到工做效率(固然不熟也能够请教同事,可是本身动手丰衣足食嘛)。我就吃了对正则不熟的亏,正好儿学习爬虫须要使用到正则,借这个机会,好好对正则从新认识学习一遍。数据库
至于文档,能够直接参考菜鸟教程正则表达式api
学习完Python、Scrapy、Xpath的使用方法以后,就能够本身尝试动手开发一个小爬虫了。我最开始是尝试着写了一个爬取简书全站文章的小爬虫,测试是能爬取到数据的,只不过在爬取比较多的数据以后,会出现一些问题(这些问题在下面会提到)。贴一个爬取我本身网站全部文章的爬虫项目Python Scrapy demo,代码写的很简单,就是翻页爬取我博客中全部的文章标题及内容。小白应该也能够很好理解
上面说到在爬取简书全站文章的时候,爬取数据超过必定量的时候,就会出现一些问题。主要就是被禁止爬取了,缘由是我在同一时间大量的爬取了简书的文章,因此个人IP短暂的被列入了简书的黑名单,因此致使我爬取不到数据。过一下子就能够了,可是再次爬取直到IP被封,中间爬取到的数据量又比第一次少不少。这就是简书的反爬机制了。
关于反爬以及反反爬,我以前也写过文章:Python爬虫研究,里面列举了反爬常见的套路,以及反反爬虫应对策略,里面内容是我在了解爬虫一段时间后,作的一个总结。可能理解的也不太深入,能够做为了解。
对于代理IP这一块要单独摘出来讲,由于爬虫项目确定须要依赖不少IP来完成任务的,否则一个IP被网站封掉了,那业务不就停了,这样的状况是不容许的。因此就须要为咱们的爬虫创建代理IP池,把能用、质量良好的IP存储起来,在IP被封掉的时候,切换一个正常的IP做为代理访问。
如何搭建代理IP池,网上也有不少方案,因为这种方案的IP质量不是很好,因此我就没有去尝试。本身想玩一玩的能够根据网上的IP代理池方案本身搭建一个IP池。差很少就是去公开的IP代理网站,爬取到全部的IP,保存在本身的IP代理池(能够是数据库或者Redis)中,而后写一个脚本按期去监测这些IP是否正常,若是正常就放在代理池,不然则从代理池中剔除。
经常使用的IP代理商,好比快代理,它支持购买必定数量的代理IP。切换一个IP,可使用的IP数量就减小一个。测试以后,发现IP质量都还蛮高。可是这种有数量限制的不太知足咱们的业务需求。
也可使用一些隧道连接方式的IP代理商,就是IP不限量,统一用隧道的方式去访问,代理商转发你的请求。这种代理商好比小象代理。可是小象代理的IP着实通常,也多是因为咱们业务的特殊性,小象的IP对咱们有用的很少。
最后面咱们使用的是ScripingHub,使用Crawlera来提供代理服务。这种代理质量出奇的高,也很稳定。由于是国外代理,预算比较充足的能够采用这类代理商。(一个月大概$349)
验证码是反爬处理中最多见的方法之一了,最开始遇到这种状况的时候,也是绞尽脑汁的去想如何破解验证码。了解到目前成熟的也就OCR技术了,可是这个用起来特别繁琐,并且失败率也挺高,就算验证码破解了,可是后面的请求依旧还会出现验证码,OCR算法识别验证码也挺耗时,会致使爬取效率下降。
既然不能高效的破解验证码,那有什么其余办法吗?答案确定是有的,在后面采起的办法就简单有效多了,在请求中间件类中判断页面是不是验证码页面,若是是,直接换过一个代理IP请求。使用Crawlera的话,就再发起一次请求就好。
破解验证码,耗时费力。换IP简单高效,推荐。
Scrapy Redis用于构建分布式爬虫。至关于把须要爬取的连接存储在Redis队列中,能够在不一样服务器中开启多个爬虫脚本,消费Redis队列,达到分布式爬取的目的。
切换到Scrapy Redis也很简单,spider类继承RedisSpider,爬虫类中增长redis_key,指定队列名称。去除start_url。配置文件中增长Scrapy Redis的一些必要配置以及Redis的链接信息便可
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" SCHEDULER = "scrapy_redis.scheduler.Scheduler" SCHEDULER_PERSIST = True REDIS_HOST = REDIS_PORT = REDIS_PARAMS = { 'db': '', 'password': }
文档参考:Scrapy-Redis入门实战
crawlera是一个利用代理IP地址池来作分布式下载的第三方平台。咱们线上业务一直在使用这个代理,很是的稳定,几乎不会出现被屏蔽或者访问失败的状况。就是价格有点小贵
Xpath Helper是一个浏览器的小插件,方便咱们直接在网页上输入Xpath表达式,来验证咱们写的表达式是否正则。
scrapy shell也是scrapy提供的调试工具之一了。它能够方便的在命令行打开咱们指定的网页,而后输入相应的代码来调试页面内容。
以上差很少就是本篇文章的所有内容了,概括总结了初学Python爬虫的学习路径、实战进阶和一些能够提升工做效率的小技巧,固然在实际的工做运用中,须要了解到的知识要比这些多得多,要想玩转它,必定要不断的去学习、去摸索、去尝试。
使用到如今也只是冰山一角,后面还有更多东西须要去学习。
共勉。