Python-爬取小說文字內容(使用beautiful soup實現)


Python-爬取小說文字內容(beautiful soup)

本次爬取的網站為[http://www.136book.com/][6],你可以在頁面選擇你想要爬取的小說。
文中代碼使用Anaconda的Jupyter書寫。

Beautiful Soup簡介

官方解釋:
Beautiful Soup提供一些簡單的、python式的函數用來處理導航、搜索、修改分析樹等功能。它是一個工具箱,通過解析文檔為用戶提供需要抓取的數據,因為簡單,所以不需要多少代碼就可以寫出一個完整的應用程序。
Beautiful Soup自動將輸入文檔轉換為Unicode編碼,輸出文檔轉換為utf-8編碼。你不需要考慮編碼方式,除非文檔沒有指定一個編碼方式,這時,Beautiful Soup就不能自動識別編碼方式了。然后,你僅僅需要說明一下原始編碼方式就可以了。
Beautiful Soup已成為和lxml、html6lib一樣出色的python解釋器,為用戶靈活地提供不同的解析策略或強勁的速度。 —— [ beautiful soup ]

此次實戰從網上爬取小說,需要使用到Beautiful Soup。
Beautiful Soup為python的第三方庫,可以幫助我們從網頁抓取數據。
它主要有如下特點:

1.Beautiful Soup可以從一個HTML或者XML提取數據,它包含了簡單的處理、遍歷、搜索文檔樹、修改網頁元素等功能。可以通過很簡短地代碼完成我們地爬蟲程序。
2.Beautiful Soup幾乎不用考慮編碼問題。一般情況下,它可以將輸入文檔轉換為unicode編碼,並且以utf-8編碼方式輸出。

對於本次爬蟲任務,只要了解以下幾點基礎內容就可以完成:
1.Beautiful Soup的對象種類:
Tag
Navigablestring
BeautifulSoup
Comment
2.遍歷文檔樹:find、find_all、find_next和children
3.一點點HTML和CSS知識(沒有也將就,現學就可以)

Beautiful Soup安裝

在Anaconda Prompt中輸入:

pip install beautifulsoup4

安裝beautiful soup。

使用python代碼爬取

1.爬取思路分析

打開目錄頁,可以看到章節目錄,想要爬取小說的內容,就要找到每個目錄對應的url,並且爬取其中的正文內容,然后將正文內容取出來,放在本地文件中。這里選取《羋月傳》作為示例。http://www.136book.com/mieyuechuanheji/

按F12查看網頁的審查元素菜單,選擇左上角[箭頭]的標志,在目錄中選擇想要爬取的章節標題,如圖:選擇了【第六章 少司命(3)】,可以看到網頁的源代碼中,加深顯示了本章的鏈接。

目錄頁章節的網頁結構

這樣我們可以看到,每一章的鏈接地址都是有規則地存放在<li>中。而這些<li>又放在<div id=”book_detail” class=”box1″>中。

2.單章節爬蟲

剛才已經分析過網頁結構。我們可以直接在瀏覽器中打開對應章節的鏈接地址,然后將文本內容提取出來。我們要爬取的內容全都包含在這個<div>里面。

單章節爬蟲內容的網頁結構

# 爬取單章節的文字內容
from urllib import request
from bs4 import BeautifulSoup

if __name__ == '__main__':
    # 第6章的網址
    url = 'http://www.136book.com/mieyuechuanheji/ewqlwb/'
    head = {}
    # 使用代理
    head['User-Agent'] = 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19'
    req = request.Request(url, headers = head)
    response = request.urlopen(req)
    html = response.read()
    # 創建request對象
    soup = BeautifulSoup(html, 'lxml')
    # 找出div中的內容
    soup_text = soup.find('div', id = 'content')
    # 輸出其中的文本
    print(soup_text.text)

輸出的結果為:
爬取第六章的結果

3.小說全集爬蟲

思路是先在目錄頁中爬取所有章節的鏈接地址,然后再爬取每個鏈接對應的網頁中的文本內容。說來,就是比單章節爬蟲多一次解析過程,需要用到Beautiful Soup遍歷文檔樹的內容。

1).解析目錄頁面

在思路分析中,我們已經了解了目錄頁的結構。所有的內容都放在一個所有的內容都放在一個<div id=”book_detail” class=”box1″>中。

代碼整理如下:

# 爬取目錄頁面-章節對應的網址
from urllib import request
from bs4 import BeautifulSoup

if __name__ == '__main__':
    # 目錄頁
    url = 'http://www.136book.com/mieyuechuanheji/'
    head = {}
    head['User-Agent'] = 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19'
    req = request.Request(url, headers = head)
    response = request.urlopen(req)
    html = response.read()
    # 解析目錄頁
    soup = BeautifulSoup(html, 'lxml')
    # find_next找到第二個<div>
    soup_texts = soup.find('div', id = 'book_detail', class_= 'box1').find_next('div')
    # 遍歷ol的子節點,打印出章節標題和對應的鏈接地址
    for link in soup_texts.ol.children:
        if link != '\n':
            print(link.text + ': ', link.a.get('href'))

輸出結果為:
爬取章節目錄的結果

2).爬取全集內容

將每個解析出來的鏈接循環代入到url中解析出來,並將其中的文本爬取出來,並且寫到本地E:/miyuezhuan.txt中。(存放位置可以根據自己的本地情況自定義)

代碼整理如下:

# 爬取全集內容
from urllib import request
from bs4 import BeautifulSoup

if __name__ == '__main__':
    url = 'http://www.136book.com/mieyuechuanheji/'
    head = {}
    head['User-Agent'] = 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19'
    req = request.Request(url, headers = head)
    response = request.urlopen(req)
    html = response.read()
    soup = BeautifulSoup(html, 'lxml')
    soup_texts = soup.find('div', id = 'book_detail', class_= 'box1').find_next('div')
    # 打開文件
    f = open('E:/miyuezhuan.txt','w')
    # 循環解析鏈接地址
    for link in soup_texts.ol.children:
        if link != '\n':
            download_url = link.a.get('href')
            download_req = request.Request(download_url, headers = head)
            download_response = request.urlopen(download_req)
            download_html = download_response.read()
            download_soup = BeautifulSoup(download_html, 'lxml')
            download_soup_texts = download_soup.find('div', id = 'content')
            # 抓取其中文本
            download_soup_texts = download_soup_texts.text
            # 寫入章節標題
            f.write(link.text + '\n\n')
            # 寫入章節內容
            f.write(download_soup_texts)
            f.write('\n\n')
    f.close()

可以打開存放位置的文件:E:/miyuezhuan.txt 查看爬取結果。

代碼還有很多改進的地方。例如文本中包含廣告的js代碼可以去除,還可以加上爬蟲進度顯示等等。實現這些功能需要包含正則表達式和os模塊知識,就不多說了,大家可以繼續完善。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com