網路爬蟲——Urllib模組實戰專案(含程式碼)爬取你的第一個網站

程式設計師小哲發表於2020-02-12


之前給大家分享了正規表示式XPath表示式的內容,有了以上基礎今天來給大家帶來了網路爬蟲實戰課程,教大家爬取第一個網站

什麼是Urllib模組

Urllib是Python提供的一個用於操作URL的模組,這個庫在我們爬取網頁的時候會經常用到。

Urllib例項1(將內容爬到記憶體中)

import urllib.request,re
#urllib.request.urlopen(連結)代表你要爬取的網站
#.read()讀取網站內容
#.decode("utf-8","ignore")按照utf-8方式解碼,加上ignore成功率會更高
data = urllib.request.urlopen("http://www.jd.com").read().decode("utf-8","ignore")
#這就是之前學過的正規表示式,如果不懂可以看本部落格最頂部的正規表示式連結,那裡有講解
string = "<title>(.*?)</title>"
biaoti = re.compile(string,re.S).findall(data)
print(biaoti)

執行結果如下:輸出了www.jd.com的標題
在這裡插入圖片描述

Urllib例項2(將內容爬到電腦硬碟中)

import urllib.request
#urllib.request.urlretrieve(網址,檔案位置)將爬取到的檔案儲存到電腦指定的位置
urllib.request.urlretrieve("http://www.jd.com",filename="D:\\微信公眾號:驕傲的程式設計師\\京東.html")

執行結果如下:將www.jd.com的原始碼儲存到了:D:\微信公眾號:驕傲的程式設計師\京東.html中
在這裡插入圖片描述

Urllib例項3(瀏覽器偽裝)

以上兩種方法只適用於部分網站,對於一部分反爬的網站是不可以的,比如糗事百科就必須是瀏覽器才能爬取,直接用編輯器爬取是行不通的,所以要將自己的編輯器偽裝成瀏覽器,才可以繼續爬取內容,將編輯器偽裝成瀏覽器其實很簡單,只要將某一個瀏覽器的User-Agent寫在自己的程式碼中即可。

#大家可以使用這些我搜集的User-Agent,大家也可以在瀏覽器中自己查詢
#查詢方法:F12,Network下的最後一個Request heard有一個User-Agent:後面就是
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",#360
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36",#谷歌
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0",#火狐
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.5",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0",#火狐

瀏覽器偽裝辦法:

import urllib.request

url = "http://www.qiushibaike.com/"
#宣告一個urllib.request.build_opener()物件
opener = urllib.request.build_opener()
#以JSON格式(鍵值對)儲存一個User-Agent
UA = ("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36")
#將User-Agent賦值給opener.addheaders
opener.addheaders=[UA]
#將urllib.request的install_opener改成我們們的
urllib.request.install_opener(opener)
#這回在爬就沒毛病啦
data = urllib.request.urlopen(url).read().decode("utf-8","ignore")
string = "<title>(.*?)</title>"
biaoti = re.compile(string,re.S).findall(data)
print(biaoti)

執行結果如下:輸出了www.qiushibaike.com的標題
在這裡插入圖片描述
如果按照之前的方法的話,就會出現以下錯誤:遠端端關閉連線,無響應,說明請求被對方伺服器拒絕了。

http.client.RemoteDisconnected: Remote end closed connection without response

Urllib例項4(使用者代理池)

然而有的時候,瀏覽器會檢查怎麼總是這一個瀏覽器訪問我呀,也能也會拒絕我們們的訪問,所以,我們用了使用者代理池的方法,就是在一個陣列中儲存多個User-Agent,我們叫他代理池,每次隨機呼叫其中一個User-Agent,這樣就會解決這個問題,例項如下:

import urllib.request,re,random
#建立一個使用者代理池陣列
uapools=[
    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",#360
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36",#谷歌
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0",
    "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.5",
    "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0",
]
#定義一個方法UA()
def UA():
	#建立一個urllib.request.build_opener()物件
    opener = urllib.request.build_opener()
    #每次從uapools中隨機選取一個User-Agent
    thisua = random.choice(uapools)
    #以JSON格式(鍵值對)儲存一個User-Agent
    ua = ("User-Agent",thisua)
    #將User-Agent賦值給opener.addheaders
	opener.addheaders=[ua]
	#將urllib.request的install_opener改成我們們的
    urllib.request.install_opener(opener)
    print("當前使用User-Agent:"+str(thisua))

url = "http://www.qiushibaike.com/"
for i in range(0,10):
    UA()
    #這回就可以快樂的爬取網站內容啦
    data = urllib.request.urlopen(url).read().decode("utf-8","ignore")
    string = "<title>(.*?)</title>"
    biaoti = re.compile(string,re.S).findall(data)
    print(biaoti)

執行結果如下:輸出了www.qiushibaike.com的標題10次
在這裡插入圖片描述
以上就是一些爬蟲基礎,接下來還會持續更新這篇部落格,希望大家支援謝謝大家。
我還寫了一篇爬蟲實戰(含程式碼),大家快來點我檢視
在這裡插入圖片描述

相關文章