python-爬蟲入門

Linux运维技术栈發表於2024-09-22

前言:由於個人負責的運維組,其中有個同事每回在某個專案發版更新後,需手動在k8s容器平臺web介面上覆製出幾百個微服務的名稱以及映象版本等資訊,用來更新微服務清單,個人決定抽時間寫個爬蟲指令碼自動完成手動執行的任務。由於公司資訊需保密,這裡介紹個簡單入門的爬蟲指令碼。

Python爬蟲:通常指的是使用Python語言編寫的網路爬蟲程式。網路爬蟲(Web crawler)是一種自動化的程式,用於在網際網路上瀏覽和檢索資訊。爬蟲可以訪問網站,獲取網頁內容,然後從這些內容中提取有用的資料。以下是Python爬蟲的一些基本概念和組成部分:

  1. 請求網頁:使用HTTP庫(如requests)向目標網站傳送請求,獲取網頁內容。

  2. 解析內容:解析獲取到的網頁內容,通常使用HTML解析庫(如BeautifulSouplxml)來提取所需的資料。

  3. 資料提取:從解析後的內容中提取有用的資訊,如文字、連結、圖片等。

  4. 儲存資料:將提取的資料儲存到檔案、資料庫或其他儲存系統中。

  5. 遵守規則:尊重網站的robots.txt檔案,遵守網站的爬蟲政策,避免對網站造成不必要的負擔。

  6. 使用者代理:模擬瀏覽器行為,設定使用者代理(User-Agent),以避免被網站識別為爬蟲。

  7. 處理重定向:處理HTTP重定向,確保爬蟲能夠正確地跟蹤到最終的網頁地址。

  8. 錯誤處理:處理網路請求中可能出現的各種錯誤,如超時、連線錯誤等。

  9. 多執行緒/非同步:使用多執行緒或非同步IO(如asyncio庫)來提高爬蟲的效率。

  10. 資料清洗:對提取的資料進行清洗和格式化,以便於後續的分析和使用。

  11. 遵守法律:在進行網路爬蟲操作時,遵守相關法律法規,不侵犯版權和隱私。

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爬蟲指令碼的逐條講解:

  1. 匯入必要的庫:

    import requests
    from bs4 import BeautifulSoup
    import csv
    
    • requests: 用於傳送HTTP請求。
    • BeautifulSoup: 從bs4庫中匯入,用於解析HTML文件。
    • csv: 用於寫入CSV檔案。
  2. 設定請求頭部:

    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,用於模擬瀏覽器請求,避免被網站識別為爬蟲。
  3. 定義解析頁面的函式:

    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返回一個包含電影資訊的字典。
  4. 定義儲存資料的函式:

    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內容,並遍歷返回的電影資訊。
    • 將每個電影的資訊轉換為字串並寫入檔案,每個資訊後面新增換行符。
  5. 主程式入口:

    if __name__ == '__main__':
        save_data()
    
    • 這是Python程式的主入口點。
    • 如果這個指令碼作為主程式執行,呼叫save_data函式開始執行。

這個指令碼的目的是爬取豆瓣電影Top 250的資訊,並將其儲存到CSV檔案中。每個電影的資訊包括名稱、評分和評價人數。

相關文章