前言:由於個人負責的運維組,其中有個同事每回在某個專案發版更新後,需手動在k8s容器平臺web介面上覆製出幾百個微服務的名稱以及映象版本等資訊,用來更新微服務清單,個人決定抽時間寫個爬蟲指令碼自動完成手動執行的任務。由於公司資訊需保密,這裡介紹個簡單入門的爬蟲指令碼。
Python爬蟲:通常指的是使用Python語言編寫的網路爬蟲程式。網路爬蟲(Web crawler)是一種自動化的程式,用於在網際網路上瀏覽和檢索資訊。爬蟲可以訪問網站,獲取網頁內容,然後從這些內容中提取有用的資料。以下是Python爬蟲的一些基本概念和組成部分:
-
請求網頁:使用HTTP庫(如
requests
)向目標網站傳送請求,獲取網頁內容。 -
解析內容:解析獲取到的網頁內容,通常使用HTML解析庫(如
BeautifulSoup
或lxml
)來提取所需的資料。 -
資料提取:從解析後的內容中提取有用的資訊,如文字、連結、圖片等。
-
儲存資料:將提取的資料儲存到檔案、資料庫或其他儲存系統中。
-
遵守規則:尊重網站的
robots.txt
檔案,遵守網站的爬蟲政策,避免對網站造成不必要的負擔。 -
使用者代理:模擬瀏覽器行為,設定使用者代理(User-Agent),以避免被網站識別為爬蟲。
-
處理重定向:處理HTTP重定向,確保爬蟲能夠正確地跟蹤到最終的網頁地址。
-
錯誤處理:處理網路請求中可能出現的各種錯誤,如超時、連線錯誤等。
-
多執行緒/非同步:使用多執行緒或非同步IO(如
asyncio
庫)來提高爬蟲的效率。 -
資料清洗:對提取的資料進行清洗和格式化,以便於後續的分析和使用。
-
遵守法律:在進行網路爬蟲操作時,遵守相關法律法規,不侵犯版權和隱私。
Python爬蟲的應用非常廣泛,包括但不限於:
- 資料探勘:從網頁中提取大量資料,用於市場研究、消費者行為分析等。
- 資訊聚合:收集特定主題的資訊,構建資訊聚合平臺。
- 價格監控:監控電商平臺的價格變化,進行價格比較。
- 新聞監控:收集新聞網站的最新新聞,用於新聞摘要或新聞分析。
Python爬蟲的開發需要考慮到效率、準確性和合法性,以確保爬蟲程式能夠穩定、高效地執行,同時不違反法律法規和網站政策。
抓取豆瓣前250高分電影爬蟲指令碼(名稱、評分、評價人數):
import requests
from bs4 import BeautifulSoup
import csv
# 請求頭部
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
# 解析頁面函式
def parse_html(html):
soup = BeautifulSoup(html, 'lxml')
movie_list = soup.find('ol', class_='grid_view').find_all('li')
for movie in movie_list:
title = movie.find('div', class_='hd').find('span', class_='title').get_text()
rating_num = movie.find('div', class_='star').find('span', class_='rating_num').get_text()
comment_num = movie.find('div', class_='star').find_all('span')[-1].get_text()
yield {
'電影名稱': title,
'評分': rating_num,
'評價人數': comment_num
}
# 儲存資料函式
def save_data():
with open('douban_movie_top250.csv', 'w', newline='', encoding='utf-8-sig') as f:
writer = csv.writer(f)
writer.writerow(['電影名稱', '評分', '評價人數'])
for i in range(10):
url = 'https://movie.douban.com/top250?start=' + str(i * 25)
response = requests.get(url, headers=headers)
for item in parse_html(response.text):
f.write(str(item) + '\n')
if __name__ == '__main__':
save_data()
執行:
結果:
以下是Python爬蟲指令碼的逐條講解:
-
匯入必要的庫:
import requests from bs4 import BeautifulSoup import csv
requests
: 用於傳送HTTP請求。BeautifulSoup
: 從bs4
庫中匯入,用於解析HTML文件。csv
: 用於寫入CSV檔案。
-
設定請求頭部:
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36' }
- 這裡定義了一個字典
headers
,包含User-Agent
,用於模擬瀏覽器請求,避免被網站識別為爬蟲。
- 這裡定義了一個字典
-
定義解析頁面的函式:
def parse_html(html): soup = BeautifulSoup(html, 'lxml') movie_list = soup.find('ol', class_='grid_view').find_all('li') for movie in movie_list: title = movie.find('div', class_='hd').find('span', class_='title').get_text() rating_num = movie.find('div', class_='star').find('span', class_='rating_num').get_text() comment_num = movie.find('div', class_='star').find_all('span')[-1].get_text() yield { '電影名稱': title, '評分': rating_num, '評價人數': comment_num }
parse_html
函式接收一個HTML字串作為引數。- 使用
BeautifulSoup
解析HTML,指定lxml
作為解析器。 - 找到所有電影的列表(
ol
標籤,類名為grid_view
),然後遍歷每個電影的HTML元素(li
標籤)。 - 對於每個電影,提取電影名稱、評分和評價人數,使用
get_text()
方法獲取文字內容。 - 使用
yield
返回一個包含電影資訊的字典。
-
定義儲存資料的函式:
def save_data(): with open('douban_movie_top250.csv', 'w', newline='', encoding='utf-8-sig') as f: writer = csv.writer(f) writer.writerow(['電影名稱', '評分', '評價人數']) for i in range(10): url = 'https://movie.douban.com/top250?start=' + str(i * 25) response = requests.get(url, headers=headers) for item in parse_html(response.text): f.write(str(item) + '\n')
save_data
函式用於儲存資料到CSV檔案。- 使用
with open(...)
開啟檔案,確保檔案在操作完成後自動關閉。 - 建立一個
csv.writer
物件用於寫入CSV檔案。 - 寫入列標題。
- 迴圈10次,每次請求豆瓣電影Top 250的不同部分(透過修改URL中的
start
引數)。 - 對於每個請求,呼叫
parse_html
函式解析響應的HTML內容,並遍歷返回的電影資訊。 - 將每個電影的資訊轉換為字串並寫入檔案,每個資訊後面新增換行符。
-
主程式入口:
if __name__ == '__main__': save_data()
- 這是Python程式的主入口點。
- 如果這個指令碼作為主程式執行,呼叫
save_data
函式開始執行。
這個指令碼的目的是爬取豆瓣電影Top 250的資訊,並將其儲存到CSV檔案中。每個電影的資訊包括名稱、評分和評價人數。