@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...