爬蟲第二課:解析網頁中的元素


一、基本步驟

在我們理解了網頁中標簽是如何嵌套,以及網頁的構成之后,我們就是可以開始學習使用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)

 

到這里,簡單的網頁信息爬取就完成了,我們通過這串代碼拿到了網頁中商品圖片的地址,以及網頁中分類標簽,這次僅僅進行簡單信息的爬取,接下來還會繼續更新更多實例供大家參考學習。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM