黑帽联盟

 找回密码
 会员注册
查看: 2174|回复: 0
打印 上一主题 下一主题

[技术文章] 爬虫套路知多少?反爬策略是关键

[复制链接]

895

主题

38

听众

3323

积分

管理员

Rank: 9Rank: 9Rank: 9

  • TA的每日心情
    无聊
    5 天前
  • 签到天数: 1644 天

    [LV.Master]伴坛终老

    爬虫是获取数据的一种方式,网络上很多请求都是由爬虫发起的。

    说几个爬虫的实际例子:
    ①想要做舆论分析,分析当前热点话题,可以爬取腾讯新闻,微博,今日头条等主流站点数据,然后进行分析;
    ②想要做电影推荐或影评分析,可以爬取豆瓣,猫眼等数据进行分析;
    ③想要做电商销售分析,可以爬取京东,淘宝商家数据进行分析;
    640.gif

    当我们使用高并发或者分布式爬虫对这些站点进行抓取时,可能会损害站点利益:
    ①短时间内大量请求占用站点资源:网络带宽,服务器负载;
    ②如果我们获取数据,自己获益,可能会损害他人利益;

    但是百度,谷歌等搜索引擎厂商无时无刻不在抓取信息,还有很多其他企业和个人也在抓取自己感兴趣信息。如何保护自己利益不受侵犯,企业从制定行业规范与技术两方面做了处理,这也是我们这节主要内容:
    640 (1).gif
    1.robots协议:爬虫规范;
    2.常见反爬机制;
    3.反爬机制应对方式;


    <1>

    robots协议
    robots协议是一个文本文件,通过协议声明站点的哪些信息可以抓取,哪些禁止抓取。

    robots协议位置:http://xxxx/robots.txt ;例如:百度https://www.baidu.com/robots.txt ,内容如下:
    User-agent: Baiduspider
    Disallow: /baidu
    Disallow: /s?
    Disallow: /ulink?
    Disallow: /link?
    Disallow: /home/news/data/

    User-agent: Googlebot
    Disallow: /baidu
    Disallow: /s?
    Disallow: /shifen/
    Disallow: /homepage/
    Disallow: /cpro
    Disallow: /ulink?
    Disallow: /link?
    Disallow: /home/news/data/
    ... ...
    User-agent: *
    Disallow: /


    robots协议相关说明如下:
    222222.png


    我们来简单分析下百度的robots.txt
    ①User-agent:Baiduspider, Googlebot...是针对的搜索引擎
    ②Disallow:/baidu,/s?...禁止这些搜索引擎爬取相应的资源
    ③User-agent: * Disallow: /:禁止其他搜索引擎爬取任何资源,以上列出的除外;

    如果搜索引擎类型没有在百度的robots.txt声明中,禁止该引擎抓取本站的任何资源。

    <2>
    反爬虫策略与应对方式
    robots协议定义了行业规范,但是很多开发者还是会进行暴力爬取,增加服务器负载,占用网络带宽,这就需要制定反爬策略,主要方式有下面几种:
    ①判断User-Agent,是否为浏览器;
    ②判断短时间内同一个IP访问次数;
    ③用户登录后才能访问资源;
    ④短时间用户使用不同IP访问资源,异常登录;
    ⑤验证码,滑动点击验证;
    ⑥数据加解密处理;

    对于不同反爬策略,可以使用不同应对方式:
    ①User-Agent:发起请求时候添加头信息,伪装浏览器;
    ②短时间内访问次数限制:可以使用代理或者延时爬取;
    ③登录后访问:模拟登录保存cookie,请求时添加cookie信息;
    ④异常登录:准备大量账号,绑定不同代理进行爬取;
    ⑤验证码:使用Ocr,机器学习进行处理,但是准确率是一个问题;
    ⑥数据加解密处理:使用对应算法进行破解,或者使用selenium进行抓取;

    本文主要解决User-Agent与短时间内访问次数限制。

    <3>
    例子:伪装浏览器
    我们来看一个例子,使用浏览器访问某主页:http://www.xicidaili.com/ ;能够正常访问;然后使用urllib请求g该主页,代码如下:
    from urllib import request
    url= 'http://www.xicidaili.com/'
    req = request.urlopen(url)
    print(req.code)

    运行出错,结果如下:
    HTTPError                                 Traceback (most recent call last)
    <ipython-input-6-07bc83b0cf79> in <module>()
          1 from urllib import request
          2 url= 'http://www.xicidaili.com/'
    ----> 3 req = request.urlopen(url)
    ... ...
    HTTPError: HTTP Error 503: Service Temporarily Unavailable

    查看浏览器请求头信息与User-Agent:
    33333.png

    当我们使用urllib请求该主页,服务器检查User-Agent,认为这次请求不是浏览器请求,所以拒绝访问;我们可以在访问时添加请求头信息设置User-Agent,代码实现如下:
    from urllib import request
    #user-agent
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'}
    url= 'http://www.xicidaili.com/'
    #创建Request对象,添加user-agent,伪装浏览器
    reqhd = request.Request(url=url, headers=headers)
    req = request.urlopen(reqhd)
    print(req.code)

    输出结果:200。至此,我们成功解决第一个反爬问题。

    帖子永久地址: 

    黑帽联盟 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与黑帽联盟享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和黑帽联盟的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、黑帽联盟管理员和版主有权不事先通知发贴者而删除本文

    勿忘初心,方得始终!
    您需要登录后才可以回帖 登录 | 会员注册

    发布主题 !fastreply! 收藏帖子 返回列表 搜索
    回顶部