美文网首页python效率
我是如何高效写爬虫的?

我是如何高效写爬虫的?

作者: 麻瓜编程 | 来源:发表于2019-02-15 22:24 被阅读100次

    爬虫是大多数 Python 学习者在初学时的第一个项目,也是一个很好的连接点。 为了给新手提供一份入门指南,在这里分享一下高效写爬虫的几个步骤。

    第一步:观察

    这里需要用到一个人人都用过的工具:Chrome 浏览器。

    我是这样使用的:在 Chrome 里,打开检查元素去观察网站

    * 判断前端渲染还是后端渲染(网页元素含有 data-xx 的属性一般就是,如果不确定那就关闭 JS 加载看看网页还能出得来么)

    * 提前发现一些特征奇怪的元素(比如一个标签故意没闭合,要是解析出问题了先找它)

    * 找到目标元素的集体特征(位置、名称、命名规则)

    * 使用浏览器自带的 Search 和 Console 来确定问题

    这样做的目的,是先在浏览器测试一遍,元素定位的描述是否准确

    好处显而易见,先在浏览器中把调查的工作做足,理解了网页结构和数据规则,再去用代码实现。代码是为了我所发现的原理而服务的。如果在这一步没有八分把握,就别先去写代码,写了也是浪费时间。

    第二步:遵循正确的爬虫升级开发模式

    任何一个爬虫,无论它看起来多复杂多牛逼,无非是这四步模式:请求-解析-反爬-效率,这样一个模式走下来。而对于新手、高阶初学者、熟手,不同能力阶段的人,要掌握的技巧是不同的。

    新手阶段的爬虫开发模式

    请求:大多数新手教程会使用 Requests,但是在2019年已经很难仅仅使用它就成功爬取了。所以这里我建议新手直接上 Selenium, Pyppeteer(PuppeteerJS) 这类框架去模拟浏览器访问网站,最大程度的避免爬虫被识别出来,这是最省事的方法。

    解析:在这个阶段先解析 html,使用 BeautifulSoup 就很好,也许有人会告诉你用 Pyquery ,但是如果你从来没用过 JQuery 那么你还是老老实实的用 BeautifulSoup 吧。

    反爬:你要知道作为一个网站,去反爬是分几个阶段的:

    验证 header ——看你是不是人

    验证 cookie ——看你是不是浏览网页行为正常的人

    验证 ip 访问频率——看你是不是一个来爬我的人

    验证 auth——你光是人不行,还得是我的用户才行

    其他更高级的反爬措施

    而在新手阶段,最容易遇到的是频率限制,除了控制访问频率,「现在即使是最菜的新手,也知道用 ip 代理池了」。

    效率:在新手阶段先不考虑效率提升了,就先用自己的电脑爬取,一般来讲常见的爬虫都是阻塞型的,也就是一行没运行完就不执行下一行,先跑通流程了,后面再提升效率。数据存储也先用最简单的方式,直接下载到电脑,或者是存成 txt  csv 都够用了。

    完整走完这一个循环,可以先搞明白爬虫的整个流程是怎样的。这个阶段可以爬取一些简单的网站,爬取到100万内的数据。

    高阶初学者的爬虫开发模式

    请求:在请求中使用 header ,这样在请求的时候就提升爬取成功率和 ip 损失。

    解析:BeautifulSoup 虽然使用简单但是慢。这个阶段可以换成 XPath 或者正则,去提升解析效率。更推荐 XPath ,性能高、还容易维护。

    反爬:你接触的网站多了,就会遇到各类问题需要解决,验证码识别、设置 cookie 模拟登录、处理动态加载,都是这个阶段要解决的问题。

    效率:这时候可以使用异步请求,效率至少提升 2~3倍。另外可以使用多进程爬虫,这样就不是利用电脑的单核cpu,而是加上多核多进程,效率就完全上了一个大的台阶。基本上完全可以达成一台电脑1天爬取百万级别的速度。Excel 最多支持 1,048,576 行,所以超过百万级数据存储就需要上数据库了,选择 MongoDB 或者 MySQL 都可以,懒一点 sqlite 也是没什么大问题的。

    到了这个阶段,你能达到能爬取80%网站,爬取到500万以内数据量的一个水平。

    不过还是有解决不了的问题,App爬不了怎么办?爬下来的是假数据怎么办?想爬更多数据量怎么办?

    这就需要进入下一阶段深入学习。

    熟手的爬虫开发模式

    请求:当你理解了网页背后的原理的时候,你就可以放开使用各种非浏览器的库去模拟真实请求。这时候需要再去观察网站时候,你就要同时考虑到如何构造一个可信的请求,

    解析:在这个阶段开始解析 json, xml, 甚至是 GraphQL。把这些数据格式和 Python 的数据将结构互转。这些数据格式的传输,在 App 手机端是最常见的,这时候就需要抓包并分析 ,破解接口的鉴权。

    反爬:接触的网站多了,你会遇到「数据投毒」的情况,你在爬的时候以为自己都爬到了,但其实到手的是真假混淆的数据,毫无意义。这时候最重要的是通过分析发现被投毒了,然后换请求方式,让自己更像真人用户。

    效率:当处理500万以上量级的数据,就需要用到分布式爬虫了,使用多台电脑或主机爬取。这时候还需要考虑一个可复用的好的工程结构的爬虫设计。 其实到了这个阶段,开发模式变成了:请求-解析-调度-存储-展示-反爬-效率。

    调度就是怎么调配你的下载器和解析器然后入库,对资源的一个协调作用,一般大型爬虫都会设计到。也是提升效率的一种方式。

    这时候你可以达到能爬取99%的网站和app,获得千万级数据的一个水平。

    基本上,没有爬不到的数据了。但不要做违法的事情哦(爬取公民公积金社保信息、个人淘宝交易记录、版权内容等均为非法)。

    为什么提出这3种不同的模式呢?因为这样可以逐渐的去升级你学习的难度。 有些人干什么都事情一窝抓, 他想一下就干所有事情,但是从经验上来讲,你要想有效率的干好这一件事情,你必须按照客观规律来。相当于你要想学得快,你必须要把问题简化。 如果一个新手一上来就接触分布式,可能就夭折在这里了,需要先掌握的是整体的流程,有了成果、有了成就感,然后再循序渐进的提升难度。

    第三步:写更多爬虫

    看过这样一句话,

    在编程领域你每天都会遇到不明白的词,你需要习惯。

    遇到不认识的东西特别正常,关键就在于要怎么处理。如何有效率的写代码,在于什么时候你该了解什么事情。比如说你现在这代码跑不通了,肯定是先解决手头着急的问题,理论方面的事情有空了再慢慢研究。

    我的建议是多写点小项目,快速练习,今天解决一个登录问题,明天解决一个验证问题,靠小型项目来弥补你在网络知识上的欠缺。

    因为爬虫技术,靠实际项目去学是最快的。真的没办法系统去学,如果谁要说爬虫的知识你被系统学下来了,它几乎指的是我要学习前端+后端+系统运维+黑客技术。

    总结

    最后总结成三个重点,

    第一步:观察,先在浏览器中把调查的工作做足,理解了网页结构和数据规则,再去用代码实现。

    第二步:遵循正确的爬虫升级开发模式,掌握四步一体的模式:请求-解析-反爬-效率。

    第三步:写更多爬虫,靠实际项目去学。

    与大家共勉。

    相关文章

      网友评论

        本文标题:我是如何高效写爬虫的?

        本文链接:https://www.haomeiwen.com/subject/ezrveqtx.html