基於python的網路爬蟲初探

2021-09-11 21:17:48 字數 4478 閱讀 9128

@toc基於python的網路爬蟲學習筆記1

常用的主要有兩個庫:

1)urllib庫。urllib庫是python內建的http請求庫,可以直接使用。

2)requests庫。requests庫是用python語言編寫的。它比更加方便,使用它可以節約我們大量的工作,完全滿足http的測試需求。簡單易用。

網頁解析器,即主要用於從html網頁資訊中提取需要的、有價值的的資料和鏈結。python中主要有三種工具:

1)正規表示式。描述一種字串匹配的模式,提取效率高但表示式不直觀,寫起來比較複雜。

2)lxml庫。使用的是xpath語法,可在xml文件中對元素和屬性進行遍歷。直觀易懂,配合chrome或firefox瀏覽器寫起來簡單、執行效率高。

3)beautiful soup。beautiful soup可以從html或xml檔案中提取資料的python庫。簡單易學,但比前兩種解析速度慢。

幫助實現爬蟲專案的半成品。結合具體應用場景呼叫框架的介面,通過少量的**實現乙個爬蟲專案。python中常見的有三種:

1)scrapy框架。scrapy框架是python中最著名、最受歡迎的爬蟲框架,相對成熟。它是為了爬取**資料、提取結構性資料而編寫,也可以用於資料探勘、資訊處理或是儲存歷史資料等一系列程式中。

2)pyspider框架。pyspider框架是國人編寫的、用python實現的。可在瀏覽器介面上進行指令碼的編寫、功能的排程和爬取結果的實時檢視,後端利用常用資料庫進行爬取結果的儲存,還能定時設定任務以及任務優先順序等。

3)cola框架。cola框架是乙個分布式的爬蟲框架,使用者只需編寫幾個特定的函式,而不需關注分布式執行的細節,任務會自動分配到多台機器上,整個過程對於使用者是透明的。

從客戶端到伺服器端的請求訊息。http請求由請求方法、請求頭部、請求正文3部分組成。

1)請求方法:

get方法:請求指定頁面資訊,並返回實體主體。

post方法:向指定資源提交資料進行處理請求,資料被包含在請求體中。

平時開啟乙個**一般使用的是get方法,如果涉及向**提交資料(如登陸),就用post方法。除此之外,還有一些其他的請求方法,如:head 、put、 delete 、connect 、options 、trace等,實際爬蟲中較少用到。

2)請求頭部:

請求頭部包含很多有關客戶端環境和請求正文的有用資訊。一般**伺服器最常用的反爬蟲措施就是通過讀取請求頭部的使用者**(user-agent)資訊,判斷該請求是來自正常的瀏覽器還是爬蟲。

開啟某瀏覽器—空白處右鍵—檢查—network—重新整理頁面----。。。。

3)request庫請求方法:

在這裡插入**片

import requests

#獲取豆瓣首頁。得到響應物件

response = requests.get('')

#獲取文字方式的響應體內容

text_r = response.text

#檢視響應體編碼方式

encode_type = response.encoding

#設定響應體編碼方式

response.encoding = 'utf-8'

#檢視網頁原始碼

org_code = response.content

#響應狀態碼,常見狀態碼及含義:200---請求成功;301---資源被永久轉移到其它url;

#404---請求的資源或網頁不存在;500---內部伺服器錯誤。

status = response.status_code

#定製請求頭部,字典dict形式

headers =

#檢視設定的請求頭部

head = response.request.headers

#或者head = response.headers

#重定向

response.history

#超時設定,表示若在timeout=3秒內收不到豆瓣伺服器的響應,就會丟擲timeout異常。

response = requests.get('',timeout = 3)

#檢視實際請求的url

response.url

#傳遞url引數:

payload =

r = requests.get('search', params = payload)

r.url

#search?q=python&cat=1001

lxml大部分功能存在於etree下,下面主要使用etree這個模組實現網頁解析。

#載入所需包

import requests

from lxml import etree

#定義乙個html原始碼作為示例,如下所示:

​html="""

"""

1)通過路徑查詢元素

xpath語法實際上就是使用這種層級的路徑來找到相應元素的,類似與人們常使用的位址,從大的犯罪一直縮小到具體的某個位址上。但如果要找的某個元素或位址是獨一無二的,可以直接指明這個位址,不需要層級關係來一層一層的定位。

#利用html原始碼初始化etree

selector = etree.html(html)

#查詢所有的標籤,xpath用//表示從根節點開始查詢

all_li = selector.xpath('//div/ul/li')

#因為原始碼中標籤是唯一的因此也可以從根節點取定位ul開始查詢

all_li = selector.xpath('//ul/li')

#定位某乙個標籤,eg:第乙個(**xpath中的序號是從1開始的,這與python切片的初始編號不同)

li_1 = selector.xpath('//ul/li[1]')

#現在提取第乙個標籤下的標籤裡面的文字「first item」

li_1_text = selector.xpath('//ul/li[1]/a/text()') # [「first item」]

#li_1_text 是列表形式輸出,若要輸出元素則如下:

li_1_text_a = selector.xpath('//ul/li[1]/a/text()')[0] # 「first item」

2)通過屬性查詢元素

在htm中有< li class=「item-0」>、< a href=「link1.html」 >這樣的**,這裡的class 和href 分別是標籤< li >和< a >的屬性。因此,也可通過屬性來定位元素。

#查詢第三個li_3 = selector.xpath('//ul/li[@class="item-inactive"]')

#因為class="item-inactive" 在原始碼中是唯一的,因此,也可如下:(*表示任意字元)

li_3 = selector.xpath('//*[@class="item-inactive"]')

#接下來提取a 標籤裡面的文字

li_3_text = selector.xpath('//*[@class="item-inactive"]/a/text()')

#上述既可以在單引號裡面使用雙引號,也可以在雙引號裡面使用單引號,但不可同時使用單引號或者雙引號。

#li_3_text也可等價於如下:

li_3_a_text = selector.xpath('//*[@href="link3.html"]/text()')

#提取li_3中href的屬性值,而不是標籤a的文字值,如下:

li_3_a_label = selector.xpath('//ul/li[3]/a/@href')

#取出所有li標籤的class屬性

all_li_class = selector.xpath('//li/@class')

3)xpath的其他用法

部分匹配:starts-with; 相對路徑 ; string()提取**段所有文字

#提取前5個li 標籤

li_before_5 = selector.xpath('//li[starts-with(@class,"item-")]')

#提取第三個li標籤下a標籤的文字,相對路徑,接著li標籤繼續向下查詢

li_3_text = li_before_5.xpath('a[3]/text()')

#提取ul這一層本層的文字

ul_text = selector.xpath('//ul/text()')

#提取ul 裡面各層級的所有文字

all_text = selector.xpath('string(//ul)')

#使用列表推導式取出所有的文字

[s.strip() for s in all_text.strip().split('\n')]

網路爬蟲初探

網路爬蟲作為乙個在網路中搜尋資料的神器,在接下來的一系列文章中我會持續跟新,實現的語言使用c 權當做是把丟掉多年的c 再重新撿起來。資料獲取利器之網路爬蟲 1 什麼是網路爬蟲 網路爬蟲是一種可以按照一定的規則,自動抓取網頁上內容的程式或者指令碼。通過對抓取到的內容進行分析,就可以得到感興趣的資料。如...

Python爬蟲初探

閒來無事研究了一下python的爬蟲技術,現在總結一下 testclass.py 檔案 加上這個可以輸入中文 coding utf 8 匯入幾個內建庫 import urllib import urllib2 import re import mytool 模擬瀏覽器和請求頭,否則顯示訪問出錯 us...

python爬蟲初探

確保程式引用類庫是否是引用的該目錄,否則會出現pip install chardet 後,無法在專案中呼叫chardet的問題.可能在會出現pip安裝到 usr local lib python2.7 dist packages下,但是程式在 usr local lib python2.7 dist...