Urllib
1. 返回一个二进制的对象,对这个对象进行read()的操作
可以得到一个包含网页的二进制字符串,
然后用decode()解码成html源码
2. urlretrieve() -- 将一个网页爬取到本地
3. urlclearup() -- 清除urlretrieve()所产生的缓存
4. info() -- 返回一个httpMessage对象,表示远程服务器的头信息
5. getcode() -- 获取当前网页的状态码 200代表成功,404网页未找到
6. geturl() -- 获取当前爬取页面的网址
将一个网页爬取到本地--urlretrieve()
urllib.request.urlretrieve("http://www.baidu.com",filename="demo.html")清除urlretrieve()所产生的缓存
urllib.request.urlcleanup()返回一个httpMessage对象,表示远程服务器的头信息
data = urllib.request.urlopen("http://www.taobao.com")获取当前网页的状态码--getcode()
print(data.getcode())获取当前爬取页面的网址
print(data.geturl())
延时设置(timeout)
模拟超时(timeout)案例
import urllib.request
for i in range(0,100):
try:
data = urllib.request.urlopen("http://www.baidu.com",timeout=0.5).read()
print(len(data))
except Exception as e:
print("出现异常:"+str(e))
爬虫的异常处理
爬虫的异常处理
爬虫在运行过程中,可能会出现各种各样的问题
如果没有异常处理的话,爬出异常会直接崩溃停止运行
下次再运行的时候,爬虫又要重头开始
所以我们要开发的是一个具有顽强生命力的爬虫
必须要进行异常的处理301 重定向 304 400 403 禁止访问 404 没有找到页面 401 500 服务器内部出现问题 501 200 成功 两个进行异常处理的类 URLError与HttpError HttpError 是 URLError子类 HttpError 有异常状态码和异常原因 URLError 只有异常原因,没有异常状态码 所以,在异常处理的时候,不能使用URLError来代替 如果想要代替,必须要进行判断,判断是否有状态码属性 会产生URLError的情况: 1.连接不上服务器 2.远程的url不存在 3.本地网络 4.HttpError(是子类,也会出发会产生URLError
#import urllib.error
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) # 异常原因
浏览器的伪装技术
在爬取页面的时候,返回403
这时候我们会伪装成浏览器进行数据的爬取
-
普通爬取
from urllib import request
file =request.urlopen("http://www.baidu.com").read().decode()
print(len(file)) -
通过浏览器伪装爬取数据
方式一from urllib import request url = "https://www.baidu.com" # 进行伪装 headers = ("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) " "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36") 自定义open opener = request.build_opener() opener.addheaders = [headers] data = opener.open(url).read() print(data)
方式二
from urllib import request
url = "https://www.douban.com"
# 进行伪装
headers = ("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) ""AppleWebKit/537.36 (KHTML, like Gecko)Chrome/66.0.3359.139 Safari/537.36")
opener = request.build_opener()
opener.addheaders = [headers]
# 安装open作为urlopen()使用
request.install_opener(opener)
data = request.urlopen(url).read().decode("utf-8")
print(len(data))
方式三
from urllib import request
url = "https://www.baidu.com"
# headers
headers = ("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) ""AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36")
req=request.Request(url= url,headers=headers)
# request.urlopen(req).read().decode("utf-8")
data = request.urlopen(req)
data1 = data.read()
data2 = data1.decode()
print(data) # 返回的是一个对象 ,getcode() geturl() ....
print(data1) # 得到的是一个包含网页的二进制字符串
print(data2) # 用decode()解码成html源码
print(data.getcode()) # 状态码
print(data.info()) # 信息
print(data.geturl()) # 网址
爬取新浪新闻首页中的新闻,爬取到本地
for i in range(0,len(allurl)): # 增加爬虫的健壮性,进行异常处理 try: print("第"+str(i)+"次爬取") thisurl = allurl[i] # 将新闻爬取到本地的路径指定 path = "/Users/lazyiron/Desktop/sinaNews/news"+str(i)+".html" # 通过urlretrieve()将新闻爬到本地 request.urlretrieve(thisurl,filename=path) print("--------爬取成功---------") except error.URLError as e: if hasattr(e,"code"): print(e.code) if hasattr(e,"reson"): print(e.reason)