python爬虫模拟浏览器的两种方法实例分析


Posted in Python onDecember 09, 2019

本文实例讲述了python爬虫模拟浏览器的两种方法。分享给大家供大家参考,具体如下:

爬虫爬取网站出现403,因为站点做了防爬虫的设置

一、Herders 属性

爬取CSDN博客

import urllib.request
url = "http://blog.csdn.net/hurmishine/article/details/71708030"file = urllib.request.urlopen(url)

爬取结果

urllib.error.HTTPError: HTTP Error 403: Forbidden

这就说明CSDN做了一些设置,来防止别人恶意爬取信息

所以接下来,我们需要让爬虫模拟成浏览器

任意打开一个网页,比如打开百度,然后按F12,此时会出现一个窗口,我们切换到Network标签页,然后点击刷新网站,选中弹出框左侧的“www.baidu.com”,即下图所示:

python爬虫模拟浏览器的两种方法实例分析

往下拖动 我们会看到“User-Agent”字样的一串信息,没错 这就是我们想要的东西。我们将其复制下来。

此时我们得到的信息是:”Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36

接下来我们可以用两种方式来模拟浏览器访问网页。

二、方法1:使用build_opener()修改报头

由于urlopen()不支持一些HTTP的高级功能,所以我们需要修改报头。可以使用urllib.request.build_opener()进行,我们修改一下上面的代码:

import urllib.request
url = "http://blog.csdn.net/hurmishine/article/details/71708030"headers = ("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36")
opener = urllib.request.build_opener()
opener.addheaders = [headers]
data = opener.open(url).read()
print(data)

上面代码中我们先定义一个变量headers来储存User-Agent信息,定义的格式是(“User-Agent”,具体信息)
具体信息我们上面已经获取到了,这个信息获取一次即可,以后爬取其他网站也可以用,所以我们可以保存下来,不用每次都F12去找了。

然后我们用urllib.request.build_opener()创建自定义的opener对象并赋值给opener,然后设置opener的addheaders,就是设置对应的头信息,格式为:“opener(对象名).addheaders = [头信息(即我们储存的具体信息)]”,设置好后我们就可以使用opener对象的open()方法打开对应的网址了。格式:“opener(对象名).open(url地址)”打开后我们可以使用read()方法来读取对应数据,并赋值给data变量。

得到输出结果

b'\r\n<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r\n     \r\n    <html xmlns="http://www.w3.org/1999/xhtml">\r\n    \r\n<head>  \r\n\r\n            <link rel="canonical" href="http://blog.csdn.net/hurmishine/article/details/71708030" rel="external nofollow" /> ...

三、方法2:使用add_header()添加报头

除了上面的这种方法,还可以使用urllib.request.Request()下的add_header()实现浏览器的模拟。

先上代码

import urllib.request
url = "http://blog.csdn.net/hurmishine/article/details/71708030"req = urllib.request.Request(url)
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36')
data = urllib.request.urlopen(req).read()
print(data)

好,我们来分析一下。

导入包,定义url地址我们就不说了,我们使用urllib.request.Request(url)创建一个Request对象,并赋值给变量req,创建Request对象的格式:urllib.request.Request(url地址)

随后我们使用add_header()方法添加对应的报头信息,格式:Request(对象名).add_header(‘对象名','对象值')

现在我们已经设置好了报头,然后我们使用urlopen()打开该Request对象即可打开对应的网址,多以我们使用

data = urllib.request.urlopen(req).read()打开了对应的网址,并读取了网页内容,并赋值给data变量。

以上,我们使用了两种方法实现了爬虫模拟浏览器打开网址,并获取网址的内容信息,避免了403错误。

值得我们注意的是,方法1中使用的是addheaders()方法,方法2中使用的是add_header()方法,注意末尾有无s以及有无下划线的区别

更多关于Python相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
kNN算法python实现和简单数字识别的方法
Nov 18 Python
python中的__slots__使用示例
Feb 26 Python
python logging 日志轮转文件不删除问题的解决方法
Aug 02 Python
python中装饰器级连的使用方法示例
Sep 29 Python
Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法
May 04 Python
python3使用SMTP发送简单文本邮件
Jun 19 Python
使用matplotlib中scatter方法画散点图
Mar 19 Python
python 生成器和迭代器的原理解析
Oct 12 Python
python实现人像动漫化的示例代码
May 17 Python
Python 解决相对路径问题:&quot;No such file or directory&quot;
Jun 05 Python
Tensorflow与Keras自适应使用显存方式
Jun 22 Python
Python使用Web框架Flask开发项目
Jun 01 Python
Python二次规划和线性规划使用实例
Dec 09 #Python
Python Numpy数组扩展repeat和tile使用实例解析
Dec 09 #Python
如何将 awk 脚本移植到 Python
Dec 09 #Python
Python 读取 YUV(NV12) 视频文件实例
Dec 09 #Python
基于YUV 数据格式详解及python实现方式
Dec 09 #Python
Python编写一个验证码图片数据标注GUI程序附源码
Dec 09 #Python
Python内置方法实现字符串的秘钥加解密(推荐)
Dec 09 #Python
You might like
解析Linux下Varnish缓存的配置优化
2013/06/20 PHP
WordPress分页伪静态加html后缀
2016/06/08 PHP
eclipse php wamp配置教程
2016/06/30 PHP
Yii隐藏URL中index.php的方法
2016/07/12 PHP
jquery中checkbox全选失效的解决方法
2014/12/26 Javascript
jQuery旋转木马式幻灯片轮播特效
2015/12/04 Javascript
JS实现复制功能
2017/03/01 Javascript
AngularJS路由切换实现方法分析
2017/03/17 Javascript
VUE前端cookie简单操作
2017/10/17 Javascript
微信小程序icon组件使用详解
2018/01/31 Javascript
详解Node 定时器
2018/02/26 Javascript
Webpack中publicPath路径问题详解
2018/05/03 Javascript
浅析Proxy可以优化vue的数据监听机制问题及实现思路
2018/11/29 Javascript
VueJS 组件参数名命名与组件属性转化问题
2018/12/03 Javascript
Angular请求防抖处理第一次请求失效问题
2019/05/17 Javascript
vue实现div可拖动位置也可改变盒子大小的原理
2020/09/16 Javascript
[43:24]VG vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
[47:38]Optic vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
web.py在模板中输出美元符号的方法
2014/08/26 Python
python中正则表达式的使用详解
2014/10/17 Python
分享Python开发中要注意的十个小贴士
2016/08/30 Python
Django model select的多种用法详解
2019/07/16 Python
python os.fork() 循环输出方法
2019/08/08 Python
python实现简单颜色识别程序
2020/02/19 Python
解决python cv2.imread 读取中文路径的图片返回为None的问题
2020/06/02 Python
印度在线杂货店:bigbasket
2018/08/23 全球购物
美国运动鞋和服装网上商店:YCMC
2018/09/15 全球购物
如何清空Session
2015/02/23 面试题
法人授权委托书范本
2014/04/04 职场文书
还款承诺书范文
2014/05/20 职场文书
安全生产知识竞赛活动总结
2014/07/07 职场文书
幼儿园中班教师个人工作总结
2015/02/06 职场文书
项目经理助理岗位职责
2015/04/13 职场文书
宾馆卫生管理制度
2015/08/06 职场文书
2016大一新生军训感言
2015/12/08 职场文书
RestTemplate如何通过HTTP Basic Auth认证示例说明
2022/03/17 Java/Android