在工作中,我使用爬虫已经快半年了。这六个月,我从一个python小白,到爬虫入门,再到功能实现。从早上忙PHP到下午忙Python再到现在PHP/Python随意切换,其中的波折不言而喻,也走了很多弯路。不过还好,功夫不负有心人,半年的时间,在使用Python的同时,我也随之成长。现在总结一下,希望对有需要的同学有所帮助。之前也写过一些关于Python和Scrapy的笔记,传送门:Python学习笔记(基础)Python学习笔记(常用扩展)Python爬虫研究Pythonscrapy框架学习笔记和简单实战Python如何爬取动态网站?从一开始学习python接触爬虫,首先需要了解的是python的环境搭建、语法和特性。网上有很多相关的教程。下面是我在学习过程中使用的几个教程。对于Python的快速入门可以起到很大的作用。廖雪峰老师Python教程来了,开启Python之旅。边看文章边学习,跟着写demo菜鸟教程中的Python基础教程。您也可以使用Python3文档作为快速学习。当你忘记一些功能时,你可以快速找到爬虫框架。当你了解了Python的基本语法后,你就可以开始学习python相关的爬虫框架了。Python的爬虫框架,比较有名的是Scrapy框架。主要是了解Scrapy框架是如何工作的,并学习如何使用它。通过阅读文档、博客文章和观看视频来学习Scrapy。下面我会贴出一些学习过程中看到的不错的Scrapy博客和视频。Pythonscrapy框架学习笔记和简单实战-这是我自己的博文总结Scrapy的官方文档(英文版)Scrapy文档(中文版)英语不是很好的同学,可以了解一下,但是里面的翻译很难解释。B站Scrapy视频(一)视频时间不长,但是对入门Scrapy非常有用足够了。B站的Scrapy视频(二)也有Scrapy的学习讲解。B站的Scrapy视频(三)先跟着这个视频学习Scrapy。但是在写这篇文章的时候,发现原来的视频不见了。如果需要了解更多可以联系UP主。除了上面介绍的学习链接,github上还有一些比较完整的Python和Scrapy项目,大家可以尝试了解一下。XPathXPath用于在XML文档中的元素和属性之间导航。也就是说,可以利用XPath来定位元素在页面中的位置,获取元素内容。我写的爬虫代码几乎都是用XPath来获取页面内容的。因此,学习XPath也是很有必要的。Xpath就像Javascript的Dom。它可以根据id、class等定位到指定元素所在的位置,得到对应的内容。我将简单列出一两个比较常见的使用方法/下一级元素//子元素。当前节点get获取单个值,getall获取所有值。具体可以参考W3school上的Xpath教程,里面有详细的介绍。正则爬虫自然离不开正则,有很多场景需要正则来获取字符串中的指定内容。如果不知道规则或者不熟悉规则,会直接影响工作效率(当然,如果不熟悉可以请教同事,但是自己动手的话,会有足够的食物和衣服)。苦于对正则表达式不熟悉,只需要用正则表达式来学习爬虫。我将借此机会重新认识和学习正则表达式。至于文档,可以直接参考菜鸟教程的正则表达式实战章节。学会了Python、Scrapy、XPath的使用之后,你可以尝试自己开发一个小的爬虫。一开始尝试写一个小爬虫爬取简书全站的文章。测试可以爬取数据,但是爬取的数据多了之后会出现一些问题(这些问题下面会提到。)。贴一个PythonScrapydemo,一个爬取自己网站所有文章的爬虫项目。代码很简单,就是翻页爬取我博客里所有的文章标题和内容。小白应该也能很好的理解反爬。上面说了在简书全站爬取文章的时候,爬取的数据超过一定量就会出现一些问题。主要原因是我被禁止爬了。原因是我同时在简书里爬取了大量的文章,所以我的IP短暂的被简书列入黑名单,所以无法爬取数据。过段时间就好了,但是重新爬取,直到IP被封,中间爬取的数据量比第一次少很多。这就是简书的反爬机制。关于反爬和反反爬,我之前也写过一篇文章:Python爬虫研究,列举了常见的反爬套路和反反爬的应对策略。内容是我在了解爬虫一段时间后所做的总结。可能理解的不是很深,也算是了解了。代理IP要单独提取代理IP,因为爬虫项目必须依赖很多IP才能完成任务。否则,如果一个IP被网站屏蔽了,生意就停止了。这种情况是不允许的。因此,我们需要为我们的爬虫建立一个代理IP池,存放可用的、质量好的IP,当IP被封时,切换到一个正常的IP作为代理访问。如何搭建代理IP池,网上有很多方案,因为这个方案的IP质量不是很好,所以没有尝试。想玩的话可以按照网上的IP代理池方案自己搭建一个IP池。差不多就是去公网IP代理网站,爬取所有的IP,保存在自己的IP代理池(可以是数据库也可以是Redis),然后写个脚本定时监控这些IP是否正常,如果它们是正常的,将它们放入代理池中,否则将从代理池中删除。常用IP代理,如QuickAgent,支持购买一定数量的代理IP。如果切换IP,可用IP的数量将减少一个。测试后发现IP质量还是挺高的。但这种有限的数量并不能满足我们的业务需求。也可以使用一些带隧道连接方式的IP代理,即不限IP,统一使用隧道访问,代理会转发你的请求。这种代理就像小象代理。不过潇湘代理的IP确实一般,也可能是我们业务的特殊性,潇湘的IP对我们用处不是很大。最后,我们使用ScripingHub和Crawlera来提供代理服务。代理质量出奇的高且稳定。因为是国外代理,所以预算比较充足的情况下可以使用这样的代理。(约$349一个月)验证码验证码是防爬处理中最常用的方法之一。第一次遇到这种情况,我绞尽脑汁想办法破解验证码。我了解到目前比较成熟的技术是OCR技术,但是这个使用起来非常麻烦,而且故障率相当高。即使验证码被破解,验证码还是会出现在后续的请求中,识别验证码的OCR算法也是非常耗时的,会导致爬取效率的下降。既然无法高效破解验证码,请问还有其他办法吗?答案肯定是肯定的,后面采用的方法就简单多了,也更有效。在请求中间件类中判断页面是否为验证码页面。如果是,直接换一个代理IP请求。如果您使用Crawlera,只需提出另一个请求。破解验证码费时费力。改IP简单高效,推荐。ScrapyRedisScrapyRedis用于构建分布式爬虫。相当于把需要爬取的链接存放在Redis队列中,可以在不同服务器开启多个爬虫脚本来消费Redis队列,达到分布式爬取的目的。切换到ScrapyRedis也非常简单。蜘蛛类继承RedisSpider,在爬虫类中添加redis_key,指定队列名。删除start_url。在配置文件中添加一些ScrapyRedis的必要配置和Redis的连接信息。DUPEFILTER_CLASS="scrapy_redis.dupefilter.RFPDupeFilter"SCHEDULER="scrapy_redis.scheduler.Scheduler"SCHEDULER_PERSIST=TrueREDIS_HOST=REDIS_PORT=REDIS_PARAMS={'db':'','password':}文档参考:Scrapy-Redis入门ScrapyCrawlercrawlera是第三方平台,使用代理IP地址池进行分布式下载。我们的线上业务一直在使用这个代理,非常稳定,几乎没有出现被封或者访问失败的情况。价格有点贵scrapy-crawlera官方文档ScrapingHubCrawlera介绍和费用ScrapingHubCrawleraApiDocumentationTipsXpathHelperXpathHelper是一款浏览器小插件,方便我们直接在网页输入XPath表达式来验证我们写的表达式是它定期。ScrapyShellscrapyshell也是scrapy提供的调试工具之一。它可以很方便的打开我们在命令行指定的网页,然后输入相应的代码来调试页面内容。综上所述,以上几乎就是本文的全部内容。总结了初学Python爬虫的学习路径、实践进阶和一些提高工作效率的技巧。当然,在实际工作和应用中,你需要了解的知识远不止这些。要想玩好,就必须不断学习、探索、尝试。到此为止只是冰山一角,后面还有更多的东西需要学习。共勉。
