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程序中自定义异常的方法
Oct 16 Python
python读取中文txt文本的方法
Apr 12 Python
Python把对应格式的csv文件转换成字典类型存储脚本的方法
Feb 12 Python
Python爬虫:url中带字典列表参数的编码转换方法
Aug 21 Python
Python笔记之观察者模式
Nov 20 Python
python列表生成器迭代器实例解析
Dec 19 Python
TensorFlow tf.nn.conv2d实现卷积的方式
Jan 03 Python
Django之腾讯云短信的实现
Jun 12 Python
Python无损压缩图片的示例代码
Aug 06 Python
Python操作word文档插入图片和表格的实例演示
Oct 25 Python
python中@property的作用和getter setter的解释
Dec 22 Python
PyTorch 如何自动计算梯度
May 23 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
php 用checkbox一次性删除多条记录的方法
2010/02/23 PHP
CodeIgniter框架提示Disallowed Key Characters的解决办法
2014/04/21 PHP
CodeIgniter输出中文乱码的两种解决办法
2014/06/12 PHP
ThinkPHP添加更新标签的方法
2014/12/05 PHP
PHP实现阳历到农历转换的类实例
2015/03/07 PHP
PHP输出九九乘法表代码实例
2015/03/27 PHP
PHP SplObjectStorage使用实例
2015/05/12 PHP
PHP错误处理函数register_shutdown_function使用示例
2017/07/03 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
关于jQuery中的end()使用方法
2011/07/10 Javascript
js关闭浏览器窗口及检查浏览器关闭事件
2013/09/03 Javascript
JS小功能(操作Table--动态添加删除表格及数据)实现代码
2013/11/28 Javascript
巧用jquery解决下拉菜单被Div遮挡的相关问题
2014/02/13 Javascript
Jquery仿IGoogle实现可拖动窗口示例代码
2014/08/22 Javascript
使用jQuery jqPlot插件绘制柱状图
2014/12/18 Javascript
使用BootStrapValidator完成前端输入验证
2016/09/28 Javascript
JS中如何实现点击a标签返回页面顶部的问题
2017/01/19 Javascript
jQuery插件FusionCharts绘制的3D环饼图效果示例【附demo源码】
2017/04/02 jQuery
详解vue.js 开发环境搭建最简单攻略
2017/06/12 Javascript
nodejs对express中next函数的一些理解
2017/09/08 NodeJs
移动端网页开发调试神器Eruda的介绍与使用技巧
2017/10/30 Javascript
JS实现图片切换效果
2018/11/17 Javascript
Electron 如何调用本地模块的方法
2019/02/01 Javascript
浅谈Webpack多页应用HMR卡住问题
2019/04/24 Javascript
js实现随机8位验证码
2020/07/24 Javascript
微信小程序自定义多列选择器使用详解
2019/06/21 Javascript
微信小程序实现页面浮动导航
2020/01/08 Javascript
小程序实现图片移动缩放效果
2020/05/26 Javascript
Python使用ftplib实现简易FTP客户端的方法
2015/06/03 Python
详解python中的Turtle函数库
2018/11/19 Python
对python中词典的values值的修改或新增KEY详解
2019/01/20 Python
使用Keras 实现查看model weights .h5 文件的内容
2020/06/09 Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
2020/06/18 Python
阿里健康大药房:阿里自营网上药店
2017/08/01 全球购物
SQL注入攻击的种类有哪些
2013/12/30 面试题
《自己的花是让别人看的》教学反思
2016/02/19 职场文书