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操作数据库之sqlite3打开数据库、删除、修改示例
Mar 13 Python
python实现class对象转换成json/字典的方法
Mar 11 Python
python实现斐波那契数列的方法示例
Jan 12 Python
python入门教程之识别验证码
Mar 04 Python
使用Python对Access读写操作
Mar 30 Python
Python给你的头像加上圣诞帽
Jan 04 Python
python 异或加密字符串的实例
Oct 14 Python
python Elasticsearch索引建立和数据的上传详解
Aug 04 Python
Python 通过监听端口实现唯一脚本运行方式
May 05 Python
Python实现手绘图效果实例分享
Jul 22 Python
基于Django快速集成Echarts代码示例
Dec 01 Python
关于的python五子棋的算法
May 02 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 str_pad 函数使用详解
2009/01/13 PHP
PHP验证码类代码( 最新修改,完全定制化! )
2010/12/02 PHP
thinkphp实现图片上传功能分享
2014/03/04 PHP
自定义min版smarty模板引擎MinSmarty.class.php文件及用法
2016/05/20 PHP
PHP文字转图片功能原理与实现方法分析
2017/08/31 PHP
php定期拉取数据对比方法实例
2019/09/22 PHP
google jQuery 引用文件,jQuery 引用地址集合(jquery 1.2.6至jquery1.5.2)
2011/04/24 Javascript
让浏览器非阻塞加载javascript的几种方法小结
2011/04/25 Javascript
使用js操作cookie的一点小收获分享
2013/09/03 Javascript
Javascript Ajax异步读取RSS文档具体实现
2013/12/12 Javascript
JQuery+Ajax无刷新分页的实例代码
2014/02/08 Javascript
js实现瀑布流的三种方式比较
2020/06/28 Javascript
基于jQuery实现发送短信验证码后的倒计时功能(无视页面关闭)
2016/09/02 Javascript
jQuery 插件封装的方法
2016/11/16 Javascript
详解Javascript百度地图接口开发文档中的类和方法
2017/02/07 Javascript
基于webpack.config.js 参数详解
2018/03/20 Javascript
[45:56]Ti4正赛第一天 VG vs NEWBEE 3
2014/07/19 DOTA
用Python进行TCP网络编程的教程
2015/04/29 Python
Python线性回归实战分析
2018/02/01 Python
浅谈python中requests模块导入的问题
2018/05/18 Python
从numpy数组中取出满足条件的元素示例
2019/11/26 Python
使用Dajngo 通过代码添加xadmin用户和权限(组)
2020/07/03 Python
Django restful framework生成API文档过程详解
2020/11/12 Python
如何基于Python pygame实现动画跑马灯
2020/11/18 Python
三星美国官网:Samsung美国
2017/02/06 全球购物
Boutique 1美国:阿联酋奢侈时尚零售商
2017/10/16 全球购物
个人思想理论学习的自我鉴定
2013/11/30 职场文书
高中军训感言800字
2014/03/05 职场文书
广告词串烧
2014/03/19 职场文书
四川省传达学习贯彻党的群众路线教育实践活动总结大会精神新闻稿
2014/10/26 职场文书
学校党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
Python基本知识点总结
2022/04/07 Python
TypeScript 使用 Tuple Union 声明函数重载
2022/04/07 Javascript
vmware虚拟机打不开vmx文件怎么办 ?vmware虚拟机vmx文件打开方法
2022/04/08 数码科技
Python闭包的定义和使用方法
2022/04/11 Python
浅谈为什么我的 z-index 又不生效了
2022/07/15 HTML / CSS