一、基本步驟
在我們理解了網頁中標簽是如何嵌套,以及網頁的構成之后,我們就是可以開始學習使用python中的第三方庫BeautifulSoup篩選出一個網頁中我們想要得到的數據。
接下來我們了解一下爬取網頁信息的步驟。
想要獲得我們所需的數據分三步
第一步:使用BeautifulSoup解析網頁
Soup = BeautifulSoup(html,'lxml')
第二步:描述想要爬去信息的東西在哪里。
信息 = Soup.select('???')
要知道它叫什么名字,如何去定位。
第三步:從標簽中獲得你想要的信息
<p>Something</p>
從標簽中獲取我們需要的信息,去掉一些沒有用的結構,並且把我們獲取的信息按照一定格式裝在數據容器中,方便我們去查詢。
二、兩種路徑獲得方式詳解
接下來,我們首先進行第一步,如何使用BeautifulSoup解析網頁
Soup = BeautifulSoup(html,'lxml')
實際上我們構造一個解析文件需要一個網頁文件和解析查詢庫。就好比左邊的Soup是湯,html是湯料,而lxml是食譜。
今天我們需要講的BeautifulSoup,通過我們告訴它元素的具體的位置,就可以向他指定我們想要爬去的信息。
找到相應的元素右鍵檢查的,看到元素的代碼信息進行右擊,我們有兩種方式獲得標簽的位置的具體描述方式
1.使用copy selector
2.使用copy XPath
這兩種復制的路徑有什么區別,接下來就讓大家看一下
右鍵標簽copy selector復制出來的路徑
body > div.body-wrapper > div.content-wrapper > div > div.main-content > div:nth-child(15) > a
右鍵標簽copy XPath復制出來的路徑
/html/body/div[4]/div[2]/div/div[2]/div[14]/a
這兩種不同的路徑描述方式,使用copy selector復制出來的路徑叫做 CSS Selector,使用copy XPath復制出來的叫做XPath。
這兩種路徑的描述方式在今后的學習中我們都可以用的到,但是我們今天要學習的BeautifulSoup它只認第一種,就是CSS Selector。
但是為了方便我們以后的學習,更好認識網頁間不同元素的結構,我們先講一下XPath,在學習了它之后,CSS Selector也會更好的理解,同時日后我們需要學習的一些庫也需要用到XPath去描述一些元素的位置。
對XPath和
XPath
1.什么是XPath
Xpath使用路徑表達式在XML文檔中進行導航,解析到路徑跟蹤到的XML元素。
2.XPath路徑表達式
路徑表達式是xpath的傳入參數,xpath使用路徑表達式對XML文檔中的節點(或者多個節點)進行定位。
路徑表達式類似這種:/html/body/div[4]/div[2]/div/div[2]/div[14]/a 或者 /html/body/div[@class=”content”] ,其中第二個路徑中的[@class=”content”] 是為了在多個相同標簽中定位到一個標簽。
剛才拿到的那個XPath的路徑 /html/body/div[4]/div[2]/div/div[2]/div[14]/a,就針對於這一串來講,拿到的這個元素的完整路徑,叫做絕對路徑,其中每個‘/’就是一個節點,下面我們通過這個結構圖我們可以簡單了解一下。
為了更清楚地了解各個節點之間的關系,通過下面的圖片我們可以更直觀的了解。
html是父節點相對於下面的節點是父節點,下面的body和head相對於html是是子節點,div標簽相對於html標簽是子孫節點。
其中body又相當於div標簽的子節點,div標簽之間是兄弟節點,基本的結構以及等級就是這樣。
CSS Selector
1.什么是CSS Selector
Css Selector定位實際就是HTML的Css選擇器的標簽定位。
顧名思義CSS selector就是一種按照樣式進行選擇的一種標簽選擇方式。
2.CSS Selector路徑表達式
在css selector路徑中,最開始的路徑是body,不像是XPath中最開始的是html,我們拿到剛才的那個路徑看一下。
body > div.body-wrapper > div.content-wrapper > div > div.main-content > div:nth-child(15) > a
在這個路徑中,在第一個div后面加了一個.body-wrapper,這個就是這個標簽的樣式,這種選擇方式是按照樣式進行選擇的。
如果說XPath的路徑是按照:誰,在哪,第幾個的選擇方式
那么CSS Selector是按照:誰,在哪,第幾個,長什么樣子進行選擇
三、使用python代碼爬取網頁信息
通過剛才我們隊網頁中各種元素的路徑認識之后,我們就可以簡單的使用python的BeautifulSoup庫進行代碼級別實現網頁信息爬取,廢話不多說,直接上代碼。
這里是爬去信息的網頁就使用之前我進行聯系的網頁,網頁源碼的地址在https://www.cnblogs.com/liudi2017/p/7614919.html。
打開本地網頁的方式建議使用pycharm中新建一個html文件將源代碼復制進去,如果使用自帶的記事本需要把保存格式改為utf-8。
#!/user/bin/env python #-*- coding:utf-8 -*- import requests from bs4 import BeautifulSoup as bs #1.使用BeautifulSoup解析網頁 with open('./ddw.html','r',encoding='utf-8') as wb_data: #我使用的是本地文件所以使用open函數打開本地路徑下面的網頁 Soup = bs(wb_data,'lxml') #這里構造的是解析文件,wb_data是我們要解析的網頁,lxml是解析庫 # images = Soup.select('body > div:nth-child(2) > div.body > div.body_moth > div:nth-child(6) > div:nth-child(1) > img') #這里使用Soup的方法,直接在select后面括號里添加相應的路徑就可以。在這里就拿到圖片的信息 #但是這行代碼會有出錯信息,我們只需按照出錯信息中的處理方式進行修改即可 images = Soup.select( 'body > div:nth-of-type(2) > div.body > div.body_moth > div > div:nth-of-type(1) > img' ) #通過上面那一行代碼我們拿到了正確的圖片信息,不過們把其倒數二個div的標簽的css樣式刪除,這樣就不再定位到單個圖片, #就直接把所有同類型的圖片篩選出來,為什么要刪倒數第二個div的css樣式,因為這個div標簽的兄弟標簽是其他圖片標簽的父標簽 titles = Soup.select('body > div:nth-of-type(2) > div.head_top > div.head_top_ee > ul > li > a') #再拿到這網頁中的標題信息,同樣的為了拿到所有的同類標題標簽,根據位置信息刪除li標簽的css樣式 # print(images,titles,sep='\r-----------------\r') for image,title in zip(images,titles): data = { 'image': image.get('src'), 'title': title.get_text(), } print(data)
到這里,簡單的網頁信息爬取就完成了,我們通過這串代碼拿到了網頁中商品圖片的地址,以及網頁中分類標簽,這次僅僅進行簡單信息的爬取,接下來還會繼續更新更多實例供大家參考學習。