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基于twisted实现简单的web服务器
Sep 29 Python
在Python中测试访问同一数据的竞争条件的方法
Apr 23 Python
Python在Console下显示文本进度条的方法
Feb 14 Python
Python常用算法学习基础教程
Apr 13 Python
详解Django rest_framework实现RESTful API
May 24 Python
Python3 读、写Excel文件的操作方法
Oct 20 Python
在Pycharm中项目解释器与环境变量的设置方法
Oct 29 Python
python数据挖掘需要学的内容
Jun 23 Python
Python 使用元类type创建类对象常见应用详解
Oct 17 Python
jupyter 使用Pillow包显示图像时inline显示方式
Apr 24 Python
python 实现图片裁剪小工具
Feb 02 Python
Python实现单例模式的5种方法
Jun 15 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 数据库树的遍历方法
2009/02/06 PHP
php实现随机显示图片方法汇总
2015/05/21 PHP
php array_udiff_assoc 计算两个数组的差集实例
2016/11/12 PHP
PHP设计模式之抽象工厂模式实例分析
2019/03/25 PHP
firefox插件Firebug的使用教程
2010/01/02 Javascript
jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法
2015/03/24 Javascript
JavaScript中的toLocaleLowerCase()方法使用详解
2015/06/06 Javascript
七夕情人节丘比特射箭小游戏
2015/08/20 Javascript
关注jquery技巧提高jquery技能(前端开发必学)
2015/11/02 Javascript
浅谈javascript中的constructor
2016/06/08 Javascript
JS从数组中随机取出几个数组元素的方法
2016/08/02 Javascript
简单实现JS倒计时效果
2016/12/23 Javascript
AngularJS中$injector、$rootScope和$scope的概念和关联关系深入分析
2017/01/19 Javascript
原生js实现新闻列表展开/收起全文功能
2017/01/20 Javascript
浅谈js for循环输出i为同一值的问题
2017/03/01 Javascript
微信小程序 ES6Promise.all批量上传文件实现代码
2017/04/14 Javascript
细说webpack源码之compile流程-rules参数处理技巧(2)
2017/12/26 Javascript
layDate日期控件使用方法详解
2018/11/15 Javascript
ES6的异步终极解决方案分享
2019/07/11 Javascript
vue element 中的table动态渲染实现(动态表头)
2019/11/21 Javascript
vue实现简单跑马灯效果
2020/05/25 Javascript
在Vue中使用HOC模式的实现
2020/08/23 Javascript
webpack4从0搭建组件库的实现
2020/11/29 Javascript
python字典排序实例详解
2015/05/20 Python
使用Python的PIL模块来进行图片对比
2016/02/18 Python
python 获取list特定元素下标的实例讲解
2018/04/09 Python
Python3实现的回文数判断及罗马数字转整数算法示例
2019/03/27 Python
pyenv与virtualenv安装实现python多版本多项目管理
2019/08/17 Python
用pytorch的nn.Module构造简单全链接层实例
2020/01/14 Python
Html5剪切板功能的实现代码
2018/06/29 HTML / CSS
年度献血先进个人事迹材料
2014/02/14 职场文书
六一儿童节活动总结
2014/08/27 职场文书
公司市场部岗位职责
2015/04/15 职场文书
民事起诉书范本
2015/05/19 职场文书
解决numpy数组互换两行及赋值的问题
2021/04/17 Python
详解Node.js如何处理ES6模块
2021/05/15 Javascript