我用Python來爬取了小說《花千骨》……

2021-02-11 算法與數學之美

知識就像碎布,記得「縫一縫」,你才能華麗麗地亮相。

1.Beautiful Soup

1.Beautifulsoup 簡介

此次實戰從網上爬取小說,需要使用到Beautiful Soup。

Beautiful Soup為python的第三方庫,可以幫助我們從網頁抓取數據。

它主要有如下特點:

2.Beautiful Soup安裝

win命令行下:

pip install beautifusoup4

3.Beautiful Soup基礎

大家可以參考文檔來學習(中文版的哦):http://beautifulsoup.readthedocs.io/zh_CN/latest/#id8

對於本次爬蟲任務,只要了解以下幾點基礎內容就可以完成:

1.Beautiful Soup的對象種類:

Tag

Navigablestring

BeautifulSoup

Comment

2.遍歷文檔樹:find、find_all、find_next和children

3.一點點HTML和CSS知識(沒有也將就,現學就可以)

2.爬取小說花千骨

1.爬蟲思路分析

本次爬取小說的網站為136書屋。

先打開花千骨小說的目錄頁,是這樣的。

我們的目的是找到每個目錄對應的url,並且爬取其中地正文內容,然後放在本地文件中。

2.網頁結構分析

首先,目錄頁左上角有幾個可以提高你此次爬蟲成功後成就感的字眼:暫不提供花千骨txt全集下載。

繼續往下看,發現是最新章節板塊,然後便是全書的所有目錄。我們分析的對象便是全書所有目錄。點開其中一個目錄,我們便可以都看到正文內容。

按F12打開審查元素菜單。可以看到網頁前端的內容都包含在這裡。

我們的目的是要找到所有目錄的對應連結地址,爬取每個地址中的文本內容。

有耐心的朋友可以在裡面找到對應的章節目錄內容。有一個簡便方法是點擊審查元素中左上角箭頭標誌的按鈕,然後選中相應元素,對應的位置就會加深顯示。

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

我不停地強調「我們的目的」是要告訴大家,思路很重要。爬蟲不是約pao,蒙頭就上不可取。

3.單章節爬蟲

剛才已經分析過網頁結構。我們可以直接在瀏覽器中打開對應章節的連結地址,然後將文本內容提取出來。

我們要爬取的內容全都包含在這個<div>裡面。

代碼整理如下:

from urllib import request

from bs4 import BeautifulSoup

 

if __name__ == '__main__':

    # 第8章的網址

    url = 'http://www.136book.com/huaqiangu/ebxeew/'

    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)

運行結果如下:

這樣,單章節內容爬取就大功告成了。

4.小說全集爬蟲

單章節爬蟲我們可以直接打開對應的章節地址解析其中的文本,全集爬蟲我們不可能讓爬蟲程序在每章節網頁內中跑一遍,如此還不如複製、粘貼來的快。

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

1.解析目錄頁

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

這兒有兩個一模一樣的<div id=」book_detail」 class=」box1″>。

第一個<div>包含著最近更新的章節,第二個<div>包含著全集內容。

請注意,我們要爬取的是第二個<div>中的內容。

代碼整理如下:

from urllib import request

from bs4 import BeautifulSoup

 

if __name__ == '__main__':

    # 目錄頁

    url = 'http://www.136book.com/huaqiangu/'

    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中解析出來,並將其中的文本爬取出來,並且寫到本地F:/huaqiangu.txt中。

代碼整理如下:

from urllib import request

from bs4 import BeautifulSoup

 

if __name__ == '__main__':

    url = 'http://www.136book.com/huaqiangu/'

    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('F:/huaqiangu.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()

執行結果顯示 [Finished in 32.3s] 。

打開F盤查看花千骨文件。

爬蟲成功。備好紙巾,快快去感受尊上和小骨的虐戀吧。

5.總結

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

來源:segmentfault.com/a/1190000010895903

--------

明明共同關注公眾號,彼此卻互不認識;

明明具有相同的愛好,卻無緣相識;

有沒有覺得這就是上帝給我們的一個bug!

想不想認識更多寫程序的小夥伴?

C++,Java,VB……應有盡有。

還等什麼?趕快上車加入我們吧!

(・ิϖ・ิ)っ算法與數學之美-計算機粉絲群

我們在這裡等你喲

算法數學之美微信公眾號歡迎賜稿

稿件涉及數學、物理、算法、計算機、編程等相關領域。

稿件一經採用,我們將奉上稿酬。

投稿郵箱:math_alg@163.com

相關焦點

  • Python爬蟲層層遞進,從爬取一章小說到爬取全站小說!
    很多好看的小說只能看不能下載,教你怎麼爬取一個網站的所有小說知識點:
  • 如何用 Python 爬取網頁製作電子書
    本文來自作者在 GitChat 上分享「如何用 Python 爬取網頁製作電子書」主題內容。有人爬取數據分析黃金周旅遊景點,有人爬取數據分析相親,有人大數據分析雙十一,連小學生寫論文都用上了大數據。我們每個人每天都在往網上通過微信、微博、淘寶等上傳我們的個人信息,現在就連我們的錢都是放在網上,以後到強人工智慧,我們連決策都要依靠網絡。
  • python爬取數據存入資料庫
    昨天本來寫了一篇關於python爬取的文章,結果沒通過,正好今天一起吧。用python同時實現爬取,和存入資料庫,算是複習一下前面操作資料庫的知識。1、準備工作既然是爬取,那自然要連接到爬取的頁面,所以需要requests庫。
  • 爬取《The Hitchhiker's Guide to Python!》python進階書並製成pdf
    前幾篇文章我們學習了requests庫和正則,還有個urllib庫,我上篇文章也用了requests庫來教大家去爬那些返回json格式的網頁,挺好玩的
  • 如何用Python爬取一部鬥羅大陸小說
    前兩天我上三年級的大侄子問我:叔叔,鬥羅大陸裡小舞死後怎麼樣了?我輕描淡寫地回答:後來唐三把魂環給小舞,讓小舞復活了。
  • 用Python進行Web爬取數據
    希望獲得更多數據來訓練我們的機器學習模型是一個一直困擾人們的問題。我們無法在數據科學項目中獲得可以直接使用的Excel或.csv文件,對嗎?那麼,如何應對數據匱乏的問題呢?實現此目的最有效,最簡單的方法之一就是通過網頁抓取。我個人發現網絡抓取是一種非常有用的技術,可以從多個網站收集數據。
  • 用python分析上海二手房數據,用幾十行代碼爬取大規模數據!
    spider_1('http://esf.xian.fang.com/')4、循環翻頁爬取二手房信息考慮到每頁只顯示30條,總共100頁,寫一個循環調用的語句,把100頁的內容全部爬下來# 循環,把第2-100頁全部爬下來page = 1while page 由於房天下的二手房信息是實時更新的,其默認排序是按照發布時間,因此在爬取過程中
  • 對新筆趣閣小說進行爬取,保存和下載!這就是Python的魅力
    以前挺愛在筆趣閣看小說的(老白嫖怪了)現在學了一點爬蟲技術,就自然而然的想到了爬取筆趣閣的小說也算鍛鍊一下自己的技術,就以新筆趣閣開始
  • 用人話教你入門Python[簡單爬取網頁內容]
    但是我發現網頁太多,收集起來好累……於是我做了一隻叫「網絡爬蟲」的蜘蛛,把它丟在網際網路上,告訴它,見到新的網站你就吃進肚子裡,重複的網站就不要吃了,吃完一個網站就再吃跟這個網站有連結的新網站……直到你把網際網路所有不重複的網站吃掉就跑回來吐給我哦我們這裡不需要像Goodle公司那樣爬取很多網頁,先學爬一個網頁裡的部分內容就好了
  • 如何用 Python 爬取天氣預報
    /software/BeautifulSoup/bs4/doc/沒有Python基礎的新人,我建議可以學習以下資料:1、官方最新的英文文檔(https://docs.python.org/3/)2、python 3.60版本中文文檔(http://www.pythondoc.com/pythontutorial3/index.html)3、廖雪峰Python
  • Python爬取B站彈幕並製作詞雲圖
    我這是顯示已經安裝過了的,如果你沒有安裝的話,是會有安裝進度條的。 在開發者工具當中,選擇你所需要爬取的url地址,查看headers其中的requests headers 中的cookie就是了。
  • python爬蟲16 | 你,快去試試用多進程的方式重新去爬取豆瓣上的電影
    GIL 鎖會讓多線程顯得有點雞肋特別是在 CPU 密集型的代碼下多線程被 GIL 鎖搞得效率不高特別是對於多核的 CPU 來說如果想要充分利用 CPU 還是用多進程吧這樣我們就可以做到並行爬取提高了爬取的效率那麼,怎麼玩多進程呢恩接下來就是
  • Python - python爬取新聞專題及常見問題 - CSDN
    最近,在數據挖掘課,要交課設了,打算做一個通過機器學習進行新聞分類,首先要有大量的文本(新聞),去做訓練,並通過爬蟲爬取大量的新聞一,思路如下:0.首先確定獲取數據的網站1.通過BeautifulSoup來切取連結2.
  • python+Chrome爬取動態異步生成的頁面內容
    百度一下「python漢字轉拼音+聲調」,找到一篇「Python: 漢字轉拼音(帶聲調)」的文章。哈哈,按照功能實現需求了。咳咳,有些跑題。為了貼近標題,提供解決之道二。解決之道二百度一下某個漢字,比如「我」,打開百度漢字,如圖:發現會有很多資源,拼音、部首、筆畫、五行、基本釋義等等。
  • python爬取+BI分析5000條內衣數據,發現妹子最愛這款文胸
    生活中我們經常會用python進行數據爬取,但是爬取簡單分析難,很多人喜歡用echarts圖表接口或者是python的第三方庫進行數據可視化,甚至是用matlab,基本上都需要用代碼實現,在數據展示上十分繁瑣,效率不高。
  • Excel與Python爬取數據,兩者PK,誰優誰劣?
    程序運行數秒(需要一定時間),網頁數據就被抓取到Excel中來。不理想的是,這個方法Excel將網頁上的所有文字都抓取了下來,包括無關緊要的數據,如下圖上部文字,需要手動刪除。接著網頁中的表格就被被加載到Power Query中,雙擊table 0,點擊「關閉並上載」,完整的數據表即被加載到Excel表格中來。
  • stata調用python爬取時間數據——借他山之石以攻玉
    該功能使得,我們可以先利用python爬取數據,然後再利用用戶所熟悉的stata去處理數據,因為stata在處理數據方面具有一定的優勢。那麼今天我們就來看看,怎樣利用stata調用python爬取數據,再用stata進行處理?今天試爬的數據是巨潮網上的預約年報的披露時間數據。
  • 技術分享|利用Python和BeautifulSoup進行網頁爬取(新手教程)
    數據觀世界在大數據、人工智慧時代,我們通常需要從網站中收集我們所需的數據,網絡信息的爬取技術已經成為多個行業所需的技能之一。而Python則是目前數據科學項目中最常用的程式語言之一。使用Python與BeautifulSoup可以很容易的進行網頁爬取,通過網站爬蟲獲取信息可以幫助企業或個人節省很多的時間和金錢。學習本文之後,我相信大部分新手都能根據自己的需求來開發出相應的網頁爬蟲。
  • Python的scrapy之爬取6毛小說網的聖墟!
    閒來無事想看個小說,打算下載到電腦上看,找了半天,沒找到可以下載的網站,於是就想自己爬取一下小說內容並保存到本地聖墟 第一章 沙漠中的彼岸花
  • python爬蟲實戰:爬取天氣數據的實例詳解
    在本篇文章裡小編給大家整理的是一篇關於python爬取天氣數據的實例詳解內容,有興趣的朋友們學習下。