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中函数总结之装饰器闭包详解
Jun 12 Python
详解python的几种标准输出重定向方式
Aug 15 Python
Python cookbook(数据结构与算法)实现优先级队列的方法示例
Feb 18 Python
python下解压缩zip文件并删除文件的实例
Apr 24 Python
python 列表降维的实例讲解
Jun 28 Python
pyqt5移动鼠标显示坐标的方法
Jun 21 Python
PyCharm更改字体和界面样式的方法步骤
Sep 27 Python
python多进程并行代码实例
Sep 30 Python
Python全局锁中如何合理运用多线程(多进程)
Nov 06 Python
Pandas直接读取sql脚本的方法
Jan 21 Python
Python实现文本文件拆分写入到多个文本文件的方法
Apr 18 Python
总结Python使用过程中的bug
Jun 18 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
phpwind中的数据库操作类
2007/01/02 PHP
PHP判断是否有Get参数的方法
2014/05/05 PHP
Javascript学习笔记之 对象篇(一) : 对象的使用和属性
2014/06/24 Javascript
BootStrap制作导航条实例代码
2016/05/06 Javascript
Vue中添加过渡效果的方法
2017/03/16 Javascript
详解使用nodeJs安装Vue-cli
2017/05/17 NodeJs
Angular 向组件传递模板的两种方法
2018/02/23 Javascript
js运算符的一些特殊用法
2018/07/29 Javascript
详解微信小程序回到顶部的两种方式
2019/05/09 Javascript
详解vue中的父子传值双向绑定及数据更新问题
2019/06/13 Javascript
编写更好的JavaScript条件式和匹配条件的技巧(小结)
2019/06/27 Javascript
layui table 表格模板按钮的实例代码
2019/09/21 Javascript
JavaScript命令模式原理与用法实例详解
2020/03/10 Javascript
小程序角标的添加及绑定购物车数量进行实时更新的实现代码
2020/12/07 Javascript
[01:20]DOTA2 2017国际邀请赛冠军之路无止竞
2017/06/19 DOTA
Python的ORM框架SQLAlchemy入门教程
2014/04/28 Python
python+opencv实现的简单人脸识别代码示例
2017/11/14 Python
linux下python使用sendmail发送邮件
2018/05/22 Python
python利用微信公众号实现报警功能
2018/06/10 Python
python3中类的继承以及self和super的区别详解
2019/06/26 Python
python pip源配置,pip配置文件存放位置的方法
2019/07/12 Python
在keras 中获取张量 tensor 的维度大小实例
2020/06/10 Python
Python排序函数的使用方法详解
2020/12/11 Python
CSS3的calc()做响应模式布局的实现方法
2017/09/06 HTML / CSS
美国知名的时尚购物网站:Anthropologie
2016/12/22 全球购物
GUESS德国官网:美国牛仔服装品牌
2017/02/14 全球购物
儿子婚宴答谢词
2014/01/09 职场文书
党的群众路线教育实践方案
2014/05/11 职场文书
医学专业毕业生推荐信
2014/07/12 职场文书
公司合作意向书范文
2014/07/30 职场文书
绿色校园广播稿
2014/10/13 职场文书
迁户口计划生育证明
2014/10/19 职场文书
清明扫墓感想
2015/08/11 职场文书
你为什么是穷人?可能是这5个缺点造成
2019/07/11 职场文书
Python 实现Mac 屏幕截图详解
2021/10/05 Python
Tomcat 与 maven 的安装与使用教程
2022/06/16 Servers