网站|搞疯爬虫程序员的8个难点!

来源:麦叔编程
作者:麦叔

网站|搞疯爬虫程序员的8个难点!
文章图片

Python很强大 , 熟练的程序员可以在5分钟内写出一个有价值的爬虫 , 比如:

  • 抓取股票信息
  • 抓取笑话
  • 抓取商品信息
但大部分被抓的网站不是任你抓取的木鸡 , 有抓就有反抗!

网站|搞疯爬虫程序员的8个难点!
文章图片

这是一场网站和程序员之间的一种博弈!都是程序员 , 何必呢?程序员何必为难程序员!

网站|搞疯爬虫程序员的8个难点!
文章图片

凡是博弈 , 就一定不易!因为道高一尺魔高一丈 。
你抓他就防 , 你改进抓取方法 , 他就提高防抓手段!
随便你抓 , 岂不是侮辱网站程序员吗?

网站|搞疯爬虫程序员的8个难点!
文章图片

如果有人问你:某某网站能不能抓?
答案肯定是:能!
从技术角度讲 , 只要你能在通过网页上看到的内容 , 就一定能抓!无非就是抓取难度的大小 。
本文总结了实现爬虫时常见的的8个难点 , 以及基本解决思路 。
1. 不小心爬进监狱 从技术手段上讲:天下没有不能抓的网站!
从法律角度上讲 , 有一种说法叫:爬虫写的好 , 牢饭吃的早!我现在还有一个好哥们在里面 , 说到这里两眼都是泪 。

网站|搞疯爬虫程序员的8个难点!
文章图片

正所谓行有行规 , 爬虫有虫规!虫规就是robots.txt 。
robots.txt是网站写给爬虫的声明 , 里面写明了那些内容不能抓取 。 robots.txt一般放在网站的根目录下 。
以B站为例:

网站|搞疯爬虫程序员的8个难点!
文章图片

里面明确了以"/include/" , "/mylist/"等开头的网址不能被抓取 。
说了不能抓就别抓 , 要不然警察把你抓起来!

网站|搞疯爬虫程序员的8个难点!
文章图片

但是国内很多网址不守行规 , 不讲武德 , 网站里根本没有robots.txt 。 那怎么办呢?
可以看几个方面:
  • 是否是敏感信息?如果是涉及到私人的敏感信息 , 不要抓 。
  • 你抓取的量大不大?一般量不大就没事 , 量大了就要谨慎 。 举个例子:偷10块钱不会坐牢 , 但偷10万块钱肯定可以免费住宿了 。 如果只是抓取自己的商品 , 邮件 , 账单等 , 一般是没有问题的 。
  • 你要抓取的网站是谁的网站?有些网站惹不起 , 不要去抓 。 他可以抓你的 , 你不能抓他的 。
如果不确定能不能抓 , 也可以直接联系网站的主人 , 询问是否可以抓取 , 或者有没有数据接口 。
2. 复杂多变的网页结构 网页的复杂多变体现在两个方面:
(1)同一个网页在显示不同的内容时会有不同的结构 。 比如商品详情页 , 不同的商品 , 使用不同的网页模板 , 这是很正常的情况 。 再比如商品列表页 , 没有商品 , 有一件商品 , 有多件商品 , 可能样式都会有差别 。 如果你的爬虫只会处理一种情况 , 爬取过程中必然会出现问题 。
(2)网页功能或者设计风格的改变 。 一般的爬虫都是根据网页结构 , 使用xpath去解析内容 , 一旦结构变了 , 就解析不出来了 。

网站|搞疯爬虫程序员的8个难点!
文章图片

怎么解决呢?
  • 分析网页结构要全面 , 了解同一个网页的不同情况 。
  • 网页结构改了 , 也修改相应的爬虫 。
  • 如果要抓的信息比较固定 , 比如抓取电话号码 , 可以使用正则表达式去解析 。 不管网页结构怎么变化 , 一套代码都能搞定 , 正则写的好一点 , 准确度也很高 。
  • 还有高端的办法就是使用人工智能的技术 , 让爬虫能够适应网页的变化 , 随便网页变化自己也变化 。
3. IP封锁 IP封锁是常用的反抓取手段 。
当网站发现某个IP地址发送请求过多的时候 , 会临时或者永久的封锁这个IP的请求 。

网站|搞疯爬虫程序员的8个难点!
文章图片

技术好 , 讲规矩的网站一般提前设置好了规则 , 比如一天只能访问500次 , 或者一分钟内不能访问超过10次 。
当你超过了次数自动封锁你 , 过了时间限制会自动解锁 。
技术不好的网站可能没有这样的规则 , 网站挂了 , 或者管理员发现异常后 , 看日志才发现你请求太多 。
因为它们没有现成的规矩和技术手段 , 它们有可能简单粗暴 , 直接在Web Server上设置永久封锁你的IP地址 。
应对IP封锁的一般手段:
  • 不要频繁抓取 , 在两次请求之间设置一定的随机间隔 。
  • 摸索网站的规则 , 然后根据规则抓取 。
  • 使用IP代理服务 , 不断的更换IP 。 不怕花钱就用收费的IP代理 , 不想花钱就找免费的 。 网上搜索一下 , 免费的也很多 , 只是可能不稳定 。
4. 图片验证码 图片验证码是另一种最常用的反爬技术 。
当你登录网站的时候 , 或者检测到你请求过多的时候 , 网站跳出一个图片 , 要求你输入图片上的内容 。
图片上的内容一般是扭曲的文字 , 甚至是数学公式 , 让你输入计算结果 。

网站|搞疯爬虫程序员的8个难点!
文章图片

这都算是好办的 。 一般使用OCR技术 , 比如Python的Tesserocr库 , 就可以自动识别图片上的内容 , 然后自动填入 , 继续爬取 。
但道高一尺魔高一丈 , 图片验证码也不断的进化和升级 , 比如国外的这种 , 经常把我这个大活人都难哭:

网站|搞疯爬虫程序员的8个难点!
文章图片

或者12306这种:

网站|搞疯爬虫程序员的8个难点!
文章图片

简单的OCR技术很难处理这种图片 , 但办法总是有的:
  • 人工智能技术之所以叫人工智能 , 就是说它可以跟人一样 , 甚至比人还聪明 。 北大 , 英国的兰卡 , 美国的西北大学的几个研究者就号称用AI研究了一个极快的破解验证码的方法 。
  • 使用专业的解码服务 。 有需求就有产品 , 专业的事交给专业的人办 。 有一些公司专门提供相关的服务 , 你调用他们的API或者使用他们的插件解决验证码的问题 。
  • 人肉解码:当爬虫运行到验证码的时候 , 暂停 , 等待人工输入验证码 , 然后再继续 。
5. 蜜罐陷阱 蜜罐陷阱是网站开发者用来快速识别爬虫的一个阴招 。

网站|搞疯爬虫程序员的8个难点!
文章图片

在网站上添加一些链接 , 通过CSS把这些链接设置成人类不可见:
display: none
爬虫解析HTML的时候是能够发现这些链接的 , 于是就点开链接爬进去了 。
一旦爬进去了 , 马上封锁你的IP 。
【网站|搞疯爬虫程序员的8个难点!】解决方法也很简单 , 在解析网页的时候添加一些判断是否可见的逻辑即可 。
6. 网页加载速度慢 有些网站反映速度很慢 。 当请求量大的时候 , 还时不时的会失败 。
这对人来说可能还好 , 耐心等待点 , 刷新一下页面可能就行了 。

网站|搞疯爬虫程序员的8个难点!
文章图片

爬虫也要添加相应的逻辑:
  • 设置合理的timeout时间 。 太短网页还没加载完就失败了 , 太长了抓取就会很慢 , 效率太低 。
  • 添加自动重试的机制 。 但重试次数一般不要超过5次 。 如果三五次都不行 , 再重试一般也没用的 。 可以下次再来尝试 。
7. Ajax动态内容 很多网站使用Ajax动态加载某些内容 。 也就是说主请求只返回网页的主体内容 , 其他内容通过Ajax请求后续动态获得 。
以B站为例 , 视频详情页的HTML页面只有视频的基本信息 , 评论等是后续的Ajax请求获得的 。

网站|搞疯爬虫程序员的8个难点!
文章图片

当我们用爬虫抓取的时候 , 拿到只有第一次的HTML , 后面的内容无法获得 。
尤其最近几年流行前后端分离 , 所有的数据都是通过Ajax获取的 。 拿到的HTML页面只是一个空架子 , 里面什么数据都没有 。
解决的方法一般两个:
  • 分析浏览器的网络请求 , 搞清楚后续的请求有哪些 , 然后用爬虫发起同样的后续请求 。
  • 使用selenium等浏览器驱动技术 。 因为它们本来就是用程序打开浏览器访问的 , 所以后续的Ajax请求也都有 。
第一种方法是个技术活 , 但一旦分析出来抓取速度会更快 。
8. 登录请求 有些内容需要登录后才能访问 , 这种情况下请先去看一下本文第1点 , 防止爬进监狱去 。
但如果是自己的账号 , 那一般是没问题的 。
解决方法:
  • 如果只是临时抓取某些网站内容 , 可以先手工登录 , 分析浏览器的Cookie , 然后在爬虫请求中加入同样的Cookie 。
  • 对于简单的登录网站 , 也可以在脚本中自动填入自己的用户名和密码 , 无须人工干预 。
  • 或者当需要输入密码的时候 , 让爬虫暂停 , 人工输入密码后再继续抓取 。
9. 大量抓取 一个专业点的爬虫 , 不会满足于只是简单的抓取 , 它的名字里有爬字 , 它会爬取网页上的链接 , 自动再去爬取链接内的内容 , 如果循环下去 , 整个世界都是它了 。

网站|搞疯爬虫程序员的8个难点!
文章图片

这就带来很多的问题 , 随便举几个例子:
  • 要抓取的网页数量巨大
  • 爬虫顺着链接可能会再爬回自己家
  • 很多网页设置了重定向
  • 爬取了很多自己不需要的内容
  • 爬取回来的数据量巨大
当你面临这些问题的时候 , 爬虫问题就变成了“爬虫+工程”的问题 。
简单的解决方法是使用爬虫框架 , 比如Python里的Scrapy , 它会帮你记录抓了那些 , 那些没抓 , 设置抓取深度和宽度等等 。

网站|搞疯爬虫程序员的8个难点!
文章图片

复杂一点 , 你们需要一个专业的团队 , 使用大数据技术做并发处理和数据处理 。 这是另一个层面的问题了 。
这是我的一点心得和分享 , 不一定全面 。
各位看官大神 , 你还碰到哪些难点?你有哪些解决方法?请留言一下吧 。

网站|搞疯爬虫程序员的8个难点!
文章图片

    推荐阅读