1 import urllib.request 2 3 url = 'http://www.baidu.com' 4 file = urllib.request.urlopen(url) 5 data = file.read() 6 dataline = file.readline() 7 datalines = file.readlines()
首先導入urllib.request模塊python
而後使用urllib.request.urlopen打開並爬取一個網頁,此時返回的是<http.client.HTTPResponse object at 0x00000206F862C4A8>,一個HTTP響應對象。瀏覽器
對於響應對象讀取的三種方式:服務器
若是但願返回與當前環境有關的信息,可使用info()函數
file.info()
若是但願獲取當前爬取網頁的狀態碼,咱們可使用getcode()網站
file.getcode()
若是想要獲取當前所爬取的URL地址,可使用geturl()ui
file.geturl()
通常來講,URL標準中只會容許一部分ASCLL字符好比數字、字母、部分符號等,而其餘的一些字符,好比漢字等,是不符合URL標準的。因此若是咱們在URL中使用了一些其餘不符合標準的字符就會出現問題,此時須要進行URL編碼方可解決。編碼
若是要進行編碼,可使用urllib.request.quote()進行url
urllib.request.quote('http://www.baidu.com')
能夠看到,編碼結果是'http%3A//www.baidu.com'spa
相應的,有時須要對編碼的網址進行解碼。若要解碼,可使用urllib.request.unquote().net
urllib.request.unquote('http%3A//www.baidu.com')
輸出結果爲'http://www.baidu.com'
除了這種方法以外,還可使用urllib.request裏面的urlretrieve()函數直接將對應信息寫入本地文件。格式爲:「urllib.request.urlretrieve(url,filename='本地文件地址')」
filename = urllib.request.urlretrieve('http://www.baidu.com','本地位置')
爲了防止禁止爬蟲訪問,讓爬蟲模擬成瀏覽器
方法一:使用build_opener()修改報頭
因爲urlopen()不支持一些HTTP的高級功能,因此,咱們若是要修改報頭,可使用urllib.request.build_opener()進行。
1 import urllib.request 2 url = '網址' 3 headers = ('User-Agent','...') 4 opener = urllib.request.build_opener() 5 opener.addheaders = [headers] 6 data = opener.open(url).read()
方法二:使用add_header()添加報頭
可使用urllib.request.Request()下的add_header()實現瀏覽器的模擬
import urllib.request url = 'http://blog.csdn.net/weiwei_pig/article/details/51178226' req = urllib.request.Request(url) req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36') data = urllib.request.urlopen(req).read()
使用urllib.request.Request()返回的是<urllib.request.Request object at 0x000001730BE1EB70>,使用add.header爲Request對象添加報頭。
此時已經成功設置好報頭,而後咱們使用urlopen()打開Request對象便可打開對應網站,獲得一個HTTP的響應對象。
有的時候,咱們訪問一個網頁,若是該網頁長時間未響應,那麼系統就會判斷該網頁超時了。既沒法打開該網頁。
有的時候,咱們須要根據本身的須要來設置超時的時間值。
import urllib.request for i in range(1,100): try: file = urllib.request.urlopen('url',timeout=1) data = file.read() print(len(data)) except Exception as e: print('出現異常:'+str(e))
能夠從整理好的網址http://yum.iqianyue.com/proxy中找到不少代理服務器地址。
有了代理ip地址以後,咱們就能夠經過代理服務器來爬取網站內容了。
import urllib.request def use_proxy(proxy_addr,url): 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 = '112.85.173.20:9999' url = 'http://www.baidu.com' data = use_proxy(proxy_addr,url) print(len(data))