python對于爬蟲的編寫已經是相當的友好了,不過除了利用requests庫或者scrapy架構之外,有一些庫還需要我們知道,以便于我們更熟練、便捷的完成目标資料的爬取,接下來我就總結一下我認為在爬蟲中常用的幾個庫。
一、re
re庫是正規表達式庫,是regex的縮寫,用于從網頁源碼或者資料檔案中提取我們所需的資料,具體使用方法如下:
①闖進過濾字元串的規定,一般用變量regex存儲;
②将規則編譯:pattern = re.compile(regex)
③使用規則進行查找:content = re.findall(pattern, html)
對于re庫來說,最難的便是編寫出相應的過濾規則,曾看到過這樣一句話:如果一個問題你用了正則,那麼就變成了兩個問題。 接觸過正則的也都知道它确實存在一定的難度性,下面是我對常用的符号用法的總結:
‘*’:比對前面的子表達式零次或無數次;‘+’:比對前面的子表達式一次或無數次;
‘.’:比對除換行符\n以外的任何單字元;‘?‘:比對前面的子表達式零次或一次;
’^':比對輸入字元串開始位置;‘$’:比對輸入字元串的結尾位置
‘\w':比對字母、數字、下劃線;’\d‘:比對數字;
’\s':比對空格;反義:将前面的字母改為大寫,即指原義的反義;
‘{n}’:重複n次;‘{n,m}’:重複n到m次;
‘{n, }':重複n次或更多次;’?<=exp‘:比對exp後的資訊;如 How are you:(?<txt>(?<=How).+)
‘(?=exp)’:比對exp前面的位置,如 How are you doing:(?<txt>.+(?=ing)) 這裡取ing前所有字元,并定義txt為捕獲分組名。
二、json
json是本身是一種存儲格式,與python中的字典比較類似。因為我們在爬取時可能直接爬取到json格式資料,或者為友善後面的 使用需要将爬取資料轉為json資料。是以學會運用json庫,可以更加友善地提取我們所需資料。json中常用操作有: ①dumps:将python對象編碼成json字元串。 其中一個參數為ensure_ascii,預設為True,若出現non-ascii字元,則出現\uxxxx,設為False即可。 ②loads:用于解碼json資料,傳回python字段資料類型。 ③encode:在轉json檔案時将檔案編碼轉為utf-8 ④decode:用于轉為python類型時檔案的解碼。
三、xpath
同樣是資料解析包,得到網頁響應後傳入xpath表達式,結果傳回表達式所對應所有節點清單,如scrapy中:response.xpath()。 extract():在提取節點中特定資料時後面要加,序列化該節點為unicode字元串并傳回清單,後面可跟encode轉碼。如:
item['workType'] = data.xpath('./td[2]/text()').extract()[0]
xpath提取例子: ①/html/head/title/text():選擇<html>下<head>下<title>元素的文字。 ②//td:選擇所有<td>元素,用 | 實作或操作,用 and 實作且操作。 ③//div[@class='mine']:選擇所有具有class='mine'屬性的div元素,傳回節點清單。 注:若要提取連結,定位到标簽内部吼,後面加上 /@href 即可擷取到标簽内的連結。
四、threading
該庫是Python中實作多線程加速的第三方庫,具體用法如下: ①建立待加速函數,如爬取函數spider(url)。 ②對每個url建立多線程:threading.Thread(target=spider, args=(u,)); 注意:在Thread中的參數分别是待加速函數和待加速函數的參數,這兩個是分開寫的!! ③随後使用.start()開始加速,将所創多線程加入到所建threadlist中。 ④最後使用 .join() 即可, 周遊threadlist,完成加速
五、multiprocessing
multiprocessing一般用來實作多程序加速,使用方法類似于threading,具體如下: ①一般使用from multiprocessing import Process 導入多程序加速方法。 ②建立待加速函數,如爬取函數spider(url)。 ③對每個url建立多程序:p = Process(target=spider, args=(u,)); 注意:在Process中的參數與上述多線程加速一樣,也将函數與所傳參數分開寫!! ④最後使用 p.start() 即可。
六、pymysql
pymysql提供了python與mysql資料庫相連的接口,即利用該庫可以實作python與mysql資料庫的連接配接,具體操作如下: ①建立連接配接:conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='對應名', charset='utf-8') ②建立遊标:cursor = conn.cursor() ③執行sql語句,并傳回受影響行數:effect_row = cursor.execute("select * from table") ④送出:conn.commit() ⑤關閉遊标與連接配接:cursor.close(); conn.close()
七、mechanize
利用mechanize,可以實作對浏覽器行為更好的模拟,常用有以下模拟方法: ①Browser():建立(打開)浏覽器。 ②open():打開網頁。 ③links():擷取網頁中所有連結;可以周遊 links() 方法,其下還有 .base_url 與 .url 屬性。 ④forms():擷取所有表單。 ⑤form[‘form_name’]:填寫名為form_name表單中的資訊。 ⑥submit():送出表單。 ⑦response().read():檢視送出表單後的結果。 ⑧addheaders變量:存放用于欺騙伺服器的表頭。 mechanize中包含了許多模拟浏覽器設定,如處理機器人協定等,具體使用時,具體查詢即可,常用的一系列設定如下:
#options
br.set_handle_equiv(True)
#br.set_handle_gzip(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)
#Follows refresh 0 but not hangs on refresh > 0
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
br.set_debug_http(True)
br.set_debug_redirects(True)
br.set_debug_responses(True)
八、readability
readability是專門用于網頁正文内容提取的第三方庫,平時用的不多,但是可以輕松實作提取: ①導入:from readability.readability import Document ②使用: 正文:readable_article = Document(urllib.urlopen(url).read()).summary() 題目:readable_title = Document(urllib.urlopen(url).read()).short_title()
以上八個庫便是在完成爬蟲時常需借助的第三方庫,願能夠為大家帶來幫助。