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通过定义一个类实例作为ftp回调方法
May 04 Python
在Mac OS系统上安装Python的Pillow库的教程
Nov 20 Python
Python实现对字符串的加密解密方法示例
Apr 29 Python
python虚拟环境virtualenv的安装与使用
Sep 21 Python
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
Apr 28 Python
Python处理中文标点符号大集合
May 14 Python
Sanic框架Cookies操作示例
Jul 17 Python
python try 异常处理(史上最全)
Mar 07 Python
python利用多种方式来统计词频(单词个数)
May 27 Python
keras 多任务多loss实例
Jun 22 Python
Python如何对齐字符串
Jul 30 Python
python操作xlsx格式文件并读取
Jun 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 Class&amp;Object -- 解析PHP实现二叉树
2013/06/25 PHP
PHP中遇到BOM、编码导致json_decode函数无法解析问题
2014/07/02 PHP
PHP中unset,array_splice删除数组中元素的区别
2014/07/28 PHP
表单切换,用回车键替换Tab健(不支持IE)
2011/07/20 Javascript
jquery幻灯片插件bxslider样式改进实例
2014/10/15 Javascript
jQuery验证插件validation使用指南
2015/04/21 Javascript
jquery捕捉回车键及获取checkbox值与异步请求的方法
2015/12/24 Javascript
javascript滚轮事件基础实例讲解(37)
2017/02/14 Javascript
js 去掉字符串前后空格实现代码集合
2017/03/25 Javascript
Vue.js 实现微信公众号菜单编辑器功能(一)
2018/05/08 Javascript
vue input 输入校验字母数字组合且长度小于30的实现代码
2018/05/16 Javascript
elementUI 动态生成几行几列的方法示例
2019/07/11 Javascript
[16:21]教你分分钟做大人:圣堂刺客
2014/12/03 DOTA
[52:29]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第三局
2016/03/03 DOTA
Python数据类型详解(二)列表
2016/05/08 Python
Pandas探索之高性能函数eval和query解析
2017/10/28 Python
详解Python中 sys.argv[]的用法简明解释
2017/12/20 Python
python中for循环输出列表索引与对应的值方法
2018/11/07 Python
python买卖股票的最佳时机(基于贪心/蛮力算法)
2019/07/05 Python
Python3内置模块random随机方法小结
2019/07/13 Python
python 利用pywifi模块实现连接网络破解wifi密码实时监控网络
2019/09/16 Python
python matplotlib 画dataframe的时间序列图实例
2019/11/20 Python
pytorch+lstm实现的pos示例
2020/01/14 Python
解决Pycharm 导入其他文件夹源码的2种方法
2020/02/12 Python
纯css实现照片墙3D效果的示例代码
2017/11/13 HTML / CSS
Stuart Weitzman欧盟:美国奢华鞋履品牌
2017/05/24 全球购物
印尼旅游网站:via
2017/11/12 全球购物
美国50岁以上单身人士约会平台:SilverSingles
2018/06/29 全球购物
Wiggle新西兰:自行车、跑步、游泳
2020/05/06 全球购物
小学毕业家长寄语
2014/01/19 职场文书
入党自我评价优缺点
2014/01/25 职场文书
干部竞争上岗演讲稿
2014/09/11 职场文书
奖学金申请个人主要事迹材料
2015/11/04 职场文书
tensorflow中的数据类型dtype用法说明
2021/05/26 Python
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
2021/06/23 Python
Python使用Web框架Flask开发项目
2022/06/01 Python