首頁 >後端開發 >Python教學 >Python中的爬蟲實戰:豆瓣圖書爬蟲

Python中的爬蟲實戰:豆瓣圖書爬蟲

WBOY
WBOY原創
2023-06-11 13:33:072224瀏覽

Python是當今最熱門的程式語言之一,在不同的領域都得到了廣泛的應用,如資料科學、人工智慧、網路安全等。其中,Python在網路爬蟲領域表現出色,許多企業和個人利用Python進行資料收集和分析。本篇文章將介紹如何使用Python爬取豆瓣圖書信息,幫助讀者初步了解Python網絡爬蟲的實現方法和技術。

首先,對於豆瓣圖書資訊爬蟲,我們需要用到Python中的兩個重要的庫:urllib和beautifulsoup4。其中,urllib庫主要用於網路請求和資料讀取,而beautifulsoup4庫則可用於解析HTML和XML等結構化文檔,從而提取所需的資訊。在使用這些庫之前,我們需要先安裝它們,使用pip命令即可完成安裝。安裝完成後,就可以開始我們的實戰了。

  1. 確定爬取目標

在使用Python進行爬蟲時,首先需要先明確爬取目標。對於本篇文章而言,我們的目標是爬取豆瓣圖書的基本訊息,如書名、作者、出版社、出版日期、評分等。此外,我們還需要爬取多頁圖書資訊。

  1. 分析HTML結構

確定了爬取目標之後,我們需要進一步分析豆瓣圖書的HTML結構,以便確定所需資訊的位置和特徵。我們可以使用Chrome或Firefox等瀏覽器自帶的開發者工具來查看頁面原始碼。透過觀察HTML結構,我們可以找到需要爬取的標籤和屬性,進而編寫Python程式碼進行實作。

  1. 寫程式

接下來,我們在Python中寫豆瓣圖書爬蟲程式碼。程式碼的核心是:

  • 傳送網路請求並取得HTML頁面;
  • 解析HTML文檔,擷取所需資訊;
  • ##儲存資料。
以下是完整程式碼:

import urllib.request
from bs4 import BeautifulSoup

url = 'https://book.douban.com/top250'
books = []

def get_html(url):
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36'}
    req = urllib.request.Request(url, headers=headers)
    response = urllib.request.urlopen(req)
    html = response.read().decode('utf-8')
    return html

def parse_html(html):
    soup = BeautifulSoup(html,'html.parser')
    book_list_soup = soup.find('div', attrs={'class': 'article'})
    for book_soup in book_list_soup.find_all('table'):
        book_title_soup = book_soup.find('div', attrs={'class': 'pl2'})
        book_title_link = book_title_soup.find('a')
        book_title = book_title_link.get('title')
        book_url = book_title_link.get('href')
        book_info_soup = book_soup.find('p', attrs={'class': 'pl'})
        book_info = book_info_soup.string.strip()
        book_rating_num_soup = book_soup.find('span', attrs={'class': 'rating_nums'})
        book_rating_num = book_rating_num_soup.string.strip()
        book_rating_people_num_span_soup = book_soup.find('span', attrs={'class': 'pl'})
        book_rating_people_num = book_rating_people_num_span_soup.string.strip()[1:-4]
        book_author_and_publish_soup = book_soup.find('p',attrs={'class':'pl'}).next_sibling.string.strip()
        book_author_and_publish = book_author_and_publish_soup.split('/')
        book_author = book_author_and_publish[0]
        book_publish = book_author_and_publish[-3]
        book_year = book_author_and_publish[-2]
        books.append({
        'title': book_title,
        'url': book_url,
        'info': book_info,
        'author':book_author,
        'publish':book_publish,
        'year':book_year,
        'rating_num':book_rating_num,
        'rating_people_num':book_rating_people_num
        })

def save_data():
    with open('douban_top250.txt','w',encoding='utf-8') as f:
        for book in books:
            f.write('书名:{0}
'.format(book['title']))
            f.write('链接:{0}
'.format(book['url']))
            f.write('信息:{0}
'.format(book['info']))
            f.write('作者:{0}
'.format(book['author']))
            f.write('出版社:{0}
'.format(book['publish']))
            f.write('出版年份:{0}
'.format(book['year']))
            f.write('评分:{0}
'.format(book['rating_num']))
            f.write('评分人数:{0}

'.format(book['rating_people_num']))

if __name__ == '__main__':
    for i in range(10):
        start = i*25
        url = 'https://book.douban.com/top250?start={0}'.format(start)
        html = get_html(url)
        parse_html(html)
    save_data()

程式碼解析:

#首先,我們定義一個主網址url和一個空列表books(用於儲存圖書資訊) 。接著,我們編寫get_html函數,用於發送請求並取得HTML頁面。在該函數中,我們設定了請求頭headers,以模擬瀏覽器發送請求,從而避免被網站封鎖。我們使用urllib庫的Request方法,將請求頭和網址封裝到一個物件中,然後使用urllib庫的urlopen方法,發送網路請求並取得頁面,最後使用read和decode方法,將頁面內容轉換成utf-8格式的字串。

我們寫parse_html函數,用來解析HTML文檔,提取所需資訊。在這個函數中,我們使用beautifulsoup4函式庫的find和find_all方法,找出HTML頁面中符合要求的標籤和屬性。具體地,我們透過觀察豆瓣圖書的HTML結構,找到了每本圖書所在的table標籤和對應的書名、連結、資訊和評分等信息,並編寫了提取這些數據的程式碼。其中,我們使用了strip和split方法,對字串進行處理,以去除多餘空白字元和分割字串。

最後,我們編寫了save_data函數,用於將提取的圖書資訊儲存到本地文件中。在該函數中,我們使用Python內建函數open,開啟一個文字文件,以寫入模式寫入檔案內容,並使用format方法,將每本圖書的相關資訊格式化為字串,寫入檔案。注意,我們需要在檔案名稱後面加上編碼方式encoding='utf-8',以確保檔案內容不會出現亂碼。

在主程式中,我們使用for循環,爬取豆瓣圖書的前250本圖書。為此,我們需要每頁爬取25本圖書,共爬取10頁。在每個循環中,我們根據目前頁碼計算所需的url,並呼叫get_html函數,取得HTML頁面。接著,我們將頁面傳遞給parse_html函數,解析頁面並提取所需資訊。最後,我們呼叫save_data函數,將所有圖書資訊保存到本地文件中。

    執行程式碼
在完成程式碼撰寫後,我們可以在命令列(Windows系統)或終端機(MacOS或Linux系統)中進入程式碼所在目錄,並執行指令python3 爬蟲腳本名稱.py,即可執行該Python網路爬蟲。在程式運行期間,我們可以觀察程式的輸出訊息,以判斷程式是否正確執行。程式執行完畢後,我們可以檢查本機檔案douban_top250.txt,確認是否已成功儲存資料。

總結

透過本篇文章的介紹,我們初步了解了Python網路爬蟲的實作方法和技術。具體而言,我們使用Python中的urllib和beautifulsoup4庫,針對豆瓣圖書網站的HTML結構,編寫了爬取豆瓣圖書資訊的Python程序,成功實現了資料收集和儲存。此外,在實際應用中,我們需要了解一些網路爬蟲的注意事項,如不要過度頻繁地向同一網站發送請求,以避免被封IP位址。

以上是Python中的爬蟲實戰:豆瓣圖書爬蟲的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn