七 web爬虫讲解2—urllib库爬虫—状态吗—异常处理—浏览器伪装技术、设置用户代理...

如果爬虫没有异常处理,那么爬行中一旦出现错误,程序将崩溃停止工作,有异常处理即使出现错误也能继续执行下去

 

1.常见状态吗

301:重定向到新的URL,永久性
302:重定向到临时URL,非永久性
304:请求的资源未更新
400:非法请求
401:请求未经授权
403:禁止访问
404:没找到对应页面
500:服务器内部出现错误
501:服务器不支持实现请求所需要的功能

 

2.异常处理

URLError捕获异常信息

复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-import urllib.request
import urllib.errortry:                                    #尝试执行里面的内容html = urllib.request.urlopen('http://www.xiaohuar.com/').read().decode("utf-8")print(html)except urllib.error.URLError as e:      #如果出现错误if hasattr(e,"code"):               #如果有错误代码print(e.code)                   #打印错误代码if hasattr(e,"reason"):             #如果有错误信息print(e.reason)                 #打印错误信息#返回   说明网站禁止了爬虫访问
# 403
# Forbidden
复制代码

 

浏览器伪装技术

很多网站,做了反爬技术,一般在后台检测请求头信息里是否有User-Agent浏览器信息,如果没有说明不是浏览器访问,就屏蔽了这次请求

所以,我们需要伪装浏览器报头来请求

 

复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-import urllib.request
url = 'https://www.qiushibaike.com/'                    #抓取页面URL
tou = ('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0')  #设置模拟浏览器报头
b_tou = urllib.request.build_opener()               #创建请求对象
b_tou.addheaders=[tou]                              #添加报头
html = b_tou.open(url).read().decode("utf-8")       #开始抓取页面
print(html)
复制代码

 

注意:我们可以看到这次请求并不是用urlopen()方法请求的,此时用urlopen()无法请求,但是我们就会感觉到这样很费劲,难道每次请求都要创建build_opener(),所以我们需要设置使用urlopen()方法请求自动报头

 

设置使用urlopen()方法请求自动报头,也就是设置用户代理

install_opener()将报头信息设置为全局,urlopen()方法请求时也会自动添加报头

复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-import urllib.request
#设置报头信息
tou = ('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0')  #设置模拟浏览器报头
b_tou = urllib.request.build_opener()               #创建请求对象
b_tou.addheaders=[tou]                              #添加报头到请求对象
#将报头信息设置为全局,urlopen()方法请求时也会自动添加报头
urllib.request.install_opener(b_tou)#请求
url = 'https://www.qiushibaike.com/'
html = urllib.request.urlopen(url).read().decode("utf-8")
print(html)
复制代码

 

创建用户代理池

 

复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-import urllib.request
import random   #引入随机模块文件def yh_dl():    #创建用户代理池yhdl = ['Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50','Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0','Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)','Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1','Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1','Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11','Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser)','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)','Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5','User-Agent:Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5','Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5','Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1','Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/build-1107180945; U; en-GB) Presto/2.8.149 Version/11.10','Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13','Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en) AppleWebKit/534.1+ (KHTML, like Gecko) Version/6.0.0.337 Mobile Safari/534.1+','Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Titan)','UCWEB7.0.2.37/28/999','NOKIA5700/ UCWEB7.0.2.37/28/999','Openwave/ UCWEB7.0.2.37/28/999','Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/999']thisua = random.choice(yhdl)                    #随机获取代理信息headers = ("User-Agent",thisua)                 #拼接报头信息opener = urllib.request.build_opener()          #创建请求对象opener.addheaders=[headers]                     #添加报头到请求对象urllib.request.install_opener(opener)           #将报头信息设置为全局,urlopen()方法请求时也会自动添加报头#请求
yh_dl()     #执行用户代理池函数
url = 'https://www.qiushibaike.com/'
html = urllib.request.urlopen(url).read().decode("utf-8")
print(html)
复制代码

 

这样爬虫会随机调用,用户代理,也就是随机报头,保证每次报头信息不一样

转载于:https://www.cnblogs.com/meng-wei-zhi/p/8182538.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DVI和HDMI中的TMDS接口协议

TMDS(Transition Minimized Differential signal),即过渡调制差分信号,也被称为最小化传输差分信号,是指通过异或及异或非等逻辑算法将原始信号数据转换成10位,前8为数据由原始信号经运算后获得&#xff0c…

君子眼中皆好人

从前有个国王,在晚年时思量 着:“我有两个儿子,我应该把王位传给哪个儿子来统治这个国家呢?”国王决定考验一下他的两位王子,哪位最是忠义仁厚,爱护老百姓的明君。国王叫来长子, 对他说&#xf…

GS使用HTTPS登录的设置过程

1. Windows 增加角色服务 服务器配置管理器, 添加角色服务 增加角色功能里面有: 证书颁发机构 证书颁发机构 web注册 2. AD CS配置 主要是next操作 独立ca 根证书 等 3. inetmgr申请证书 在机器名的一层及上面申请证书 保存证书信息 用来使用CA机构进行签…

TMDS的信号通道

1 TMDS的信号通道: 1个HDMI包括3个TMDS数据通道和1个TMDS时钟通道。 . 每一个TMDS时钟周期内,TMDS数据通道上会发送一个10位的字符信息; . 每个TMDS时钟周期内,编码器将2位的控制数据、4位的报数据或者8位的视频数据采取不同 …

[luoguP2774] 方格取数问题(最大点权独立集)

传送门 引入两个概念: 最小点权覆盖集:满足每一条边的两个端点至少选一个的最小权点集。 最大点权独立集:满足每一条边的两个端点最多选一个的最大权点集。 现在对网格染色,使得相邻两点颜色不同,之后把两个颜色的点分…

docker入门之容器网络

docker入门之容器网络首发:arppinging.com一、网络命名空间1)IP命令2)实例二、网络模型三、容器中常见的网络操作1)指定网络模式2)指定容器的dns地址和hosts解析四、网桥配置一、网络命名空间1)IP命令查看i…

光谱分布、光谱辐射通量密度与不同时间段分布光谱(图示)

1、光谱分布图 2 太阳辐射能量图 3、不同时间段的太阳分布光谱图 4、不同波长的光的能量分布主要区域 5、不同波段的使用场景

$.ajax()方法详解

相关链接:http://blog.csdn.net/denghejing/article/details/41087581转载于:https://www.cnblogs.com/Steven5007/p/8191275.html

【从零开始】Python字符串的操作方法

1. 字符串长度 #strlen(str)       # 字符串长度函数名str apples    # 把字符串 "apples" 赋值给变量 strprint (len(str))      # 打印字符串的长度 2. 查找字符 #strchr(str1,str2)      # 查找字符函数名str1 apples      …

SQL工厂法

表結構: exeno caption params sqlcommand tablename 201 登錄 loginname ftsring(20) select * from user where loginname:loginname user //autho…

基于深度学习和传统算法的人体姿态估计,技术细节都讲清楚了

计算机视觉的一大研究热点是人体姿态估计,还有很多问题急需解决,比如遮挡,交互等等。在最近的CVPR2020里边也有很多这方面的工作。本文站长主要是想谈谈基于深度学习的实时多人姿态估计。 人体姿态估计要干嘛? 关于人类活动规律的…

一些linux知识和http知识

一些linux知识和http知识 1 yum安装比源码编译安装 有的模块不能自定义安装 只能安装默认的模块进行安装 2 关于php的fastcgi 如果使用fastcgi 那么需要启动服务 如果不使用fastcgi 那么不需要启动这个服务 3 一个完整的HTTP解析路径 用户浏览器比如访问www.123.com/index.…

杨浦区阜盛农民工子弟小学见闻

天气有些阴沉,起了个大早,一个小时奔波后来到了这里…… 大门口: 校领导: 有些破旧的校舍和阴沉的天空下祖国的希望: 同上,希望…… 期待的目光: 顽皮的笑脸,排着队也要调皮&#xf…

《构建之法》7

十五章讲的是稳定和发布阶段。软件生命周期的最后阶段往往是最考验团队的。从代码完成到最终发布软件,需要经历:完成代码、集成测试、Bug修复、Alpha发布、DCR Bug修复、Beta发布、外部测试、RTO等。软件团队的各个角色代表,组成会诊小组。对…

人体姿态估计算法之open pose

一,openpose是一种自底向上的算法: OpenPose人体姿态识别项目是美国卡耐基梅隆大学(CMU)基于卷积神经网络和监督学习并以Caffe为框架开发的开源库。可以实现人体动作、面部表情、手指运动等姿态估计。适用于单人和多人&am…

python练习5

import re from datetime import datetime, timezone, timedeltadef to_timestamp(dt_str, tz_str):# 时间dt_now datetime.strptime(dt_str, %Y-%m-%d %H:%M:%S)#时区tz_num int(re.match(\w{3}([|-]\d):00,tz_str).groups()[0])tz_utc timezone(timedelta(hours tz_num))…

抢火车票这个事吧,其实我也能做!(python黑科技)

2019独角兽企业重金招聘Python工程师标准>>> 又是一年,马上就要回家过年了,还没有买到票的小伙伴们是否已经像热锅上的蚂蚁了无脑的开始找黄牛了? 俗话说的好,求人不如求自己,抢票这玩意,其实我觉得我也可…

用 Python+openpose 实现抖音尬舞机

游戏开始后,随着音乐会给出不同的动作提示,用户按照提示摆出正确动作即可得分。援引官方说法,“尬舞机”主要应用了今日头条 AI Lab 自主开发的“人体关键点检测技术”,依靠这项技术,抖音能够检测到图像中所包含人体的…

PHP获取中文字符拼音首字母

在项目中遇到需要把游戏进行字母排序,于是百度到一个格式化的首字母的方法。 /*** name php获取中文字符拼音首字母* param $str* return null|string*/public function getFirstCharter($str){if (empty($str)) {return ;}$fchar ord($str{0});if ($fchar > or…

Array类型

一、转换方法 toString() 调用数组的toString()方法会返回由数组中每个值的字符串形式拼接而成的一个以逗号分割的字符串 valueOf() 返回的还是数组 实际上,为了创建这个字符串会调用数组每一项的toString()方法 二、栈方法 push() pop() 只发生在栈的顶部 三…