美文网首页我爱编程
2018-03-05-从零开始的反反爬(一)

2018-03-05-从零开始的反反爬(一)

作者: 0xC00005 | 来源:发表于2018-03-06 12:47 被阅读0次

    前言

    在某个接单网站上还真被我遇到识别ip的反爬了,这个没得治没得治【锤】
    怕不是要打一枪换一个地方【每爬1000条换一个ip】

    然后就想到基于headers的识别浏览器头信息来反爬的技术【你们玩战术的心都脏】
    然后作者就准备做一个跑裤子的headers更换,真正实现清真的打一枪换一个地方【看起来是这样】

    正文

    下面引用逼乎下面某大佬的话,目前市面上反爬就这三种等级:

    0x1 不充钱的-常见的反爬

    网站分析下面几个内容:

    • 用户请求的Headers
    • 用户行为
    • 网站目录和数据加载方式

    前两种比较容易遇到,大多数网站都从这些角度来反爬虫。
    第三种一些应用ajax(懒得要死-异步加载)的网站会采用,这样增大了爬取的难度。

    0x02 会员VIP-通过Headers反爬虫

    从用户请求的Headers反爬虫是最常见的反爬虫策略。
    很多网站都会对Headers的User-Agent进行检测,还有一部分网站会对Referer进行检测(一些资源网站的防盗链就是检测Referer)。
    如果遇到了这类反爬虫机制,可以直接在爬虫中添加Headers,将浏览器的User-Agent复制到爬虫的Headers中;或者将Referer值修改为目标网站域名。
    对于检测Headers的反爬虫,在爬虫中修改或者添加Headers就能很好的绕过。
    我们这篇文章就来写一个最基础的requests.get的反爬

    0x03 超级会员SVIP-基于用户行为反爬虫

    还有一部分网站是通过检测用户行为,例如同一IP短时间内多次访问同一页面,或者同一账户短时间内多次进行相同操作。

    大多数网站都是前一种情况,对于这种情况,使用IP代理就可以解决。可以专门写一个爬虫,爬取网上公开的代理ip,检测后全部保存起来。这样的代理ip爬虫经常会用到,最好自己准备一个。有了大量代理ip后可以每请求几次更换一个ip,这在requests或者urllib2中 “很容易做到” ,这样就能很容易的绕过第一种反爬虫。

    对于第二种情况,可以在每次请求后随机间隔几秒再进行下一次请求。有些有 “逻辑漏洞 ” 的网站,可以通过请求几次,退出登录,重新登录,继续请求来绕过同一账号短时间内不能多次进行相同请求的限制。
    【看吧我就说了玩战术的心都脏】

    0x04 军区阔站-动态页面 or 控件加密

    还有一部分网站,我们需要爬取的数据是通过ajax请求得到,或者通过JavaScript生成的。首先用Firebug或者HttpFox对网络请求进行分析。如果能够找到ajax请求,也能分析出具体的参数和响应的具体含义,我们就能采用上面的方法,直接利用requests或者urllib2模拟ajax请求,对响应的json进行分析得到需要的数据。
    【写个鸡儿啊回家睡觉去了】

    能够直接模拟ajax请求获取数据固然是极好的,但是有些网站把ajax请求的所有参数全部加密了。我们根本没办法构造自己所需要的数据的请求。我这几天爬的那个网站就是这样,除了加密ajax参数,它还把一些基本的功能都封装了,全部都是在调用自己的接口,而接口参数都是加密的。遇到这样的网站,我们就不能用上面的方法了,我用的是selenium+phantomJS框架,调用浏览器内核,并利用phantomJS执行js来模拟人为操作以及触发页面中的js脚本。从填写表单到点击按钮再到滚动页面,全部都可以模拟,不考虑具体的请求和响应过程,只是完完整整的把人浏览页面获取数据的过程模拟一遍。
    【日常任务:暴力模拟 1/1】

    用这套框架几乎能绕过大多数的反爬虫,因为它不是在伪装成浏览器来获取数据(上述的通过添加 Headers一定程度上就是为了伪装成浏览器),它本身就是浏览器,phantomJS就是一个没有界面的浏览器,只是操控这个浏览器的不是人。利用 selenium+phantomJS能干很多事情,例如识别点触式(12306)或者滑动式的验证码,对页面表单进行暴力破解等等。它在自动化渗透中还 会大展身手。

    辣怎么绕过user-again的识别呢?

    你家python说到底就不是一个浏览器只会请求请求请求的
    人家浏览器可都是堂堂正正有身份,有户口,有照片的
    在Chrome浏览器里面访问chrome://version/就可以看到

    用户代理里面的信息就是user-again

    典型的三无黑户.....
    浏览器在请求的时候这些信息都写在user-again里面发给服务器了呢,管你爱看不看的
    平时都不怎么查,爬爬什么豆瓣也就算了
    结果你要爬B站?
    你们要拦你下车查驾照

    所以呢?

    伪造证件【消歧义】

    在requests.get的时候,伪造一个证件给B站的老司机交警
    “嘿同志,我是大伟哥浏览器来的”
    “诶不对啊今天你已经通过这个路口1000次了,太快了吧,禁止通行!”

    随便跑个库,random一下
    “现在我是小伟哥浏览器了”
    “行行行,懒得跟你折腾”

    准备阶段

    只需要导入random!
    如果你懒到一种境界了可以把get也写进去

    然后到requests的官网翻翻看看,发现已经直接给出栗子了:

    定制请求头

    如果你想为请求添加 HTTP 头部,只要简单地传一个 dictheaders 参数就可以了。

    例如,在前一个示例中我们没有指定 content-type:

    >>> url = 'https://api.github.com/some/endpoint'
    >>> headers = {'user-agent': 'my-app/0.0.1'}
    
    >>> r = requests.get(url, headers=headers)
    

    然后就来找一找user-again大去
    随便百度一下推荐第一个置顶的质量不错

    代码

    # -*- coding: utf-8 -*-
    """
    Created on Sat Feb 24 16:19:43 2018
    
    @author: Max Zhang
    """
    import random
    
    user_agent='''Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5
    Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5
    Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5
    Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5
    Mozilla/5.0 (Linux; U; Android 2.2.1; zh-cn; HTC_Wildfire_A3333 Build/FRG83D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
    Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
    Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/20.0.019; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.18124
    Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60
    Opera/8.0 (Windows NT 5.1; U; en)
    Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50
    Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50
    Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0
    Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10
    Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2
    Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36
    Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11
    Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16
    Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36
    Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
    Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER
    Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)
    Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)"
    Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11
    Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER
    Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)
    Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)"
    Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)
    Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)
    Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0
    Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; SE 2.X MetaSr 1.0)
    Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36
    Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36'''
    
    
    def headers():
        header=user_agent.split('\n')
        length=len(header)
        #模式1,自定义headers
        #return header[random.randint(0,length-1)]
        #模式2,全自动headers【其实就是把返回值变成了一个元组但是节省了很多步骤】
        return {'user-agent':header[random.randint(0,length-1)]}
    

    使用的时候直接调用requests.get(URL,headers=headers())就ojbk了

    后记

    灵感来源于B站上面潭州教育的公开课【真的假的】
    【Bilibili:我们致力于做全世界最好的教育】
    【达成成就:我甚至在B站上看人工智能和神经网络的数论】

    喜欢的同学可以去我收藏夹里面找找??

    最后的最后

    来Max小姐姐的博客点星星吧亲
    爱你~

    相关文章

      网友评论

        本文标题:2018-03-05-从零开始的反反爬(一)

        本文链接:https://www.haomeiwen.com/subject/timlfftx.html