前面幾節講到網絡爬蟲,但是在分析數據時效率不高。
鑑於網頁中HTML的樹形結構,我們可以引入一個新的庫--BeautifulSoup4用於解析HTML或XML。
如何安裝第三方庫:BeautifulSoup4?(我會新增一篇文章講如何安裝第三方庫,此節不多說。)
1、默認是安裝在Anaconda中
2、如果沒有安裝可以在命令窗口cmd中執行以下命令:
pip install beautifulsoup4
import bs4
使用BeautifulSoup庫的步驟:
1、創建BeautifulSoup對象
2、查詢節點
find,找到第一個滿足條件的節點
find_all 找到所有滿足條件的節點
可按節點類型、屬性或內容訪問
例如:有這樣一段HTML:<a href='abcd' class='efgh'>a_value</a>
按照類型查找節點:
bs.find_all('a')
按照屬性查找節點:
bs.find_all('a', href='abcd')
bs.find_all('a', class_='efgh')
注意:是class_ (因爲:class是關鍵字)
或者:bs.find_all('a', {'class': 'efgh')
按照內容查找節點:
bs.find_all('a', href='abcd', string='a_value')
可以查看網頁的HTML代碼(選中部分就是需要抓取的內容),右鍵鼠標--查看網頁源代碼:
那麼就開始獲取一個城市所有的AQI指標值:
"""
作者:lanxingbudui
日期:2020-02-25
功能:AQI計算
版本:6.0
"""
import requests
from bs4 import BeautifulSoup
def get_city_aqi(city_pinyin):
"""
獲取一個城市的所有AQI指標
"""
url = 'http://pm25.in/' + city_pinyin
r = requests.get(url, timeout=30) #鏈接網頁請求
print(r.status_code) #打印返回結果,200成功 400失敗
soup = BeautifulSoup(r.text, 'lxml') #創建BeautifulSoup對象
div_list = soup.find_all('div', {'class': 'span1'}) #查找所有spen1屬性的節點
# 或者 = soup.find_all('div', class_ = 'spanl') # 不推薦這樣寫,因爲class是關鍵字,有時容易忘記下劃線。
city_aqi = []
for i in range(8):
div_content = div_list[i]
caption = div_content.find('div', {'class': 'caption'}).text.strip()
value = div_content.find('div', {'class': 'value'}).text.strip()
# .text是獲取屬性值,並且.strip()移除上步驟中 text 字符串頭尾的空格或換行符
city_aqi.append((caption, value))
return city_aqi
def main():
"""
主函數
"""
city_pinyin = input('請輸入城市拼音:')
city_aqi = get_city_aqi(city_pinyin)
print(city_aqi)
if __name__ == '__main__':
main()