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模块之StringIO使用示例
Apr 08 Python
深入讲解Python中的迭代器和生成器
Oct 26 Python
ansible作为python模块库使用的方法实例
Jan 17 Python
Python实现的密码强度检测器示例
Aug 23 Python
Python多进程库multiprocessing中进程池Pool类的使用详解
Nov 24 Python
Python实现PS滤镜的万花筒效果示例
Jan 23 Python
Python网络爬虫中的同步与异步示例详解
Feb 03 Python
python pandas模块基础学习详解
Jul 03 Python
Python学习笔记之文件的读写操作实例分析
Aug 07 Python
Pytorch Tensor基本数学运算详解
Dec 30 Python
Python3中的tuple函数知识点讲解
Jan 03 Python
使用Python下载抖音各大V视频的思路详解
Feb 06 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 socket的讲解与实例分析
2013/06/13 PHP
PHP函数之日期时间函数date()使用详解
2013/09/09 PHP
浅谈PHP调用Webservice思路及源码分享
2014/06/04 PHP
PHP封装返回Ajax字符串和JSON数组的方法
2017/02/17 PHP
yii2项目实战之restful api授权验证详解
2017/05/20 PHP
javascript ie6兼容position:fixed实现思路
2013/04/01 Javascript
jquery实现的一个文章自定义分段显示功能
2014/05/23 Javascript
javascript函数声明和函数表达式区别分析
2014/12/02 Javascript
setinterval()与clearInterval()JS函数的调用方法
2015/01/21 Javascript
JavaScript控制按钮可用或不可用的方法
2015/04/03 Javascript
JavaScript对象学习小结
2015/09/02 Javascript
详解AngularJS中的表单验证(推荐)
2016/11/17 Javascript
Vue数据驱动模拟实现2
2017/01/11 Javascript
VueJs单页应用实现微信网页授权及微信分享功能示例
2017/07/26 Javascript
vue指令做滚动加载和监听等
2019/05/26 Javascript
微信小程序sessionid不一致问题解决
2019/08/30 Javascript
微信小程序和H5页面间相互跳转代码实例
2019/09/19 Javascript
js实现倒计时秒杀效果
2020/03/25 Javascript
JavaScript对象原型链原理详解
2020/02/05 Javascript
vant中的toast轻提示实现代码
2020/11/04 Javascript
[01:14]辉夜杯战队访谈宣传片—NEWBEE.Y
2015/12/26 DOTA
对python抓取需要登录网站数据的方法详解
2018/05/21 Python
Flask框架Flask-Login用法分析
2018/07/23 Python
Python中的CSV文件使用&quot;with&quot;语句的方式详解
2018/10/16 Python
python机器人运动范围问题的解答
2019/04/29 Python
Python DataFrame一列拆成多列以及一行拆成多行
2019/08/06 Python
如何在django中实现分页功能
2020/04/22 Python
意大利体育用品网上商城:Nencini Sport
2016/08/18 全球购物
阿迪达斯印度官方商城:adidas India
2017/03/26 全球购物
JustFab加拿大:女鞋、靴子、手袋和服装在线
2018/05/18 全球购物
英国玛莎百货美国官网:Marks & Spencer美国
2018/11/06 全球购物
新加坡第一的杂货零售商:NTUC FairPrice
2020/12/05 全球购物
党员承诺书格式
2014/05/21 职场文书
爱心募捐通知范文
2015/04/27 职场文书
党支部综合考察意见
2015/06/01 职场文书
浅谈resultMap的用法及关联结果集映射
2021/06/30 Java/Android