前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SCRAPY学习笔记八 反反爬虫技术项目实战

SCRAPY学习笔记八 反反爬虫技术项目实战

作者头像
十四君
发布2019-11-27 15:16:54
1.2K0
发布2019-11-27 15:16:54
举报
文章被收录于专栏:UrlteamUrlteam

在爬取简单的页面则很轻松的可以抓取搞定,但是如今一个b***p项目(不透露),需要抓取的网站有比较强悍的反爬虫技术,我们也提高作战技术,汇总并逐步实现反爬虫技术。

拓展链接

首先是一些比较精品的资源收集找了几百个页面还是这些比较浓缩,看完就基本能明白反反爬大概要干嘛了:

基础的反反爬:http://blog.csdn.net/u012150179/article/details/35774323

从爬虫到反反爬的系列教程:http://www.pycoding.com/tags/scrapy/

处理js的方法:http://www.pycoding.com/2016/04/15/scrapy-12.html

ip池和user agent:http://www.tuicool.com/articles/VRfQR3U

还有比较靠谱的知乎回答:http://www.zhihu.com/question/28168585/answer/39882712

携程网爬虫事故:https://segmentfault.com/a/1190000005840672

模拟浏览器框架,selenium+phantomJS框架:http://blog.chinaunix.net/uid-22414998-id-3692113.html

项目分析:

该网站采用的反爬虫机制与规律如下:

1:ip限制请求次数,每天200次

2:过多大量请求会封禁

3:302跳转动态反爬

4:检测是否具有js能力再跳转链接

5:根据cookie决定是否允许

针对每一项的反爬虫,对应的解决方案是:

1:ip池维护(困难类型-淘宝你懂速度慢,或者分布式ip有限。只好V**代理,)

2:减少单ip的请求次数与设定user,减低单进程的爬取速度,将scrapy增加进程提高效率。

3:302跳转则本身scrapy可以协助跳转,但是由于有js检测导致调到js警告页面。

4:通过selenium+phantomJS框架来完成js的操作。

5:cookie则要么完全禁用,但是怀疑该网站有cookie必须项,考虑伪造cookie。

明确大致方案后考虑行动方针:

其中最大的难点并不是要抓什么内容,而在于根本从爬虫访问的时候就不会返回正确的信息,所以只需要测试出能获取200返回就属于成功,在测试阶段,1/2项可以先忽略,首先实现获取。

1:伪造user发送请求

2:禁用cookie,(尝试过,但因为js拦截未知是否成功)

3:伪造cookie,需要解密浏览器的正常访问留下的cookie信息

4:最难点,构建无界面浏览器环境。并且嵌入scrapy的代码中。。

项目实践:

1:伪造user发送请求

scrapy:这部分并不是这三个user可以解决的,需要下载一个几千乃至几万行的user文件,然后每次随机取一个,

scrapy还需要参考一下set的设置。本质上也是处理请求:request.headers.setdefault(‘User-Agent’, ua)

http://www.jb51.net/article/63696.htm

scrapy的我叶补充一下代码:首先是set开启下载器中间件然后,随机选择usr_agent.txt的一行进行设置

        useragents = []
        useragentsock = open(os.path.basename("user_agent.txt"),"r")
        for record in useragentsock:
            useragents.append(record.rstrip("\n"))
        useragentsock.close()
 
        useragent = random.choice(useragents)
        request.headers.setdefault('User-Agent',useragent)

        Agent_list = [
            " Mozilla/4.0compatibleMSIE6.1WindowsXP",
            " Mozilla/5.0WindowsNT6.1WOW64AppleWebKit/535.8KHTML,likeGeckoBeamrise/17.2.0.9Chrome/17.0.939.0Safari/535.8",
            " Mozilla/5.0compatibleYodaoBot-Image/1.0http://www.youdao.com/help/webmaster/spider"
        ]
        Agent = random.choice(Agent_list)
        #print Agent

同时在实现js处理的时候在请求部分也是需要处理js所发送的uesr部分如下
PhantomJS伪装成其他浏览器
在 page 对象的设置项里改变 userAgent 的值,代码如下(模拟 IE6.1 )
var page = require('webpage').create();
page.settings.userAgent = 'Mozilla/4.0 (compatible; MSIE 6.1; Windows XP)';
page.open('http://www.httpuseragent.org', function (status) {
    if (status == 'success') {
        var agent = page.evaluate(function () {
            return document.getElementById('myagent').innerText;
        });
        console.log(agent);
    } else {
    	console.log('cannot open page');
    }
    phantom.exit();
});

2:禁用cookie

所谓cookies,是指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密),禁止cookies也就防止了可能使用cookies识别爬虫轨迹的网站得逞。

使用:

在settings.py中设置COOKIES_ENABLES=False。也就是不启用cookies middleware,不想web server发送cookies。

3:伪造cookie

还没有实践,见下js的两个文档

4:js处理环境

这时候用上大神的分析比较合适

phantomjs事件处理使用简介 基于浏览器引擎的爬虫初探

基于浏览器引擎的爬虫初探

我最后这么处理的

首先安装phantomjs环境,然后在python-scrapy的下载器中间件中,重写请求命令,在发请求之前中断了请求,将请求改成使用phantomjs来调用一个bgp_js.js文件。来使用js处理功能去获取页面信息。再返回unicode代码存储下来。

        try :
            content = os.popen("phantomjs ./bgp_js.js "+url + Agent).read().decode('utf8')
        except:
            print "js处理部分出错"
        try :
            f = open('./save_date/AS'+num_1+'.txt','w')
            print content.encode('utf8')
            f.write(content.encode('utf-8'))
            f.close()
        except:
            print "写入文件错误"

其中这个js文件是:,。注意有一个head是从外部参数调入的。所以要加入user那部分的代码

var system = require('system');
var page = require('webpage').create();
 
var head= system.args[2]
page.settings.userAgent = head
 
page.customHeaders = {
    "Connection" : "keep-alive", 
    "Referer" : "http://bgp.he.net", 
    "Cache-Control" : "max-age=0",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "Accept-Encoding": "gzip,deflate,sdch",
    "Accept-Language": "zh-CN,zh;q=0.8,en;q=0.6",
};
 
var url = system.args[2]
page.settings.loadImages = false;
page.onLoadFinished = function(status) {
    if (page.url == 'http://bgp.he.net/cc') {
        ;
    }
    else {
        console.log(page.content);
        phantom.exit();
    }
};
page.open(url);

5:代理换ip

请见最新10项目跟进。

项目跟进:

目前情况如下

使用js处理技术可以获取到目标信息。

使用分布式redis做多机协调

使用scrapy异步多进程提高效率

使用V**自动脚本跟换ip—》已经改为代理换ip虽然不够稳定但是数量大

效率分析:

目标爬去a网站5.3万个页面,ip200/每日限制。每个页面需要js处理

一分钟约5-10个页面,20分钟换一次ip。耗时10-20s

目标爬取b站,共计2-3亿个页面。ip200/每日限制,不用js处理。大量跟换ip即可。

原创文章,转载请注明: 转载自URl-team

本文链接地址: SCRAPY学习笔记八 反反爬虫技术项目实战

Related posts:

  1. Scrapy-笔记一 入门项目 爬虫抓取w3c网站
  2. Scrapy-笔记二 中文处理以及保存中文数据
  3. Scrapy笔记三 自动多网页爬取-本wordpress博客所有文章
  4. Scrapy笔记五 爬取妹子图网的图片 详细解析
  5. Scrapy笔记零 环境搭建与五大组件架构
  6. scrapy学习笔记十一 scrapy实战效率测评
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-07-152,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 拓展链接
  • 项目分析:
  • 项目实践:
    • 1:伪造user发送请求
      • 2:禁用cookie
        • 3:伪造cookie
          • 4:js处理环境
            • 5:代理换ip
            • 项目跟进:
              • Related posts:
              相关产品与服务
              消息队列 TDMQ
              消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档