1. 程式人生 > >爬蟲基礎python爬蟲入門

爬蟲基礎python爬蟲入門

#爬蟲

##1爬蟲基礎知識 爬蟲是什麼?一個自動化的資料收集程式 爬蟲分類?四類 1.通用爬蟲–什麼內容都爬,比如搜尋引擎,百度谷歌 2.聚焦爬蟲–爬取特定內容 3.增量式爬蟲-爬取更新的內容 4.深層網路爬蟲-爬取提交表單後的資料 通用爬蟲弊端: 通用搜索引擎返回太多沒有用的資料 伺服器資源有限,而網路資料資源無限 網路資源多樣化,通用爬蟲模型無法很好獲取。 3.爬蟲不是獨立的技術–前端開發基礎知識 資料庫基礎 網路基礎 抓包分析能力 爬蟲框架 4.scrapy開發流程 1.建立工程 2.明確下載物件,ITEM,結構化資訊 3.Spider–解析邏輯,迴圈邏輯 4. 爬蟲-聚焦爬蟲 聚焦爬蟲是有目的的爬取,可以節省大量的伺服器資源和頻寬資源,具有很強的實用性。 流程: 首先聚焦爬蟲有一個控制中心,該控制中心負責對整個爬蟲系統進行管理和監控,主要包括控制使用者互動、初始化爬行器、確定主題 、協調各模組之間的工作、控制爬行過程等方面。 然後,將初始的URL集合傳遞給URL佇列,頁面爬行模組會從URL佇列中讀取第一批URL列表,然後根據這些URL地址從網際網路中進行相 應的頁面爬取。爬取後,將爬取到的內容船到頁面資料庫中儲存,同時,在爬行過程中,會爬取到一些新的URL,此時,需要根據我 們所定的主題使用連線過濾模組過濾掉無關連線,再將剩下來的URL連線根據主題使用連結評價模組或內容評價模組進行優先順序的排 序。完成後,將新的URL地址傳遞到URL佇列中,供頁面爬行模組使用。另一方面,將頁面爬取並存放到頁面資料庫後,需要根據主題 使用頁面分析模組對爬取到的頁面進行頁面分析處理,並根據處理結果機那裡索引資料庫,使用者檢索對應資訊是,可以從索引資料庫 中進行相應的檢索,並得到對應的結果。

##網路爬蟲可以幹什麼? 1、爬取多站新聞,集中閱讀2、爬取金融資訊,進行投資分析,3、製作搜尋引擎 4、爬取圖片5、爬取網站使用者公開的資訊進行分析6、自動去網頁廣告7、爬取使用者公開的聯絡方式

##聚焦網路爬蟲

聚焦網路爬蟲,由於其需要有目的的進行爬取,所以對於通用網路爬蟲來說,必須要增加目標的定義和過濾機制,具體來說,此時其 執行原理和過程需要比通用網路爬蟲多出三步,即目標的定義、無關連結的過濾、下一步要爬取的URL地址的選取。 常見的網路更新策略有三種:使用者體驗策略、歷史資料策略、聚類分析策略 聚類分析可以分解商品之間的共性進行相應的處理,將共性較多的商品聚為一類。 在爬蟲對網頁爬取的過程中,爬蟲需要必須需要訪問對應的網頁,此時,正規的爬蟲會告訴網站站長其爬蟲身份。網站的管理員則可 以通過爬蟲告知的身份資訊對爬蟲的身份進行識別, 開發網路爬蟲的語言有很多,常見的有python、java、PHP、Node.js、C++、Go語言等。

#2.urllib庫 -Urllib庫是Python中的一個功能強大、用於操作URL,並在做爬蟲的時候經常要用到的庫。 -URL讀取內容有三種方式:read;讀取全部並且把內容賦給一個字串變數、readline讀取一行、readlines讀取全部並且把內容賦給一個列表變數。 -imoprt urllib.request -file=urllib.rqquest.urlopen(“網址”) -data=file.read() -print(data)#讀取網站資訊並列印 -#將網頁資訊以網頁的形式儲存到本地。 -file1 = open('儲存路徑及地址’,‘wb’) -file1.write(data)#將變數data寫入檔案中 -file1.close#關閉檔案

除了以上方法之外還可以使用urllib.request裡面的urlretrieve()函式直接將對應資訊寫入本地檔案。 -格式:urllib.request.urlretrieve(url,filename=本地檔案地址)。 -例子:urllib.request.urlretrieve(“http://www.baidu.com”,filename="D:/a/index.html) 注:urlretrieve執行的過程中會產生一些快取,如果我們要清除這些快取資訊,可以使用urlcleanup()進行清除 eg:urllib.request.urlcleanup()

除此之外urllib中還有一些常見的用法: -file.info()#返回與當前環境相關的資訊。file表示當前爬取的網頁,file=urllib.request.urlopen(網址) -flie.getcode()#返回狀態碼,若返回200為正確。 -file.geturl()#返回當前爬取的URL地址

url編解碼: url標準中只會允許一部分ASCII字元,而其他的一些字元,比如漢字等,是不符合URL標準的。所以如果我們在URL中使用一些其它不符合 標準的字元就會出現問題,此時西藥進行URL編碼方可解決。 編碼:urllib.request.quote() eg:a = urllib.request.quote(“http://www.baidu.com”) 解碼:urllib.request.unquote() eg:urllib.request.unquote(a)

##瀏覽器的模擬——Headres屬性 當遇到無法爬取的網頁時會用到headres屬性,因為有些網站為了防止別人惡意採集資訊進行了一些反爬蟲的設定。 這時候就可以設定一些Headres資訊,模擬成瀏覽器去訪問這些網站, 模擬成瀏覽器可以設定User-Agent資訊。 獲取User-Agent資訊:開啟任意一個網站F12調出開發者工具network,任意點選一個連結,使網頁發生一個動作。觀察下方的視窗會出現 一些資料,隨意點選一個數據在後側Headres中可以看到對應的頭資訊,往下拖動,可以找到User-Agent字樣的一串資訊。 例如:User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36 爬蟲模擬成瀏覽器訪問頁面的設定方法:

方法1,:使用build_opener()修改報頭] 由於urlopen()不支援一些HTTP的高階功能,所以,我們如果要修改報頭,可以使用urllib.request.build_opener()進行 eg:

import urllib.request
url="要爬取的網址"
headers=("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36")
opener = urllib.request.build_opener()
opener.addheaders = [headers]
data = opener.open(url).read()

上述程式碼中,首先,我們定義了一個變數url儲存要爬取的網址,然後在定義一個變數headers儲存對應的User-Agent資訊,定義的格式為 (“User-Agent”,具體資訊),具體資訊我們已經從瀏覽器中獲取了,該資訊獲取一次即可,以後再爬取其他網站的時候可以直接用。 然後我們需要使用urllib.request.build_opener()建立自定義的opener物件並賦給變數opener,接下來,設定opener物件的addheaders, 即設定對應的頭資訊,設定格式為:“opener物件名.addheaders=[頭資訊]”,設定好頭資訊之後,我們就可以使用opener物件的open() 方法開啟對應的網址了。此時,開啟操作已經是具有頭資訊的開啟操作行為,即會模仿為瀏覽器去開啟,使用格式是: opener物件名.open(url地址)開啟後再使用read()方法讀取對應資料,並賦給data變數。

方法2:使用add_header()新增報頭] import urllib.request url=網址 req=url.request.Request(url)#建立Request物件並賦給變數req req.add.header(‘User-Agent’,‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36’)#新增報頭資訊 data=urllib.request.urlopen(req).read()#開啟對應網址並讀取網頁內容賦給data

##超時設定 有的時候,我們訪問一個網頁,如果網頁長時間未響應,那麼系統就會怕短該網頁超時了,即無法開啟該網頁。 有的時候,我們需要根據自己的需要來設定超時的時間值。網站反應快就時間值就設定短一點,網站反應慢就設定長一點。 eg:將網站超時時間設定為1

for i in range(1,100):
    try:
        file=urllib.request.urlopen("http://www.baidu.com",timeout=1)
        data=file.read()
        print(len(data))
    except Exception as e:
        print("出現異常--"+str(e))

上述程式碼迴圈了99次每次都輸出獲得資料的長度,執行之後可以發現有幾次出現了異常,這是因為我們設定了超時,網站在1秒鐘之內沒 有做出迴應的話程式碼自動判定為超時異常,並輸出異常資訊。

##HTTP協議請求 HTTP協議請求主要分為6中型別 1、GET請求,GET請求會通過URL網址傳遞資訊,可以直接在URL中寫上要傳遞的資訊,也可以由表單進行傳遞。如果使用表單進行傳遞, 表單中的資訊會自動轉為URL地址中的資訊,通過URL地址傳遞。 2、POST請求,可以向伺服器提交資料,是一種比較主流也比較安全的資料傳遞方式,比如在登入時,經常使用POST請求傳送資料。 3、PUL請求,請求伺服器儲存一個資源,通常要制定儲存的位置。 4、DELETE請求,請求伺服器刪除一個資源 5、HEAD請求,請求獲取對應的HTTP報頭資訊。 6、OPTIONS請求,可以獲得當前URL所之氣的請求型別。

get請求 我們可以構造一個url讓程式碼去獲取我們想要的資訊。

import urllib.request
key="aa"
url="http://www.baidu.com/s?wd="+key#構造url
req=urllib.request.Request(url)#建立一個Request物件並賦給req
data=urllib.request.urlopen(req).read()#獲取網頁資訊並讀取出來賦給data變數。
print(len(data))
file1=open("D:/a1/xx1.html","wb")
file1.write(data)#將資訊寫入xx1.html檔案。
file1.close()

上述程式碼有不完善的地方,如果我們要檢索的關鍵詞是中文,就會報錯。 這時就可以用到urllib.request.quote()函式來編碼解決。

key="中文"
new_key=urllib.request.quote(key)
url="http://www.baidu.com/s?wd="+new_key

總結: 使用URL請求:1、構造URL地址2、構造Request物件3、開啟Request物件。4、讀取網頁內容、將內容寫入檔案。 如果引數中含有中文要使用quote函式對引數來編碼。

post請求 post請求常用於登入、註冊頁面

import urllib.request
import urllib.parse
url = "http://www.iqianyue.com/mypost/"
postdata = urllib.parse.urlencode({'name':'yudeqiang','pass':'123456'}).encode('utf-8')
#將資料使用urlencode編碼處理後,使用encode()設定為utf-8編碼
req = urllib.request.Request(url,postdata)#構建Request物件引數包括url和要傳遞的資料
#新增頭資訊模擬瀏覽器進行爬取
req.add_header("User_Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36")
data=urllib.request.urlopen(req).read()
print(len(data))

##代理伺服器的設定。 有時使用同一個ip去爬取同一個網站上的網頁,久了之後會被該網站伺服器遮蔽,使用代理伺服器就可以解決這個問題。 eg:

def user_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 = "14.215.194.75:34397"
data = user_proxy(proxy_addr,"http://www.baidu.com")
print(len(data))

我們首先建立了一個名為use_proxy的自定義函式,該函式主要實現使用代理伺服器來爬取某個URL網頁的功能。 在函式中,我們設定兩個形參,第一個形參為代理服務的地址,第二個形參代表要爬取的網頁的地址。 然後,使用urllib.request.ProxyHandler()來設定對應的代理伺服器資訊,設定格式為:urllib.request.ProxyHandler({‘http’: 代理伺服器地址}),接下來,使用urllib.request.build_opener()建立了一個自定義的opener物件,第一個引數為代理資訊,第二個參 數為urllib.request.HTTPHandler類。 為了方便,可以使用urllib.request.install_opener()建立全域性預設的opener物件,所以下面才可以直接使用urllib.request.urlopen( )開啟對應網址爬取網頁並讀取,編碼後賦給變數data,最後返回data的值給函式。 隨後,在函式外設定好對應的代理IP地址,然後嗲用地應以函式use_proxy,並傳遞兩個實參,跟別為使用的代理地址及要爬取的網址。 將函式的呼叫結果直接賦值給變數data,並輸出data內容的長度。或者也可以將data的值寫進某個檔案中儲存起來。

##DebugLog實戰

import urllib.request
httphd = urllib.request.HTTPHandler(debuglevel=1)
httpshd = urllib.request.HTTPHandler(debuglevel=1)
opener = urllib.request.build_opener(httphd,httpshd)
urllib.request.install_opener(opener)
data=urllib.request.urlopen("http://edu.51cto.com")

如何開啟DebugLog?思路如下: 1.分別使用urllib.request.HTTPHandler()和urllib.request.HTTPSHandler()將debuglevel設定為1 2.使用urllib.request.build_opener()建立自定義的opener物件,並使用1中設定的值作為預設引數。 3.用urllib.request.install_opener()建立全域性預設的opener物件,這樣在使用urlopen()時也會使用我們安裝的opener物件 4.進行後續相應的操作。

##異常處理神器——URLError實戰

程式再執行的過程中,難免會發生異常,常見的異常處理方法是try except

import urllib.request
import urllib.error
try:
    urllib.request.urlopen("http://ww1w.baidu.com")
except urllib.error.URLError as e:
    print(e.code)
    print(e.reson)