最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Python之常用反爬虫措施和解决办法(一)

    正文概述    2020-01-05   268

    Python之常用反爬虫措施和解决办法(一)

    一、UserAgent

    UserAgent中文名为用户代理,它使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本等信息。对于一些网站来说,它会检查我们发送的请求中所携带的UserAgent字段,如果非浏览器,就会被识别为爬虫,一旦被识别出来, 我们的爬虫也就无法正常爬取数据了。这里先看一下在不设置UserAgent字段时该字段的值会是什么:

    import requests
    url = "http://www.baidu.com"
    res = requests.get(url)

    代码很简单,就是一个发送请求的代码。运行之前打开Fiddler,然后运行代码,在Fiddler中找到我们发送的请求,就可以看到有如下内容:

    Python之常用反爬虫措施和解决办法(一)

    这时候我们的UserAgent字段的值就是python-requests/2.18.4,很显然这不是一个浏览器的UserAgent,而这样的UserAgent很容易就被识别出来,所以我们在编写爬虫的时候一定要注意添加UserAgent。然后对于一些网站,如果我们一直使用同一个UserAgent去访问,频率高了之后也会被ban掉,这个时候就需要使用随机的UserAgent了。

    解决办法:

    1.收集整理常见的UserAgent以供使用

    ua_list = 
        ["Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_2 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) 
        Version/5.0.2 Mobile/8H7 Safari/6533.18.5",
        "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) 
        Version/5.0.2 Mobile/8H7 Safari/6533.18.5",
        "MQQBrowser/25 (Linux; U; 2.3.3; zh-cn; HTC Desire S Build/GRI40;480*800)",
        "Mozilla/5.0 (Linux; U; Android 2.3.3; zh-cn; HTC_DesireS_S510e Build/GRI40) AppleWebKit/533.1 (KHTML, like 
        Gecko) Version/4.0 Mobile Safari/533.1",
        "Mozilla/5.0 (SymbianOS/9.3; U; Series60/3.2 NokiaE75-1 /110.48.125 Profile/MIDP-2.1 Configuration/CLDC-1.1 ) 
        AppleWebKit/413 (KHTML, like Gecko) Safari/413",
        "Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Mobile/8J2",
        "Mozilla/5.0 (Windows NT 5.2) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30",
        "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari
        /535.1",
        "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/534.51.22 (KHTML, like Gecko) Version/5.1.1 Safari
        /534.51.22",
        "Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile
        /9A5313e Safari/7534.48.3",
        "Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile
        /9A5313e Safari/7534.48.3",
        "Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile
        /9A5313e Safari/7534.48.3",
        "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1",
        "Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; OMNIA7)",
        "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; XBLWP7; ZuneWP7)",
        "Mozilla/5.0 (Windows NT 5.2) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30",
        "Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0",
        "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET4.
        0E; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C)",
        "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET4.0E; .NET CLR 
        3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C)",
        "Mozilla/4.0 (compatible; MSIE 60; Windows NT 5.1; SV1; .NET CLR 2.0.50727)",
        "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; 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)",
        "Opera/9.80 (Windows NT 5.1; U; zh-cn) Presto/2.9.168 Version/11.50",
        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)",
        "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; 
        .NET CLR 3.5.21022; .NET4.0E; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C)",
        "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari
        /533.21.1",
        "Mozilla/5.0 (Windows; U; Windows NT 5.1; ) AppleWebKit/534.12 (KHTML, like Gecko) Maxthon/3.0 Safari/534.12",
        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)"]

    2.使用第三方库--fake_useragent

    使用方法如下:

    from fake_useragent import UserAgent 
    ua = UserAgent()
    for i in range(3):
        print(ua.random)
    # Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36
    # Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36
    # Mozilla/5.0 (X11; Linux i686; rv:21.0) Gecko/20100101 Firefox/21.0

    相关推荐:《Python视频教程》

    二、IP

    对于一些网站来说,如果某个IP在单位时间里的访问次数超过了某个阈值,那么服务器就会ban掉这个IP了,它就会返回给你一些错误的数据。一般来说,当我们的IP被ban了,我们的爬虫也就无法正常获取数据了,但是用浏览器还是可以正常访问,但是如果用浏览器都无法访问,那就真的GG了。很多网站都会对IP进行检测,比如知乎,如果单个IP访问频率过高就会被封掉。

    解决办法:

    使用代理IP。网上有很多免费代理和付费代理可供选择,免费代理比如:西刺代理、快代理等等,付费代理比如:代理云、阿布云等等。除此之外,我们还可以建一个属于自己的代理池以供使用。

    三、Referer防盗链

    防盗链主要是针对客户端请求过程中所携带的一些关键信息来验证请求的合法性,而防盗链又有很多种,比如Referer防盗链、时间戳防盗链等等,这里只讲Referer防盗链。Referer用于告知服务器该请求是从哪个页面链接过来的,比如我们先打开少司命的百度百科:

    Python之常用反爬虫措施和解决办法(一)

    然后打开开发者工具,再查看右侧的图片,能找到如下内容,这里Referer字段就表明我们是从什么页面跳转过去的:

    Python之常用反爬虫措施和解决办法(一)

    但是如果我们直接在浏览器中输入url查看图片的话,是没有Referer的:

    Python之常用反爬虫措施和解决办法(一)

    这里本来有一个例子的,就是妹子图:https://www.mzitu.com,不过现在无法访问了。这个网站的图片就使用了Referer防盗链,如果我们的爬虫没有携带符合要求的Referer字段,就会被识别出来。虽然我们请求的链接是没有问题的,但是因为没有Referer字段,它就不会把真正的图片返回给我们。

    解决办法:

    在请求头headers中添加Referer字段以及相应的值。

    四、在html中动手脚

    首先我不得不佩服那些前端工程师们,为了反爬虫真是想了不少办法,比如JS加密啊JS混淆啊,真是搞得人头大。不过我们这里先说那些在html中动手脚的,比如加一些无意义的字符之类的,这样即使我们能爬下来,得到的数据也是没法使用的。比如部分微信公众号的文章里会穿插一些乱七八糟的字符,这里用这篇文章作为例子:

    Python之常用反爬虫措施和解决办法(一)

    解决办法:

    可以看到每个字前面都加了一个span标签,span标签里加入了一个用于干扰的字符,而且有的还使用了strong标签,这就给我们的解析增加了难度。这里我使用的是lxml解析,解析完之后再对数据做一下清洗,完整代码如下:

    import requests
    from lxml import etree 
    url = "https://mp.weixin.qq.com/s?__biz=MzI0MDYwNjk2OA==&mid=2247484365&idx=4&sn=291a93e8a4ce6e90d3b6ef8b98fe09c4& 
    chksm=e919085ade6e814cc037ecf6a873f22da0e492911a4e539e6f8fdeff022806b4d248c4d54194&scene=4"
    res = requests.get(url)
    et = etree.HTML(res.text)
    lst = et.xpath('//*[@id="js_content"]/p//text()')
    lst = [lst[i] for i in range(1, len(lst), 2)]
    text = ''.join(lst)
    print(text)

    起源地下载网 » Python之常用反爬虫措施和解决办法(一)

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元