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 相关文章推荐
在Python中操作列表之list.extend()方法的使用
May 20 Python
详解Python中的strftime()方法的使用
May 22 Python
python实现批量改文件名称的方法
May 25 Python
Django应用程序中如何发送电子邮件详解
Feb 04 Python
Python中函数eval和ast.literal_eval的区别详解
Aug 10 Python
python数据批量写入ScrolledText的优化方法
Oct 11 Python
详解python使用pip安装第三方库(工具包)速度慢、超时、失败的解决方案
Dec 02 Python
Python实现获取汉字偏旁部首的方法示例【测试可用】
Dec 18 Python
Python之修改图片像素值的方法
Jul 03 Python
python3-flask-3将信息写入日志的实操方法
Nov 12 Python
python中wheel的用法整理
Jun 15 Python
python+selenium自动化实战携带cookies模拟登陆微博
Jan 19 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
坏狼php学习 计数器实例代码
2008/06/15 PHP
PHP 在线翻译函数代码
2009/05/07 PHP
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
使用Json比用string返回数据更友好,也更面向对象一些
2011/09/13 Javascript
JS自定义功能函数实现动态添加网址参数修改网址参数值
2013/08/02 Javascript
jQuery实现按键盘方向键翻页特效
2015/03/18 Javascript
JS实现淡蓝色简洁竖向Tab点击切换效果
2015/10/06 Javascript
jQuery中ajax错误调试分析
2016/12/01 Javascript
详解IWinter 一个路由转控制器的 Nodejs 库
2017/11/15 NodeJs
Vue多种方法实现表头和首列固定的示例代码
2018/02/02 Javascript
解决vue+element 键盘回车事件导致页面刷新的问题
2018/08/25 Javascript
使用zrender.js绘制体温单效果
2019/10/31 Javascript
ES6的异步操作之promise用法和async函数的具体使用
2019/12/06 Javascript
JS实现盒子拖拽效果
2020/02/06 Javascript
js实现简单贪吃蛇游戏
2020/05/15 Javascript
Electron 打包问题:electron-builder 下载各种依赖出错(推荐)
2020/07/09 Javascript
[01:33:25]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第一场 1月24日
2021/03/11 DOTA
python 获取本机ip地址的两个方法
2013/02/25 Python
python中星号变量的几种特殊用法
2016/09/07 Python
使用Python进行AES加密和解密的示例代码
2018/02/02 Python
Python3.5以上版本lxml导入etree报错的解决方案
2019/06/26 Python
pytorch三层全连接层实现手写字母识别方式
2020/01/14 Python
运行tensorflow python程序,限制对GPU和CPU的占用操作
2020/02/06 Python
Python发送手机动态验证码代码实例
2020/02/28 Python
Pyspark获取并处理RDD数据代码实例
2020/03/27 Python
Python3读写ini配置文件的示例
2020/11/06 Python
Python爬虫之Selenium下拉框处理的实现
2020/12/04 Python
Python运算符+与+=的方法实例
2021/02/18 Python
CSS3 @media的基本用法总结
2019/09/10 HTML / CSS
html5如何在Canvas中实现自定义路径动画示例
2017/09/18 HTML / CSS
市场营销专业求职信
2014/06/17 职场文书
物流业务员岗位职责
2015/04/03 职场文书
幼儿园中班教学反思
2016/03/03 职场文书
2016年共产党员个人承诺书
2016/03/24 职场文书
浅谈Python中的函数(def)及参数传递操作
2021/05/25 Python
MySQL中B树索引和B+树索引的区别详解
2022/03/03 MySQL