最近在做乙個簡單的靜態網頁內容抓取程式,在抓取過程中總是遇到定位不準確,資料返回值為空列表或者抓了一大堆非目標資訊的問題,讓我頭疼不已。思考之後,就想著做乙個簡單的歸納總結,以便以後抓取**時提高效率。
1.鏈結命名方法
要做好準確網頁資料的定位,首先我認為要搞明白網頁資料位置的命名方法。這邊以中關村的某個頁面控制台為例
可以看到這個頁面上所有的鏈結都有特定的標籤項。方便起見,我就按顏色把標籤分類命名,紫色的叫頭標籤,黃色的是叫屬性標籤,藍色的就叫內容標籤。
所有的頭標籤都是可以點開的,裡面富含了許多不同的分類,頭標籤的後面會跟上乙個屬性標籤,屬性標籤後面是內容標籤,他們的關係是從大到小逐級遞減的。就好比媽媽要找五年級三班的小明回家吃飯,那麼她應該先來到五年級樓層(div=5),點開,好一共5個班級,然後再找三班(class=3),最後再大喊小明的名字(a[contains(text(),"小明']),找到相應物件。
2.位址查詢方法總結
1)、直接法:xpath、@id、@class、@name等
直接法顧名思義,就是直接準確地指出所查詢物件的標籤,從而精確定位。這種方法比較直觀簡單,便於查詢和編譯者在程式設計過程中檢查所定位的**鏈結是否存在錯誤。但是直接法也有其侷限性或者說是先決條件,因為每個鏈結所對應的xpath都是不同的,因此如果想要抓取的資料前後xpath發生了改變,那麼就不能使用xpath法定位。再者,某些鏈結的屬性標籤可能相同,如:「@class=jd_1234/li/span/「螢幕大小」」和「@class=jd_1234/li/span/a/"螢幕材質"」 那麼在使用@class=jd_1234的時候就要謹慎,如果不後續追加其他查詢條件,可能就會多抓取到結果。
當然使用xpath時還有一點好處,就是可以一下子抓取到相同類似標籤的所有資料。如果我們想要獲得「...../li[1]/a"~"..../li[9]/a "的資料,在記事本 copy xpath後發現,li列表下的資料剛好只有1~9,那麼我們也就不用乙個個輸入xpath,可以直接輸入「..../li/a 」,這樣就獲得所有li裡的a標下的值。這個方法在依次獲取整塊資料的情況下非常實用。
2)、間接法: 直接查詢法、contains語句
還是拿小明同學舉例子,如果現在已知小明在五年級三班,從他們班個子最高的那個同學的位子向前數三位就是小明的位子。好那我們現在要找小明就多了一種方法,我們可以先找到小明班級裡那個個子最高的同學所在的那一列 ,然後從他開始向前數三個,就找找到了小明的位子。這種不直接查詢目標物件具體標籤而先查詢相對目標的方法就是間接法。這個例子中,「個子最高的同學「就相當於乙個內容標籤,起到定位的作用。(seats in lines /contains[text (),"the highest student "]/front three —>小明)
可能有人會問,我既然都已經知道了小明的名字,為什麼不直接搜尋,而要採用這麼一種複雜的方法來定位呢?一般來說,間接式的查詢方法適用於兩種情況: 1、屬性標籤重複 2、網頁鏈結字尾變化 還是剛剛那個例子,假設說五年級三班裡現在有五個小明,那麼現在"小明"這個內容標籤就不具備唯一性,所以@name查詢無效。又假設說小明很調皮,每天早上出門都要換乙個名字,今天叫小張,明天叫小吳,但他在學校的位子始終不變,那麼我們還是可以通過間接法定位到小明的位置。間接法同樣還適用於**中的對應關係,通過專案名稱查詢到對應的內容。
3)、查詢方法的邏輯組合
當我們想要一次性查詢多個條件的目標物件時,就需要使用邏輯組合。如找出班級裡所有姓「王」和姓「李」的同學,顯然乙個xpath和@name不能解決兩個條件。這時候用邏輯連線符and、or、not來連線兩個條件(@name[contains(text ="王」)and contains(text ="李"))
用scrapy進行網頁抓取
最近用scrapy來進行網頁抓取,對於pythoner來說它用起來非常方便,詳細文件在這裡 要想利用scrapy來抓取網頁資訊,需要先新建乙個工程,scrapy startproject myproject 工程建立好後,會有乙個myproject myproject的子目錄,裡面有item.py ...
用scrapy進行網頁抓取
最近用scrapy來進行網頁抓取,對於pythoner來說它用起來非常方便,詳細文件在這裡 要想利用scrapy來抓取網頁資訊,需要先新建乙個工程,scrapy startproject myproject 工程建立好後,會有乙個myproject myproject的子目錄,裡面有item.py ...
Windows安裝Scrapy時遇到的問題
今天博主在安裝scrapy時,遇到不少的問題,為防止以後再次出現類似錯誤,在此做下記錄。1 安裝python 其他的安裝細節,就不在這詳細說明,網上很多python各個版本的安裝教程 2 安裝scrapy 安裝完python之後,開啟windows命令列,輸入命令 pip install scrap...