爬虫小技巧

1、何为爬虫

  • 爬虫的概念就是能按照给定的目标及规则实现自动化采集网络数据的程序或脚本。通俗的来说,就是通过程序来模拟人登陆网站去获取想要数据,就是这么简单。
  • 爬虫的本质是直接用程序脚本去实现http请求,访问目标网站或数据接口,然后对获得的数据去进行解析,从而得到你想要的数据。
  • 本人认为爬虫的最高境界是完完全全模拟出人的操作,让网站监控那一方无法区分出是爬虫还是人。当然这是非常难的,现在几乎不可能,但技术在进步嘛。

2、反爬虫侦测机制(可能不全,供学习交流)

本骚年预言,在未来最贵的东西将是数据,没错,就是数据,所以,从各种数据源如何去成功获取数据将会变得越来越困难,但是新的爬虫技术也会层出不穷,不要慌,不扯了直接入正题。以下我会给出我所实践出的爬虫技巧:

1. User-Agent机制

  • 通过游览器的开发者工具中看到,每次进行http访问时,它的请求头里都有User-Agent这个参数,列如: 
  • user-agent指的是访问网站时的用户代理,简单的说,它指的是你的访问终端,即游览器、硬件平台、系统软件的相关信息。
  • 现在很多网站为了防爬虫,都会对user-agent这个参数进行检测,我们在爬数据时尽量把这个参数带上。
  • 在爬取数据时也可以合理地切换不同的user-agent来营造新的客户机环境,降低被侦测的几率,提升其并发抓取数据的能力。特别是对应单点式登录时,使你在同台服务器上提升数据并发爬取的能力(即模拟多个用户登录)。(属个人意见,请大家指教)

2.Referer机制

  • 每次进行http访问时,它的请求头里经常会包含referer这个参数,列如:
  • referer翻译成中文是“引用”的意思,在http头里指代的是引用站点,即访问该链接的前一个访问的链接,告诉该链接他是从哪里跳转过来的。
  • 为了反爬虫,部分网站或接口都对referer做了监控,如淘宝等网站。无referer或假referer都被认定为非法访问。这时候就需要我们用游览器开发者工具去跟踪一下该链接访问流程,从而提取出对应的referer加到请求头中,来实现数据爬取。

3.Cookies机制

  • 这可是重点啊,cookie在我们的web应用中,常常用来辨别用户身份、进行session跟踪等功能,也起到了反爬虫作用。以下我会简述我在实践中所遇到的cookie反爬虫机制和一些对策。(如有问题请及时提出,谢谢)

    1. 身份验证 
      很多网站的数据都是需要你登录后才能进行数据爬取,而用户的登录状态则是记录在cookie中,大部分的网站都是把sessionId作为key放在cookie中,来跟踪用户。这个时候我们就需要去模拟用户的登录来获取对应的cookie。 
      模拟登陆是关键点也是个大难点,只要你成功实现模拟登陆,后面的数据爬取都将不是问题。这里我就拿比较普通的网站来举例子:

      • 首先是打开游览器开发者工具,先人工尝试一遍登录,细细观察整个流程确定需要哪些参数,需要注意cookie的变化。
      • 然后正式开始,先解析登陆页面获取待提交的表单以及response头set-cookie中的参数(之前讲的referer和user-agent也别忘了),根据表单放入对应的参数(如账户、密码等),同时在http头中放入对应的cookie及相关参数。需注意,在整个登录过程中可能会遇到动态验证码的问题,这个时候你可以去搞个验证码解析平台(如优优,云速等)或者你把你的爬虫程序做成半手动的,直接获取验证码图片流并存到本地,通过人工输入验证码。
      • 然后提交登录表单即可,登录成功后,携带对应的cookie来进行数据爬取。
    2. 访问流程验证 
      啥是访问流程验证?莫慌,我来解答。现在很多网站在加载数据时都会通过ajax的异步方式来获取数据以提高网站性能,有次我在爬取某个网站的ajax接口的数据时,发现得不到数据,后来就去研究其中的cookie值的变化,发现访问需要某个特定的cookie值,这个特定的cookie值是哪里来的啊?本人就去查访问该接口前的所有的ajax接口,终于发现了这个cookie值。 
      事实证明,按正常的人为访问流程,获取数据会先访问这些通行证接口(本人瞎起的名字,莫喷)来获取访问数据的权限特定的cookie值,最后才能得到数据。归更到底,爬虫的目标就是要完全模拟人为正常操作。

4.峰值规避机制

  • 有部分网站会对每个IP进行流量监控,当某个IP在单位时间内的访问次数超过设定的峰值时,就会对该IP的访问进行限制(如弹出验证码页面,弹出登录页面、直接禁止访问等手段),这个时候就需要我们对该接口进行峰值测试,找出这个单位峰值(这个过程可能会很烦,坚持少年)。之后,把爬虫程序单位时间内的访问次数降到峰值以下就OK了。

5.代理IP机制

  • 有些网站会对每个IP进行非常严格的流量监控,除了上面说的峰值规避机制,还可以通过代理IP的方式来解决对我们爬虫程序的限制,当我们发现我们的IP被封时,可以通过切换IP的形式(即代理IP)来继续爬取数据。常见的IP代理商有VPN等。

6.客户端爬取机制

  • 如何实现数据的精确爬取?如何规避种种反爬虫机制?如何更真实地模拟人为操作?那就把你的爬虫程序放到离数据源最近的地方,就是在客户端实现数据爬取,如何实现呢?就是通过游览器插件来完成,我们程序员大多用的是chrome游览器,所以我就写了个chrome游览器插件来爬取数据。
  • 我的设计是通过chrome插件去定时向服务端领取爬虫任务。领取任务后,通过插件去自主打开目标网页,页面加载完全后向页面注入js代码,来爬取数据,并临时存储在chrome游览器的内置数据库中,等整个流程走完后,从chrome数据库中拿出所有抓取到的数据,再自主访问服务端接口来提交这些数据。

3、爬虫技术小结

    • 同志们,我说的这些技巧都很实用,但是也请大家永远都不要小看反爬虫机制,他们有时候会让你们感到头疼万分,比如生物探测算法、各种奇葩的验证码图片等等。
    • 爬虫程序和防爬虫机制始终都在进行着一场无休止的博弈,新的爬虫技术不断问世,同样,防爬虫机制也在不断完善,同志们不要放弃,不要被困难打倒,始终坚信一点:“世上没有爬取不到的数据!!!”。
    • 本人接触爬虫也就几个月,所以上述内容可能存在错误可能不全,大家不要介意,希望大家多多提出建议,一起交流学习。
时间: 2024-10-03 15:49:13

爬虫小技巧的相关文章

python3 爬虫小技巧,

前几天采集一个网站的数据,发现在翻页查询数据的时候,网址是不变的,其实这样的情况很多,关键是获取到真正的URL 比如:查询链接是:http://so.nen.com.cn/m_fullsearch/searchurl/mfullsearch!descResult.do 翻页r查询,地址栏里面的url始终是不变的,但实际上是变化的, 具体的参数变化可以在From Data看到,如下图: 所以具体的完整的url应该是:http://so.nen.com.cn/m_fullsearch/searchu

Python爬虫简单入门及小技巧

刚刚申请博客,内心激动万分.于是为了扩充一下分类,随便一个随笔,也为了怕忘记新学的东西由于博主十分怠惰,所以本文并不包含安装python(以及各种模块)和python语法. 目标 前几天上B站时看到一部很好玩的番剧,名字<笨女孩>,实际上是由同名的搞笑向漫画动画化的.大家都知道动画一般一周一更,很难满足我们的需求,所以我们就来编写一个爬虫,来爬取漫画咯. 那么本文的目标就是爬取<初音MIX>这部漫画(因为笨女孩我已经爬取过了>_<).这部漫画我记得是小学的时候看的,也是

Python 中的一些小技巧

这里是本人收集的一些 Python 小技巧,目前主要是一些实用函数,适合有一定基础的童鞋观看(不会专门介绍使用到的标准库函数).. 一.函数式编程 函数式编程用来处理数据,感觉很方便.(要是再配上管道操作符 | 或者 Java 的那种链式调用,超级爽!可惜 Python 都没有..需要借助第三方库) 1. 分组/group 数据处理中一个常见的操作,是将列表中的元素,依次每 k 个分作一组. def group_each(a, size: int):     """     

更多Requests的小技巧以及总结

对于requests的爬虫库,我们已经学到了尾声. 我们在这儿可以挖掘出更多的requests的使用小技巧. 一.cookie对象与字典的转换 在爬取目标cookie的时候,我们可以将cookie信息进行简化处理. 现在做一个简单的代码验证看看,使用百度的cookies: import requests response=requests.get("http://www.baidu.com")                                      #获取百度的响应

CVM部署Django小技巧

折腾了两天云服务器,从早到晚盯着终端的感觉真的很奇妙,当然一直报错.毫无头绪的感觉也很气.今天早上试了四个项目结果因为各种各样非技术的的原因都失败了,比如域名备案.网站限制爬虫等,确实有些丧气,感觉白忙了.中午睡一觉好多了.同朋友甩了几个关于脑机接口的外文文献,晚上看看,看来要多线程运行了. 以下记录两个CVM使用的小技巧: 1. 解决sqlite3安装后仍报错的问题. 2. 使用screen启用多线程,后台运行程序的方法. 解决sqlite3正确安装后仍然报错的问题 在bash启动的配置文件中

做预解释题的一点小方法和小技巧

在JavaScript中的函数理解中预解释是一个比较难懂的话题.原理虽然简单,寥寥数言,但其内涵却有深意,精髓难懂.如何在轻松活跃的头脑中将它学会,现在针对我在学习中的一点小窍门给大家分享一下,希望能给大家一些帮助: 万事需遵循"原理"--"预解释"无节操和"this"指向:(可先看例题解析然后结合原理进行学习) (感谢蕾蕾老师给归纳的预解释无节操原理:) 如果函数传参数则先于以下执行,就相当于在函数私有作用域下var了一个变量:根据作用域原理,

给你一个云端的大脑01:印象笔记小技巧

我在上课时,很多学员们给我的反馈都是:老师你讲的太精彩啦,但我记不住.我最重视的就是学员的反馈,因为我是一个完美主义者,凡事既然做就要做到最好.而学员就像我的一面镜子,反馈是我改进的方向. 很久以前,我听到这样的反馈第一反应就是自己还是讲得不够好,但后来我的讲课都能hold住全场300多人的时候,我发现这个反馈仍然频繁出现,这不是我的问题而是学员们不会学习的问题,这样的学员在工作中也是缺乏自我培养的能力. 所以从今天起,我的平台又加入一个主题:给你一个云端的大脑.告诉你如何记笔记,如何整理大脑记

思科命令配置小技巧三:alias 命令

大家都用过手机上的快捷拨号设置 思科设备是否支持命令的快捷键定义呢 答案是肯定的 suzhouxiaoniu(config)#alias exec xx show ip inter bri  xx是自定义的快捷键名称,可以是数字 suzhouxiaoniu#xx 直接敲定义好的名称Interface                  IP-Address      OK? Method Status                ProtocolFastEthernet1/0          

思科命令配置小技巧四:用ACL控制debug 输出

使用debug命令可以帮助我们TS,但是使用debug命令往往会输出一大堆信息,很多是我们不需要用的,也会造成CPU高负荷,这种情况下我们可以限制debug的输出 可以应用ACL到debug以限定仅输出要求的debug信息. 如仅查看从1.1.1.1到1.1.1.2的ICMP包: Router(config)# access-list 100 permit icmp host 1.1.1.1 host 1.1.1.2 Router# debug ip packet detail 100 思科命令