在工作中,曾经陆陆续续应用爬虫做需要将近半年工夫了,在这半年工夫里,从一个 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 爬虫的学习门路、实战进阶和一些能够进步工作效率的小技巧,当然在理论的工作使用中,须要理解到的常识要比这些多得多,要想玩转它,肯定要一直的去学习、去摸索、去尝试。
应用到当初也只是冰山一角,前面还有更多货色须要去学习。
共勉。