Python爬虫HTTP异常:rllib.error.HTTPError: HTTP Error 418,伪装User-Agent以及fake-useragent插件的妙用

前言

        刚开始学习 Python 的时候,一般都会遇到这个问题,因为我们只是简单的想要打开一个 url 爬取返回的 Html,没有考虑太多,却没有想到会被浏览器的反爬虫手段识别出来,最终请求什么也没获取到。       

        通过本篇,你将学会如何将自己的【爬虫程序伪装成浏览器请求】,巧妙运用 fake-useragent 插件,并且学会破解【身份鉴别】类的反爬虫程序。


正文

        针对这个问题,我查阅了许多前辈的博客,并且亲自编写的了大量代码测试,总结出了下面的几种场景。

一、异常描述

1. 测试代码

        下面是我在本地写的测试代码,模拟爬取【豆瓣电影最近一周排行榜】,别纠结为什么爬虫程序总拿“豆瓣电影”开刀,哈哈,我也替豆瓣感到无奈。

from urllib.request import urlopen, Request

url = 'https://movie.douban.com/chart'
res = urlopen(url)
data = res.read().decode('utf-8')
print(data)
# 省略处理 html 数据的部分

2. Http Error:

        由上面的代码引发的“rllib.error.HTTPError: HTTP Error 418”异常:

3. 异常解读

        rllib.error.HTTPError: HTTP Error 418:爬虫程序被浏览器发现了


二、原因分析

        反爬虫手段里有一种方式,叫做【身份鉴别】,做法就是:通过 request-headers 里面的 User-Agent 信息,判定请求真实来自于浏览器,而不是接口形式的访问。

        同理,为了达到爬虫的目的,我们要做的就是把请求伪装成浏览器请求,即:在 request 中增加 Headers 以及 User-Agent 属性。

1. 什么是 User-Agent

        User Agent中文名为用户代理,简称 UA,它是一个特殊的字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。

        常常要用server抓资料时,都会碰到直接使用 wget 和 curl 被服务器拒绝的状况。通常简单加个user-agent伪装一下就会过了。

2. User-Agent 网页查询方法

        以【豆瓣电影最近一周排行榜】为例,哈哈,豆瓣又躺枪了:

  • 首先,在浏览器中打开网页;
  • 然后,F12 → NetWork → 找到请求接口,本例中是“chart” ;
  • 最后,请求 Request - Headers 里面找到 User-Agent 属性。


三、解决办法

        上面提到了,针对【HTTP Error 418】异常,唯一的方法就是想办法伪装 User-Agent,下面提供3种常用方法:

1. 直接写死

from urllib.request import urlopen, Request

url = 'https://movie.douban.com/chart'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
ret = Request(url, headers=headers)
res = urlopen(ret)
data = res.read().decode('utf-8')
print(data)
# 省略处理 html 数据的部分

       效果展示:(后续需要对html数据进行清洗,才能得到最终的排行榜)

 2. 随机获取

       对于 User-Agent 伪装浏览器这一步操作,用的多了就会发现:User-Agent​​​​​​​ 并不是动态的。简而言之,User-Agent​​​​​​​ 不需要每次都按照上面的方法查询,是可以预定义的。

        所以,我们可以写一个集合,然后每次随机取一个使用:既能伪装成浏览器,还能降低IP被封掉的风险。

# 常见的 user-agent 列表
headers_list = [
    {
        'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'
    }, {
        'user-agent': 'Mozilla/5.0 (Linux; Android 8.0.0; SM-G955U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Mobile Safari/537.36'
    }, {
        'user-agent': 'Mozilla/5.0 (Linux; Android 10; SM-G981B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Mobile Safari/537.36'
    }, {
        'user-agent': 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML like Gecko) Version/7.2.1.0 Safari/536.2+'
    }, {
        'user-agent': 'Mozilla/5.0 (Linux; U; Android 4.0; en-us; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30'
    }, {
        'user-agent': 'Mozilla/5.0 (Linux; Android 8.0.0; SM-G965U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.111 Mobile Safari/537.36'
    }, {
        'user-agent': 'Mozilla/5.0 (Linux; Android 8.1.0; SM-T837A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.80 Safari/537.36'
    },{
        'user-agent': 'Mozilla/5.0 (Linux; Android 6.0.1; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Mobile Safari/537.36'
    }, {
        'user-agent': 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 10 Build/MOB31T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'
    }, {
        'user-agent': 'Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Mobile Safari/537.36'
    }, {
        'user-agent': 'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 520)'
    }, {
        'user-agent': 'Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13'
    }, {
        'user-agent': 'Mozilla/5.0 (Linux; Android 9; Pixel 3 Build/PQ1A.181105.017.A1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.158 Mobile Safari/537.36'
    }, {
        'user-agent': 'Mozilla/5.0 (Linux; Android 10; Pixel 4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Mobile Safari/537.36'
    },  {
        'user-agent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1'
    }
]
 
headers = random.choice(headers_list)

3. 使用 fake-useragent 插件

        和上面的原理相同,也是每次随机一个User-Agent,但是 fake-useragent 插件省略了预定义的流程,直接帮你生成一个,个人觉得很好用。

  • 在【Terminal】控制台"pip install fake-useragent"命令导入,或者在 Pycharm - Settings - Python Interpreter 导入插件:

  • 测试代码
from fake_useragent import UserAgent

ua = UserAgent()
print(ua.ie)        # 随机打印ie浏览器任意版本
print(ua.firefox)   # 随机打印firefox浏览器任意版本
print(ua.chrome)    # 随机打印chrome浏览器任意版本
print(ua.random)    # 随机打印任意厂家的浏览器
  • 结果展示
# 第一次打印
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; chromeframe/13.0.782.215)
Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20100101 Firefox/21.0
Mozilla/5.0 (X11; CrOS i686 4319.74.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1664.3 Safari/537.36

# 第二次打印
Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)
Mozilla/5.0 (Windows NT 6.2; rv:22.0) Gecko/20130405 Firefox/23.0
Mozilla/5.0 (X11; CrOS i686 3912.101.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36
Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1866.237 Safari/537.36
  • fake-useragent 使用
from fake_useragent import UserAgent
from urllib.request import urlopen, Request

url = 'https://movie.douban.com/chart'
headers = {'User-Agent': UserAgent().random}
ret = Request(url, headers=headers)
res = urlopen(ret)
data = res.read().decode('utf-8')
print(data)

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java Punk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值