您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關python中怎么實現一個高階爬蟲,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
一、獲取內容
說爬蟲一定要先說爬取內容的方法,python有這么幾個支持爬蟲的庫,一個是urllib和它的后續版本庫,這個庫做爬取的時候生成的中繼對象是比較多的,樓主也記不大住都有什么,而且這個庫的使用在樓主看來有些過時了。更加建議做爬取的時候使用requests庫(ps:不是request)
使用urllib:
html = urllib.request.urlopen(url).read()
使用requests:
r = requests.get(url)
對于獲取到的內容,有以下方法進行處理:
1、使用正則表達式匹配。
2、使用BeautifulSoup對爬取內容標簽對象化。
3、通過構造節點樹使用Xpath獲取元素。
第一種方法勝在直接,效率高而且不需要安裝三方庫。第二種方法勝在簡單,標簽對象化后不需要寫復雜的正則表達式,而且提取標簽更加方便。第三種方法勝在靈活,獲取內容更加靈活,就是語法有點多,不熟的話可以對著Xpath語法文檔寫。
使用正則表達式匹配:
pattern_content = '<div class="rich_media_content " id="js_content">(.*?)</div>' content1 = re.findall(pattern_content, html, re.S)
使用BeautifulSoup對爬取內容標簽對象化:
soup = bs4.BeautifulSoup(html, 'lxml') imgs = soup.find_all('img')
關于BeautifulSoup的安裝請自行百度,沒記錯的話直接pip是可行的。
通過構造節點樹使用Xpath獲取元素:
selector=etree.HTML(html) content=selector.xpath('//div[@id="content"]/ul[@id="ul"]/li/text()')
至此,爬取的基本內容就敘述完畢了,這里給出的是最簡單的范例,如果想深入了解某種方法,建議去查詢更詳細的技術文檔。
下面內容就是之前的了,略作刪改。
二、偽造表單請求頭
很多網站上的數據爬取比較簡單,只需要直接request那個網址就可以,很多小型網站都是這樣。面對這樣的網站數據,只需要花個幾分鐘隨便寫幾行代碼,就能爬到我們想要的數據。
但是想要爬取稍微大型一些的網站數據,就不會這么容易了。這些網站的服務器,會分析收到的每一條request,來判斷該請求是否為用戶操作。這種技術,我們把它稱為反爬技術。常見的反爬技術,樓主知道的有上面所述的分析請求,還有驗證碼技術。對于這兩種情況,我們在構造爬蟲程序的時候就需要稍微費點力氣了。
先來介紹第一種的應對方法。首先我們要知道一條request的組成部分,不同網站的request格式可能會有點不同。對于這一點,我們可以通過瀏覽器的開發者工具,抓到一個網站的請求數據格式。如下圖:
11111
此為使用谷歌瀏覽器抓取的請求信息。
我們可以看到request headers的格式,所以在訪問這樣的網站的時候,我們就不能忘了在postdata中放上一條偽造的headers。
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; rv:32.0) Gecko/20100101 Firefox/32.0', 'Referer': 'Address'}
其中referer鍵對應的值是要訪問的網址。
某些網站還會需要有cookie的用戶驗證,我們可以通過調用
requests.Session().cookies
來獲得它。
如果在爬蟲中需要提交某些信息的話,還要構造一下postdata的數據。比如這樣:
postData = { 'username': ul[i][0], 'password': ul[i][1], 'lt': b.group(1), 'execution': 'e1s1', '_eventId': 'submit', 'submit': '%B5%C7%C2%BC', }
三、關于多網頁的爬取
如果網頁地址有規律,那么構造url用個循環函數就好,對于網頁地址中包含隨機碼的時候,通常就是先爬取根頁面,獲取到所有想爬取的子頁面url,把這些url放進一個url池(項目小是一維的列表,項目大的時候可能會是高維的列表)里,循環爬取。
而比較高效的方式是使用多線程技術,demo有點長只貼關鍵部分。
class Geturl(threading.Thread): def __init__(self): threading.Thread.__init__(self) def run(self): res = requests.get(url, headers=header) html = res.text # print(html) pattern_href = '<a target="_blank" href="(.*?)" rel="external nofollow" id' href = re.findall(pattern_href, html, re.S) for href in href: href = href.replace('amp;', '') a.put(href) a.task_done() class Spider(threading.Thread): def __init__(self): threading.Thread.__init__(self) def run(self): href = a.get() res = requests.get(href, headers=header2) html = res.text pattern_title = '<title>(.*?)</title>' title = re.findall(pattern_title, html, re.S) pattern_content = '<div class="rich_media_content " id="js_content">(.*?)</div>' content1 = re.findall(pattern_content, html, re.S) print(title) # time.sleep(1.5) pattern_content2 = '>(.*?)<' content2 = re.findall(pattern_content2, content1[0], re.S) while '' in content2: content2.remove('') content = '' for i in content2: content = content + i content = content.replace(' ','') print(content)
開兩個線程,一個爬取url放進url池,一個從url池里獲取url然后爬取內容,再開一個線程監控兩個線程,如果兩個線程運行完畢,結束主線程。
python的多線程機制底層做的其實不好,理由不多講。另,多線程具體操作很多就不展開講了。
四、關于使用代理ip
很多網站會有ip檢測機制,當同一ip以人力無法做到的速度多次訪問網站時,通常就會觸發這種機制。
代理ip的話,通常通過爬取一些開源ip網站發布的ip構建ip代理池,比如西刺、蘑菇等。這樣的一些網站,直接百度代理ip就能找到。然后,使用Flask+Redis維護代理池。這部分詳細說明也比較長,就不細說了。也不是爬蟲必要的東西。另,自己有服務器的也可以使用SSR的翻墻工具,不過搭建不是樓主親手做的,所以就不詳細說明了。
五、關于selenium模仿瀏覽器操作
關于selenium主要介紹以下幾點:
1、selenium 是一套完整的web應用程序測試系統,包含了測試的錄制(selenium IDE),編寫及運行(Selenium Remote Control)和測試的并行處理(Selenium Grid)。
2、Selenium的核心Selenium Core基于JsUnit,完全由JavaScript編寫,因此可以用于任何支持JavaScript的瀏覽器上。
3、selenium可以模擬真實瀏覽器,自動化測試工具,支持多種瀏覽器,爬蟲中主要用來解決JavaScript渲染問題。
4、用python寫爬蟲的時候,主要用的是selenium的Webdriver。
這些是某說明文檔的內容,能看懂就看,看不懂就看樓主的簡單版:
selenium的話主要用于模仿瀏覽器操作,比如向文本框中賦值,點擊按鈕等。配合高效率瀏覽器的話也是實現爬蟲的一個比較好的方法。優點是通過模擬瀏覽器操作,不易被反爬檢測。缺點是效率低下,非常不適合大型爬蟲,小作坊自己玩玩就好。
六、關于Scrapy框架
這又是一塊非常非常龐大的內容,很多技術一旦牽扯上框架就麻煩了。當然學會了的話,做大型項目就簡單多了。重點就是框架一般針對比較大型的系統去做,所以其管理和操作會比較麻煩,內部的一些機制也不是很好說明。這一塊的話如果以后有時間就單獨寫一篇文章詳細介紹,畢竟從原理到搭建到配置到使用,內容太多。。
關于python中怎么實現一個高階爬蟲就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。