什么是爬虫?
网络时代,有一种网络程序,俗称网络机器人。它可以按照一定的规则代替人们自动地在互联网中进行数据信息的采集与整理,这就是所谓的【爬虫】。
什么是反爬虫?
反爬虫就是和爬虫抗衡。减少被爬取的次数。其实就是网站为了维护自己的核心安全而采取的抑制爬虫的手段和措施。
说得简单一点,反步兵就是机关枪、反坦克就是火箭炮。反爬虫那就是杀虫剂喽!
反爬虫的手段其实有很多,今天就给大家分享几个我在爬虫过程中遇到的爬虫和解决方法,希望对大家能有所帮助!
header
这是关于反爬最常遇到的也是最为容易解决的一个问题,先上图

当我们没有加入header的时候,服务器响应给我们的是一个200的正常的return code。但是就是没有获取到后台传过来的数据。为什么我们用浏览器看的时候能获取到数据,用爬虫爬数据的时候就获取不到呢?
那是因为我们没有在获取的header里面加入cookie、refer和user-agent。但是这些参数的具体含义是什么呢,为什么有了它就可以获取到数据呢?
cookie - 侧重于用户的类型,这里具体指的就是登录的用户呢还是游客
refer - 指的是用户从哪个页面发出网络的访问和数据的请求
user-agent 指的是访问后台服务器的是哪一个浏览器
所以在模拟请求的时候,先在headers中加入 User-Agent,如果还不可以请求再尝试加入 Referer,还无法访问,最后再加入 Cookie。

所以建议大家在开局就加入以上参数。这样就可以成功的获取到数据了。

ip
什么是ip反爬呢?
我们平时在访问页面的时候,后台会对我们的行为进行统计。单位时间内如果同一ip访问的次数超过网站设定的阈值就会对我们的ip进行不同程度的封禁。导致无法继续我们的爬虫操作
那么问题要怎么解决呢?
1. 降低单位时间的访问次数。也就是给他设置一定的访问时滞。在每次执 行完一个爬虫操作之后让爬虫的线程sleep三秒五秒甚至于8-10秒。

2. 使用代理ip访问
如何获取代理ip呢?
大家可以注册西刺代理账号,购买专业版代理。
网址:https://www.xicidaili.com/nt/
经常爬虫的伙伴应该对西刺代理并不陌生,可以免费或花钱购买可用的IP地址,但是怎么说呢,花钱的ip稳定,免费的ip经常会掉线,大家视情况而定喽

代理ip的设置方法:

Ajax动态页面加载
什么是Ajax动态页面加载呢?
传统的网页(不使用 AJAX)如果需要更新内容,必须重载整个页面。
AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
但是通过Ajax异步加载的网页内容在网页源码中是没有的,网页返回的response中是解析不到我们想要的内容的。
那么如何判定是动态网页呢
是否在url不变的情况下或者是为刷新的情况下,能够加载页面信息
网页的源代码与网页结构不同
动态网页的爬取方法:
分析页面请求,找到真实的url
使用Selenium模拟浏览器行为
咱们以新浪微博为例

当我们想爬取该网页内的新闻,发现它的网页url一直不变,但是下拉网页的时候会一直加载,那么我们该怎么办呢?
.
F12打开控制台,选择XHR异步加载数据包,找到页面动作抓取网络数据包
通过XHR-->Header-->General-->Request URL,获取json文件URL地址
通过XHR-->Header-->Query String Parameters(查询参数)

Ajax有其特殊的请求类型,它叫做xhr,如上图所示,我们点开这个xhr对应的get开头的请求,可以查看这个请求的详细信息。

在右侧可以观察到RequestHeaders、URL和ResponseHeaders等信息。RequestHeaders中有一个信息为X-Requested-With:XMLHttpRequest,这个标注的就是Ajax请求

我们在点击到Preview中可以观察到返回的是个人昵称、简介、头像等。可以再去到response界面,观察一下真实的返回数据
接下来,我们再去看一下第一个请求,观察一下它的response
所以最原始的链接就是https://m.weibo.cn/u/2830678474

过滤请求

接下来我们来筛选出所有的Ajax请求,只需点击XHR,然后不断的滑动页面,这样我们就可以捕获到所有的Ajax请求了

随意点开一个条目,都可以清楚地看到其 Request URL、Request Headers、Response Headers、Response Body 等内容,此时想要模拟请求和提取就非常简单了。
还有一些其他的反扒措施例如:
登录才显示数据才可以爬取
限制网页返回数据条数
验证码登录爬取
APP数据爬取
这些在后续也会和大家一起分享,希望今天的内容能够为大家有帮助。大家如果对Python感兴趣的话就来微信公众号 '神秘程序员007' 和小编一起学习吧!
网友评论