Python爬蟲||BeautifulSoup4庫-以小豬短租爲例

由於上次的文章被同學吐槽了,正則表達式過於麻煩,那就用BeautifulSoup庫吧,比正則表達式簡單太多了!只需要簡單的幾條語句,即可完成網頁中某個元素的提取。他是python的一個HTML或者XML的解析庫,主要的功能是解析和提取 HTML/XML 數據。
但注意,bs僅用於HTML文件,可以是請求後的網站也可以是本地HTML文件。
BeautifulSoup庫是解析,遍歷,維護標籤樹的功能庫。
安裝:pip install beautifulsoup4
由於BeatutifulSoup3已經沒有人維護了,所以需要安裝BeatutifulSoup4。

預備知識

導入庫

from bs4 import BeautifulSoup

BeautifulSoup的四大對象。

tag(標籤)

使用find()方法獲取到的結果都是tag對象。

  • tag.name : 獲取標籤名稱。
  • tag.attrs : 獲取標籤內所有屬性,返回內容用字典形式保存(鍵值對)。
  • 也可以用層級形式進行定位,如:soup.body.div.div.p,但比較麻煩,在BeautifulSoup中實用性不是很高。

內部文字

直接調用.string即可。

BeautifulSoup

即文檔全部內容,可以分別取裏面的各個屬性。

comment

是一種特殊的內部文字,調用時需要對調用內容進行判斷。

BeautifulSoup的節點

用這個方法可以使用目標節點的附近節點來進行查找目標節點。

子節點與子孫節點

  • contents:將子標籤存入列表。
  • children:將子標籤存入一個迭代器,不是列表。僅包含tag的直接子節點。

父節點與祖先節點

  • parent:返回父節點的tag。
  • parents:返回祖先節點。

兄弟節點

兄弟節點是存在同一層級下的,如果不存在就返回none。
next_sibling:下一個

  • previous_sibling:上一個

前後節點

  • next_element:下一個
  • previous_element:上一個

文檔搜索

將BeautifulSoup的基本概念都瞭解了之後就要使用了,最常用的就是find()和find_all()方法。
屬性定位:soup.find_all(‘a’,id=‘name’)
多屬性定位:soup.find_all(‘a’,class=“tod”,id=“name”)
前面提到,find()方法獲取到的結果都是tag對象,這和HTML文檔中的tag相同,可以直接用tag.name和tag.attrs訪問對象的屬性和名字。

find方法

find()方法返回的是單個元素,也就是第一個匹配的元素,而前者返回的是所有匹配的元素組成的列表。
代碼格式爲:

find(self,name , attrs , recursive , text , **kwargs)

直接返回結果,不返回列表。

find all()方法

用於查找所有元素,
相較於正則表達式快很多。只需要給它傳入一些屬性或文本,就可以得到符合條件的元素,功能很強大。
代碼格式爲:

find_all(name , attrs , recursive , text , **kwargs)

返回結果爲列表。

find和find_all的區別

BeautifulSoup中find()方法和find_all()方法的使用方法是一樣的,區別在於;

  • find返回第一個結果,格式爲字符串。find_all()返回的是包含所有結果的列表。
  • find找不到目標時返回none,find_all()找不到目標時返回空列表。

實戰演示-小豬短租

學會了BeautifulSoup後就用BeautifulSoup4庫嘗試爬取小豬短租網站上的信息,代碼如下:

import requests
import re
from bs4 import BeautifulSoup


url = "http://xa.xiaozhu.com/search-duanzufang-p1-0/"  #小豬短租
headers = {"User-Agent":" Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"}
data = requests.get(url,headers)  #請求
re = data.text  
soup = BeautifulSoup(re,'lxml')  #用lxml解析器進行解析

這樣就已經獲取到網頁的信息了,接下來就對網頁上的信息進行提取,先提取網頁上每一個信息的url,使用find_all方法。

url = []
for i in range(len(soup.find_all('div',attrs = {'class':'result_btm_con lodgeunitname'}))):
    url.append(soup.find_all('div',attrs = {'class':'result_btm_con lodgeunitname'})[i].attrs['detailurl'])
url

這樣就可以提取到網頁上的信息。

CSS選擇器

Beautiful Soup還提供了另外一種選擇器,那就是CSS選擇器。使用CSS選擇器時,只需要調用select()方法,傳入相應的字符串參數,就可以通過CSS選擇器來找到相應的tag。
形式爲:

[code]選擇器{樣式}[/code]

在BeautifulSoup中CSS選擇器的使用方法主要爲下面三種:

  • 通過id查找:
soup.selsct("name")
  • 通過class查找:
soup.selsct(".efg")
  • 通過屬性查找:
soup.selsct('a[class="efg"]')

和find_all的實現功能一樣,但更爲方便些。

BeautifulSoup在爬蟲中主要擔任數據清洗的任務,掌握BeautifulSoup能解決大部分網站數據清洗問題。

注:本次抓取數據僅作學習研究之用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章