在工作中,曾经陆陆续续应用爬虫做需要将近半年工夫了,在这半年工夫里,从一个python小白到爬虫入门,再至性能实现。从上午PHP到下午Python忙的焦头烂额到当初的PHP/Python随心切换,其中的波折显而易见,也着实走了不少弯路。但好在功夫不负有心人,在半年的时光里,应用Python的同时也和它一起成长。现在总结一下,心愿能够帮忙到有须要的同学。
之前也有写过几篇Python和Scrapy的笔记,传送门:
- Python学习笔记(根底)
- Python学习笔记(罕用扩大)
- Python爬虫钻研
- Python scrapy框架学习笔记及简略实战
- Python如何爬取动静网站?
python
从最开始接触爬虫,首先最须要理解的就是python的环境搭建、语法及个性,网络上有很多相干的教程,以下列举几个我在学习过程中应用到的教程,对于Python的疾速入门都能起到很大的作用
- 廖雪峰老师的Python教程,最先就是在这里开启Python之旅的。一边看文章学习一边跟着写写demo
- 菜鸟教程里的Python基础教程也能够作为疾速学习应用
- Python3文档,在遗记一些函数的时候能够很疾速的找到
爬虫框架
等到Python的根底语法理解的差不多的时候,就能够开始着手学习python相干的爬虫框架了。Python的爬虫框架,其中比拟驰名的就是Scrapy框架了。次要是理解Scrapy框架的运行原理,以及学习如何应用它。通过浏览文档、博文、观看视频来学习Scrapy,上面我贴出几个我在学习过程中看到的几篇比拟好的Scrapy博客以及视频
- Python scrapy框架学习笔记及简略实战–这篇是我本人的总结博文
- Scrapy的官网文档(英文版)
- Scrapy文档(中文版)英文不太好的同学,能够理解一下,但外面的翻译一言难尽
- B站Scrapy视频(1)视频工夫不长,但对于理解Scrapy入门曾经足够了
- B站Scrapy视频(2)外面也有蕴含Scrapy的学习解说
- B站Scrapy视频(3)最开始是跟着这个视频学习Scrapy的,外面的讲师讲的也很好。然而我在写这篇文章的时候,发现原视频曾经不见了,有须要理解的能够分割UP主
除了下面介绍的学习链接之外,github上也有一些比较完善的Python以及Scrapy我的项目,能够尝试着了解一下。
Xpath
XPath 用于在 XML 文档中通过元素和属性进行导航。换句话来说能够应用Xpath定位页面上的元素地位,获取元素内容。我编写的爬虫代码简直都是采纳Xpath来获取页面内容的。所以,学习Xpath也是很有必要的。
Xpath就像Javascript的Dom一样,能够依据id、class等来定位到指定元素所在的地位,并获取到相应的内容,比拟常见的应用形式我简略列举一二
/
下一级元素//
子元素.
以后节点get
获取单个值getall
获取所有值
具体能够参考W3school上的Xpath教程,外面介绍的很具体了。
正则
爬虫天然离不开正则了,须要用到正则获取到字符串中指定内容的场景很多很多。如果不会正则或者对正则不熟,那么就会间接影响到工作效率(当然不熟也能够求教共事,然而本人入手饥寒交迫嘛)。我就吃了对正则不熟的亏,正好儿学习爬虫须要应用到正则,借这个机会,好好对正则重新认识学习一遍。
至于文档,能够间接参考菜鸟教程正则表达式
实战篇
学习完Python、Scrapy、Xpath的应用办法之后,就能够本人尝试入手开发一个小爬虫了。我最开始是尝试着写了一个爬取简书全站文章的小爬虫,测试是能爬取到数据的,只不过在爬取比拟多的数据之后,会呈现一些问题(这些问题在上面会提到)。贴一个爬取我本人网站所有文章的爬虫我的项目Python Scrapy demo,代码写的很简略,就是翻页爬取我博客中所有的文章题目及内容。小白应该也能够很好了解
反爬
下面说到在爬取简书全站文章的时候,爬取数据超过一定量的时候,就会呈现一些问题。次要就是被禁止爬取了,起因是我在同一时间大量的爬取了简书的文章,所以我的IP短暂的被列入了简书的黑名单,所以导致我爬取不到数据。过一会儿就能够了,然而再次爬取直到IP被封,两头爬取到的数据量又比第一次少很多。这就是简书的反爬机制了。
对于反爬以及反反爬,我之前也写过文章:Python爬虫钻研,外面列举了反爬常见的套路,以及反反爬虫应答策略,外面内容是我在理解爬虫一段时间后,做的一个总结。可能了解的也不太粗浅,能够作为理解。
代理IP
对于代理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
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入门实战
Scrapy Crawlera
crawlera是一个利用代理IP地址池来做分布式下载的第三方平台。咱们线上业务始终在应用这个代理,十分的稳固,简直不会呈现被屏蔽或者拜访失败的状况。就是价格有点小贵
scrapy-crawlera官网文档
ScrapingHub Crawlera介绍及资费
ScrapingHub Crawlera Api文档
小技巧
Xpath Helper
Xpath Helper是一个浏览器的小插件,不便咱们间接在网页上输出Xpath表达式,来验证咱们写的表达式是否正则。
Scrapy Shell
scrapy shell也是scrapy提供的调试工具之一了。它能够不便的在命令行关上咱们指定的网页,而后输出相应的代码来调试页面内容。
总结
以上差不多就是本篇文章的全部内容了,演绎总结了初学Python爬虫的学习门路、实战进阶和一些能够进步工作效率的小技巧,当然在理论的工作使用中,须要理解到的常识要比这些多得多,要想玩转它,肯定要一直的去学习、去摸索、去尝试。
应用到当初也只是冰山一角,前面还有更多货色须要去学习。
共勉。