python爬虫 urllib模块反爬虫机制UA详解


Posted in Python onAugust 20, 2019

方法: 使用urlencode函数

urllib.request.urlopen()

import urllib.request
import urllib.parse
url = 'https://www.sogou.com/web?'
#将get请求中url携带的参数封装至字典中
param = {
  'query':'周杰伦'
}
#对url中的非ascii进行编码
param = urllib.parse.urlencode(param)
#将编码后的数据值拼接回url中
url += param 
response = urllib.request.urlopen(url=url)
data = response.read()
with open('./周杰伦1.html','wb') as fp:
  fp.write(data)
print('写入文件完毕')

开发者工具浏览器按F12或者右键按检查 ,有个抓包工具network,刷新页面,可以看到网页资源,可以看到请求头信息,UA

在抓包工具点击任意请求,可以看到所有请求信息,向应信息,

主要用到headers,response,response headers存放响应头信息,request headers 存放请求信息

python爬虫 urllib模块反爬虫机制UA详解

python爬虫 urllib模块反爬虫机制UA详解

反爬出机制:网站会检查请求的UA,如果发现UA是爬虫程序,会拒绝提供网站页面数据。

如果网站检查发现请求UA是基于某一款浏览器标识(浏览器发起的请求),网站会认为请求是正常请求,会把页面数据响应信息给客户端

User-Agent(UA):请求载体的身份标识

反反爬虫机制:

伪造爬虫程序的请求的UA,把爬虫程序的请求UA伪造成谷歌标识,火狐标识

通过自定义请求对象,用于伪装爬虫程序请求的身份。

User-Agent参数,简称为UA,该参数的作用是用于表明本次请求载体的身份标识。如果我们通过浏览器发起的请求,则该请求的载体为当前浏览器,则UA参数的值表明的是当前浏览器的身份标识表示的一串数据。

如果我们使用爬虫程序发起的一个请求,则该请求的载体为爬虫程序,那么该请求的UA为爬虫程序的身份标识表示的一串数据。

有些网站会通过辨别请求的UA来判别该请求的载体是否为爬虫程序,如果为爬虫程序,则不会给该请求返回响应,那么我们的爬虫程序则也无法通过请求爬取到该网站中的数据值,这也是反爬虫的一种初级技术手段。那么为了防止该问题的出现,则我们可以给爬虫程序的UA进行伪装,伪装成某款浏览器的身份标识。

上述案例中,我们是通过request模块中的urlopen发起的请求,该请求对象为urllib中内置的默认请求对象,我们无法对其进行UA进行更改操作。urllib还为我们提供了一种自定义请求对象的方式,我们可以通过自定义请求对象的方式,给该请求对象中的UA进行伪装(更改)操作。

自定义请求头信息字典可以添加谷歌浏览器的UA标识,自定义请求对象来伪装成谷歌UA

1.封装自定义的请求头信息的字典,

2.注意:在headers字典中可以封装任意的请求头信息

3.将浏览器的UA数据获取,封装到一个字典中。该UA值可以通过抓包工具或者浏览器自带的开发者工具中获取某请求,
从中获取UA的值

import urllib.request
import urllib.parse
url = 'https://www.sogou.com/web?query='
# url的特性:url不可以存在非ASCII编码字符数据
word = urllib.parse.quote("周杰伦")
# 将编码后的数据值拼接回url中
url = url+word # 有效url
# 发请求之前对请求的UA进行伪造,伪造完再对请求url发起请求
# UA伪造
# 1 子制定一个请求对象,headers是请求头信息,字典形式
# 封装自定义的请求头信息的字典,
# 注意:在headers字典中可以封装任意的请求头信息
headers = {
  # 存储任意的请求头信息
  'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
}
# 该请求对象的UA进行了成功的伪装
request = urllib.request.Request(url=url, headers=headers)
# 2.针对自定义请求对象发起请求
response = urllib.request.urlopen(request)
# 3.获取响应对象中的页面数据:read函数可以获取响应对象中存储的页面数据(byte类型的数据值)
page_text = response.read()
# 4.持久化存储:将爬取的页面数据写入文件进行保存
with open("周杰伦.html","wb") as f:
  f.write(page_text)
print("写入数据成功")

这样就可以突破网站的反爬机制

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用Python实现一个简单的能够发送带附件的邮件程序的教程
Apr 08 Python
python获得linux下所有挂载点(mount points)的方法
Apr 29 Python
Python基于smtplib实现异步发送邮件服务
May 28 Python
python中requests小技巧
May 10 Python
python将unicode转为str的方法
Jun 21 Python
matplotlib savefig 保存图片大小的实例
May 24 Python
python生成1行四列全2矩阵的方法
Aug 04 Python
pyqt5的QWebEngineView 使用模板的方法
Aug 18 Python
python基于Selenium的web自动化框架
Jul 14 Python
python实现简单学生信息管理系统
Apr 09 Python
Python正则re模块使用步骤及原理解析
Aug 18 Python
python标准库ElementTree处理xml
May 20 Python
Pytorch 抽取vgg各层并进行定制化处理的方法
Aug 20 #Python
python实现抠图给证件照换背景源码
Aug 20 #Python
python爬虫 基于requests模块发起ajax的get请求实现解析
Aug 20 #Python
pytorch 在sequential中使用view来reshape的例子
Aug 20 #Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
Aug 20 #Python
python实现证件照换底功能
Aug 20 #Python
pytorch多进程加速及代码优化方法
Aug 19 #Python
You might like
Yii框架登录流程分析
2014/12/03 PHP
php实现多维数组中每个单元值(数字)翻倍的方法
2015/02/16 PHP
jquery imgareaselect 使用利用js与程序结合实现图片剪切
2009/07/30 Javascript
javascript json 新手入门文档
2009/12/03 Javascript
jquery 单引号和双引号的区别及使用注意
2013/07/31 Javascript
根据身份证号自动输出相关信息(籍贯,出身日期,性别)
2013/11/15 Javascript
JavaScript获取网页、浏览器、屏幕高度和宽度汇总
2014/12/18 Javascript
js控制文本框输入的字符类型方法汇总
2015/06/19 Javascript
对于jQuery性能的一些优化建议
2015/08/13 Javascript
在Html中使用Requirejs进行模块化开发实例详解
2016/04/15 Javascript
JavaScript鼠标事件,点击鼠标右键,弹出div的简单实例
2016/08/03 Javascript
JAVA中截取字符串substring用法详解
2017/04/14 Javascript
Angular父组件调用子组件的方法
2018/04/02 Javascript
浅析Vue 生命周期
2018/06/21 Javascript
Angular.JS读取数据库数据调用完整实例
2019/07/02 Javascript
微信小程序 bindtap 传参的实例代码
2020/02/21 Javascript
vue+iview框架实现左侧动态菜单功能的示例代码
2020/07/23 Javascript
使用AutoJs实现微信抢红包的代码
2020/12/31 Javascript
python实现获取序列中最小的几个元素
2014/09/25 Python
利用python 更新ssh 远程代码 操作远程服务器的实现代码
2018/02/08 Python
python学生管理系统代码实现
2020/04/05 Python
python redis 删除key脚本的实例
2019/02/19 Python
Python with用法:自动关闭文件进程
2019/07/10 Python
Django项目主urls导入应用中views的红线问题解决
2019/08/10 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
2020/04/15 Python
python如何求100以内的素数
2020/05/27 Python
python如何编写win程序
2020/06/08 Python
如何利用python生成MD5并去重
2020/12/07 Python
Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单
2021/02/01 Python
美国名牌太阳镜折扣网站:Eyedictive
2017/05/15 全球购物
葡萄牙语专业个人求职信
2013/12/10 职场文书
大学生旅游业创业计划书
2014/01/29 职场文书
中学生社会实践教育活动总结
2015/05/06 职场文书
2015年信息宣传工作总结
2015/05/26 职场文书
雄兵连:第三季先行图公开,天使恶魔联合,银河之力的新力量
2021/06/11 国漫
Spring Boot项目传参校验的最佳实践指南
2022/04/05 Java/Android