前言

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

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


正文

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

一、异常描述

1. 测试代码

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

from urllib.request import urlopen, Requesturl = '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, Requesturl = '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 UserAgentua = 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, Requesturl = '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)

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

  1. urllib.error.HTTPError: HTTP Error 403: Forbidden

    问题: urllib.request.urlopen() 方法经常会被用来打开一个网页的源代码,然后会去分析这个页面源代码,但是对于有的网站使用这种方法时会抛出"HTTP Error 403 ...

  2. downloading Olivetti faces from urllib.error.HTTPError: HTTP Error 403: Forbidden

    最近在学Tensorflow和Sklearn,一个原因是想搞机器视觉,另外一个原因是想探索深入了解一下AI等等方面的知识,例如神经网络等等. 遇到的第一个问题是有些包用不了,一个可能是因为墙墙,另外一 ...

  3. 成功解决urllib.error.HTTPError: HTTP Error 403: Forbidden

    成功解决urllib.error.HTTPError: HTTP Error 403: Forbidden 目录 解决问题 解决思路 解决方法 解决问题 urllib.error.HTTPError: ...

  4. python爬虫之美剧排行榜爬取(加浏览器伪装,代理,异常处理)

    爬取网址:http://www.meijutt.com/alltop_hit.html 爬取内容:排行榜名称 爬取目标:存储到本地文件中 涉及,浏览器伪装,代理服务器,异常处理 代码如下: from ...

  5. Python爬虫的urllib.error.HTTPError: HTTP Error 418错误

    在家办公无聊,最近开始研究了下Python,刚了解了下爬虫,想自己尝试下,一上来就来了一个418的错误. from urllib.request import urlopenurl = 'https: ...

  6. python3.3 urllib.error.HTTPError: HTTP Error 403: Forbidden

    该错误是因为网站禁止爬虫,可以在请求加上模拟的头信息,伪装成浏览器访问. myurl = "" myheaders = {'User-Agent':'Mozilla/5.0 (Wi ...

  7. python之python3.x版本用urllib爬虫出现的module 'urllib' has no attribute 'urlopen'与urllib.error.HTTPError: HTT

    研究pycharm编辑器用Python 3.x的urllib爬一个网页代码如下: 运行报错如下: 在网上查资料可知,Python3.x与Python2.7的差别是urlopen()方法放置模块不同,p ...

  8. python爬虫的技能_python-爬虫技能升级记录

    ====== python-爬虫技能升级记录 ====== ===== (一)感知爬虫及爬取流程 ===== 从简单存取一个页面到 爬取到大量的定量数据,对技术要求更高,以百度百科数据爬取为入门练手项 ...

  9. python爬虫跳过异常处理

    python爬虫跳过异常处理 最近需要用爬虫爬一些图片,但是经常遇到报错如下: requests.exceptions.ConnectionError: HTTPConnectionPool(host ...

最新文章

  1. mysql如何让自增id从某个位置开始设置方法
  2. 求首尾相接的数组的最大子数组和
  3. 有效的Java –创建和销毁对象
  4. openmv串口数据 串口助手_STM32 串口接收不定长数据 STM32 USART空闲检测中断
  5. 学习笔记整理之StringBuffer与StringBulider的线程安全与线程不安全
  6. 山石网科发布山石云·景产品 安全运维管理进入SaaS模式
  7. ubuntu循环登录问题的解决
  8. 硬盘分区模式gpt改成mbr模式_系统硬盘gpt转换的操作方法
  9. android 人脸识别边框_Android相机预览,指定区域显示预览框,在区域内出现人脸进行人脸识别,并抓拍人脸照片存在本地...
  10. navicat11全系列破解教程
  11. Vue项目 设置实时时间(年月日 时分秒)两种方法
  12. 武田收到CHMP同意ALUNBRIG® (brigatinib)用于ALK+非小细胞肺癌一线治疗的肯定意见
  13. 接入翼支付的php,翼支付商户接入规范.doc
  14. stm32花式点流水灯
  15. ThinkPad T480 Win10系统键盘失灵
  16. win10修改用户名
  17. 我的物联网大学【第六章】:个人英雄主义和组织效率的矛盾
  18. 随机森林特征重要性度量
  19. HDU 4833 Best Financing 一脸费用流的dp
  20. ubuntu无法挂载大容量U盘

热门文章

  1. 学习笔记之软件测试4:CSDN账号密码登陆自动化测试实现(Selenium+Unitest)
  2. 使用 Oracle Enterprise Manager Cloud Control 12c 安装和管理 Oracle Data Guard
  3. 12-integer-to-roman
  4. Twitter技术主管回怼马斯克:不懂技术乱评价!马斯克:He’s fired
  5. pod repo update 理解
  6. HDU--1871--细节处理--记忆化暴力查找
  7. 输入一个整数,求各位之和
  8. Excel的检验数据的标准(数据验证-数据的有效性)
  9. cefsharp winform 支持视频播放
  10. 数字分频器设计(偶数分频、奇数分频、小数分频、半整数分频、状态机分频|verilog代码|Testbench|仿真结果)