<!DOCTYPE html>
Urllib是Python提供的一個用於操做URL的模塊。html
首先導入模塊
import urllib.request
導入後,爬取
file = urllib.request.urlopen("http://www.baidu.com";)
讀取,三種方式
git
fhandle=open(r"C:\Users\My\Desktop\git學習\1.html",'wb')
fhandle.write(file.read())
fhandle.close()
直接將對應信息寫入文件。格式:urllib.request.urlretrieve(url,filename=本地文件地址)
github
urllib.request.urlretrieve("http://www.51cto.com/";,filename=r"C:\Users\My\Desktop\git學習\2.html")
urlretrieve執行的過程當中,會產生緩存,清除緩存
urllib.request.urlcleanup()
獲取與當前環境相關的信息使用info。
file.info()
獲取當前爬取網頁的狀態碼,使用getcode(),若返回200爲正確,返回其餘的不正確。
file.getcode()
獲取爬取網頁的URL,使用geturl()
file.geturl()
通常來講,URL標準中只會容許一部分ASCII字符好比數字、字母、部分符號等,而其餘的一些字符,好比漢字等,是不符合URL標準的。因此若是咱們在URL中使用一些其餘不符合標準的字符就會出現問題,此時須要進行URL編碼方可解決。好比在URL中輸入中文或者「:」或者「&」等不符合標準的字符時,須要編碼。
若是要進行編碼,使用urllib.request.quete()進行,好比,咱們對「http://www.sina.com.cn"進行編碼。
urllib.reqeust.quote("http://www.sina.com.cn";)
輸出'http%3A//www.sina.com.cn'
解碼
urllib.request.unquote("http%3A//www.sina.com.cn")
輸出'http://www.sina.com.cn'
web
有時候,咱們沒法爬取一些網頁,出現403錯誤,這是由於這些網頁爲了防止別人惡意採集信息進行的反爬蟲的設置。
若是想爬取,咱們能夠設置Headers信息,模擬成瀏覽器去訪問這些網站。設置Headers,首先須要的是找出User-Agent。
有兩種方法讓爬蟲模擬成瀏覽器範文網頁
canvas
import urllib.request
url="網頁地址"
headers=("User-Agent","瀏覽器裏找到的User-Agent")
opener=urllib.request.build_opener()
opener.addheaders=[headers]
data=opener.open(url).read()
fhandler=open("存放網頁的地址","wb")
fhandler.write(data)
fhandler.close()
import urllib.request
url="網頁地址"
req=urllib.request.Request(url)
req.add_header('User-Agent',"瀏覽器找到的User-Agent")
data=urllib.request.urlopen(req).read()
有的時候,訪問一個網頁,若是該網頁長時間未響應,那麼系統判斷該網頁超時,即沒法打開該網頁。
import urllib.request
瀏覽器
file=urllib.request.urlopen("網頁地址",timeout=時間值)
HTTP協議請求主要分爲6種類型。
緩存
import urllib.request
keywd="hello"
url="http://www.baidu.com/s?wd="+keywd
req=urllib.request.Request(url)
data=urllib.request.urlopen(req).read()
fhandle=open("文件存儲地址","wb")
fhandle=write(data)
fhandle.close()
UnicodeEncodeError
import urllib.request
url="http://www.baidu.com/s?wd=";
key="韋瑋老師"
key_code=urllib.request.quote(key)
url_all=url+key_code
req=urllib.request.Request(url_all)
data=urllib.request.urlopen(req).read()
fh=open("文件地址","wb")
fh.write(data)
fh.close()
import urllib.request
import urllib.parse
url="網頁地址"
postdata=urllib.parse.urlencode({
'name':'aaa',
'pass':'bbb'}).encode('utf-8')#將數據使用urlencode編碼處理後,使用encode()設置爲utf-8編碼
req=urllib.request.Request(url,postdata)
req.add_header('User-Agent','User-Agent數據')
data=urllib.request.urlopen(req).read()
fd=open("存儲地址",'wb')
fd.write(data)
fd.close()
#代理服務器網站http://yum.iqianyue.com/proxy
def use_proxy(proxy_addr,url):
import urllib.request
proxy=urllib.request.ProxyHandler({'http':proxy_addr})
opener=urllib.request.build_opener(proxy,urllib.request.HTTPHandler)
urllib.request.install_opener(opener)
data=urllib.request.urlopen(url).read().decode('utf-8')
return data
proxy_addr="代理服務器地址加端口"
data=use_proxy(proxy_addr,"網頁地址")
print(len(data))
安全
import urllib.request
import urllib.error
try:
urllib.request.urlopen("網頁地址")
except urllib.error.URLError as e:
print(e.code)
print(e.reason)
輸出錯誤:
403
Forbidden
產生URLError的緣由有以下幾種可能:ruby
import urllib.request
import urllib.error
try:
urllib.request.urlopen("網頁地址")
except urllib.error.HTTPError as e:
print(e.code)
print(e.reason)
import urllib.request
import urllib.error
try:
urllib.request.urlopen("http://blog.baidusss.net";) except urllib.error.HTTPError as e: print(e.code) print(e.reason) except urllib.error.URLError as e: print(e.reason)