python爬虫之urllib,伪装,超时设置,异常处理的方法


Posted in Python onDecember 19, 2018

Urllib

1. Urllib.request.urlopen().read().decode()

返回一个二进制的对象,对这个对象进行read()操作,可以得到一个包含网页的二进制字符串,然后用decode()解码成html源码

2. urlretrieve()

将一个网页爬取到本地

3. urlclearup()

清除 urlretrieve()所产生的缓存

4. info()

返回一个httpMessage对象,表示远程服务器的头信息

5. getcode()

获取当前网页的状态码 200代表成功,404网页未找到

6. geturl()

获取当前爬取页面的网址

示例:

from urllib import request
# urlretrieve() -- 将一个网页爬取到本地
request.urlretrieve("http://www.baidu.com",filename="demo.html")

# urlclearup() -- 清除urlretrieve()所产生的缓存
request.urlcleanup()

# info() -- 返回一个httpMessage对象,表示远程服务器的头信息
data = request.urlopen("http://www.taobao.com")
print(data.info())

# getcode() -- 获取当前网页的状态码data.geturl()
print(data.getcode())

# 获取当前爬取页面的网址
print(data.geturl())

运行结果:

Server: Tengine
Date: Wed, 09 May 2018 09:55:16 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Vary: Accept-Encoding
X-Snapshot-Age: 1
Content-MD5: tkjcPUrHBAIt2N/YXcuwZg==
Vary: Ali-Detector-Type, X-CIP-PT
Cache-Control: max-age=0, s-maxage=89
ETag: W/"29b8-16340528168"
Via: cache22.l2cm9[0,304-0,H], cache17.l2cm9[0,0], cache1.cn372[0,200-0,H], cache2.cn372[1,0]
Age: 70
X-Cache: HIT TCP_MEM_HIT dirn:-2:-2 mlen:-1
X-Swift-SaveTime: Wed, 09 May 2018 09:54:59 GMT
X-Swift-CacheTime: 36
Timing-Allow-Origin: *
EagleId: 3c1cf2e515258597167937091e
Set-Cookie: thw=cn; Path=/; Domain=.taobao.com; Expires=Thu, 09-May-19 09:55:16 GMT;
Strict-Transport-Security: max-age=31536000


200
https://www.taobao.com/

超时设置(timeout)

由于在实际的爬取过程中,部分网站可能访问过慢,影响性能,这时我们可设置超时访问.

示例: 如果在指定时间内正常访问,即输出获取数据的长度,如果超出指定时间,则抛出异常.

for i in range(0,10):
 try:
  data = urllib.request.urlopen("http://www.baidu.com",timeout=0.05).read()
  print(len(data))
 except Exception as e:
  print("出现异常:"+str(e))

运行结果:

114980
114888
114809
114839
114824
114611
出现异常:<urlopen error timed out>
出现异常:<urlopen error timed out>
出现异常:<urlopen error timed out>
115003

伪装

在爬取过程中,可能部分网站限制浏览器访问所以为了顺利达到我们的目的,我们对自己进行伪装.

这里我们介绍一下浏览器的伪装技术.

普通爬取:

from urllib import request
file = request.urlopen("http://www.baidu.com").read().decode()

通过浏览器伪装爬取数据:

方式一:

from urllib import request 
url = "http://www.baidu.com" 
headers = ("User-Agent"," Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36") #这里模拟浏览器 
opener = request.build_opener() 
opener.addheaders = [headers]
data = opener.open(url).read()
print(data)

方式二:

from urllib import request 
url = "http://www.baidu.com" 
headers = ("User-Agent"," Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36") #这里模拟浏览器 
opener = request.build_opener() 
opener.addheaders = [headers]
request.install_opener(opener)
data = request.urlopen(url).read().decode("utf-8")
print(data)

方式三:

from urllib import request 
url = "http://www.baidu.com" 
headers = {}"User-Agent":" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"} #这里模拟浏览器,通过字典
req = request.Request(url=rul,headers=headers)
data = request.urlopen(req).read().decode("utf-8")
print(data)

异常处理

爬虫在运行过程中,可能会出现各种各样的问题,如果没有异常处理的话,爬出异常会直接崩溃停止运行,下次再运行的时候,爬虫又要重头开始,所以我们要开发的是一个具有顽强生命力的爬虫,必须要进行异常的处理.

常见异常示例:

301 重定向
403 禁止访问
404 没有找到页面
500 服务器内部出现问题
200 成功

python中有两个异常处理的类:URLError与HttpError

HttpError 是 URLError子类
 HttpError 有异常状态码和异常原因
 URLError 只有异常原因,没有异常状态码
 所以,在异常处理的时候,不能使用URLError来代替
 如果想要代替,必须要进行判断,判断是否有状态码属性

 会产生URLError的情况:
  1.连接不上服务器
  2.远程的url不存在
  3.本地网络
  4.HttpError(是子类,也会出发会产生URLError

格式如下:

from urllib import error,request
try: # 可能会出现异常的代码

 data = request.urlopen("http://www.aliyu.com").read()
 print(data)

except error.URLError as e: # 进行异常的处理

 if hasattr(e,"code"): # 判断是否有状态码

  print(e.code) # 状态码

 if hasattr(e,"reason"): # 判断是否有异常原因

  print(e.reason) # 异常原因

以上这篇python爬虫之urllib,伪装,超时设置,异常处理的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中迭代器(iterator)用法实例分析
Apr 29 Python
Python通过正则表达式选取callback的方法
Jul 18 Python
python列表操作之extend和append的区别实例分析
Jul 28 Python
Python多进程multiprocessing.Pool类详解
Apr 27 Python
Python实现随机创建电话号码的方法示例
Dec 07 Python
聊聊python里如何用Borg pattern实现的单例模式
Jun 06 Python
python multiprocessing多进程变量共享与加锁的实现
Oct 02 Python
Python笔记之观察者模式
Nov 20 Python
Pytoch之torchvision.transforms图像变换实例
Dec 30 Python
pytorch自定义二值化网络层方式
Jan 07 Python
pyspark 随机森林的实现
Apr 24 Python
python playwright 自动等待和断言详解
Nov 27 Python
python3实现网络爬虫之BeautifulSoup使用详解
Dec 19 #Python
python爬虫超时的处理的实例
Dec 19 #Python
pycharm中使用anaconda部署python环境的方法步骤
Dec 19 #Python
Django框架模板注入操作示例【变量传递到模板】
Dec 19 #Python
python json.loads兼容单引号数据的方法
Dec 19 #Python
Python查找文件中包含中文的行方法
Dec 19 #Python
对python requests发送json格式数据的实例详解
Dec 19 #Python
You might like
PHP 第二节 数据类型之字符串类型
2012/04/28 PHP
解析PHP中intval()等int转换时的意外异常情况
2013/06/21 PHP
完美解决PHP中的Cannot modify header information 问题
2013/08/12 PHP
php实现将Session写入数据库
2015/07/26 PHP
php结合md5实现的加密解密方法
2016/01/25 PHP
PHP数组array类常见操作示例
2020/05/15 PHP
javascript应用:Iframe自适应其加载的内容高度
2007/04/10 Javascript
Web开发者必备的12款超赞jQuery插件
2010/12/03 Javascript
google jQuery 引用文件,jQuery 引用地址集合(jquery 1.2.6至jquery1.5.2)
2011/04/24 Javascript
JS小功能(setInterval实现图片效果显示时间)实例代码
2013/11/28 Javascript
针对BootStrap中tabs控件的美化和完善(推荐)
2016/07/06 Javascript
Ajax的概述与实现过程
2016/11/18 Javascript
BootStrap fileinput.js文件上传组件实例代码
2017/02/20 Javascript
javascript 网页进度条简单实例
2017/02/22 Javascript
基于Vue2实现的仿手机QQ单页面应用功能(接入聊天机器人 )
2017/03/30 Javascript
angular框架实现全选与单选chekbox的自定义
2017/07/06 Javascript
iscroll实现下拉刷新功能
2017/07/18 Javascript
Vue 中axios配置实例详解
2018/07/27 Javascript
angular中子控制器向父控制器传值的实例
2018/10/08 Javascript
vue element中axios下载文件(后端Python)
2019/05/10 Javascript
[03:12]完美世界DOTA2联赛PWL DAY6集锦
2020/11/05 DOTA
Python实现从log日志中提取ip的方法【正则提取】
2018/03/31 Python
Pycharm运行加载文本出现错误的解决方法
2019/06/27 Python
pytorch多进程加速及代码优化方法
2019/08/19 Python
Python获取一个用户名的组ID过程解析
2019/09/03 Python
Python pip使用超时问题解决方案
2020/08/03 Python
CSS3 clip-path 用法介绍详解
2018/03/01 HTML / CSS
CSS3 transform的skew属性值图文详解
2014/07/21 HTML / CSS
Zavvi荷兰:英国大型音像制品和图书游戏零售商
2018/03/22 全球购物
高中学生评语大全
2014/04/25 职场文书
药品营销策划方案
2014/06/15 职场文书
大一学生个人总结
2015/02/15 职场文书
关于调整工作时间的通知
2015/04/24 职场文书
周一给客户的问候语
2015/11/10 职场文书
Go语言基础函数基本用法及示例详解
2021/11/17 Golang
「玫瑰之王的葬礼」舞台剧主视觉图公开
2022/03/21 日漫