天天看點

簡易爬蟲-利用Python爬蟲爬取聖墟小說到本地

大家好,今天給大家帶來Python爬蟲的簡易制作,很适合新手練手。

爬蟲即是利用程式模仿真實使用者浏覽網頁并記錄目标内容,進而可避過網站的廣告,以擷取較好的閱讀體驗。

本次以辰東大神的新書《聖墟》為例,向大家展示一下爬蟲。歡迎大家批評指正。

需要用到的工具:

python3.x

pycharm

思路:

1.擷取頁面源代碼

2.擷取章節連結

3.擷取章節網頁源代碼

4.擷取正文

5.下載下傳至本地

具體步驟及代碼如下:

一.擷取頁面源代碼:

1.搜尋聖墟,進入筆趣閣網站,擷取網站位址:https://www.biqiuge.com/book/4772/,按F12進入網頁源碼界面。

2.打開pycharm,建立Python檔案,導入requests等庫,并利用requests庫中的get函數擷取頁面源碼,具體代碼如下:

import urllib.request
import re
import requests

def download_novel():
  url = 'https://www.biqiuge.com/book/4772/'
  html = requests.get(url)#擷取頁面源碼
  html_content = html.content#以二進制編碼讀出頁面源碼
  html_content = html_content.decode('gbk')#指定編碼(可在網頁源碼中搜尋charset擷取網頁編碼)
           

二.擷取章節連結

1.現在已經擷取網頁的全部内容了,下一步就是篩選出我們想要的資訊,即各個章節連結。

簡易爬蟲-利用Python爬蟲爬取聖墟小說到本地

可以看出各個章節前後的H5标簽是相同的,由此可以利用正規表達式對其進行處理。大家可以看下廖雪峰老師對正規表達式的講解,很透徹、詳細。在此不作過多解釋。正規表達式

實作代碼如下:

reg = r'<dd><a href ="/book/4772/(.*?)">(.*?)</a></dd>'#篩選章節連結
urls = re.findall(reg,html_content)#清單:章節連結
           

這時需要注意:《聖墟》現在還是連載狀态,是以在章節前有六章新更新的章節,這些章節我們也讀取了,是以要對其進行處理。當時第一思路是想利用正規表達式不讀取前面那幾章,但由于網頁的設計等原因,不是太易于實作。然後猛然想到,章節連結是讀取到清單中的,何不直接删除那幾個元素呢?而且代碼實作也超級簡單。于是我采取了這種方式,成功地剔除了重複的章節。

三.擷取章節網頁源代碼

具體操作跟上一步類似。

四.擷取正文

爬出正文網頁後,同樣利用正規表達式篩選出正文。(需要注意筆趣閣這個網站,網站編碼不太規範,在正文最後到标簽的最後幾個空格,數量是不一樣的,因為我們采用的是精确比對,是以爬取一章後,後面就出現錯誤了,這個浪費了我很長時間。最後我把空格也利用正則中(.*?)的特性,把空格也讀取了下來)具體代碼如下:

for url in urls:
  novel_url: Union[str, Any]='https://www.biqiuge.com' + url[0]#正文位址
  novel_title=url[1]#章節名稱
  chapt = requests.get(novel_url)#位址所有内容
  tempt = chapt.content
  chapt_html = tempt.decode('gbk')#指定編碼
  reg=r'class="showtxt">(.*?)https:'#讀取正文
  chapt_content = re.findall(reg,chapt_html)#正規表達式篩選後
           

然後需要對讀取的資料進行清洗,去掉H5的标簽。

五.下載下傳至本地

最後一步就是下載下傳正文至本地的txt檔案中了。代碼如下:

print('正在下載下傳 %s'%novel_title)#在螢幕顯示下載下傳的章節
f = open('聖墟.txt','a')#建立或打開檔案以讀寫
f.write(novel_title+chapt_content)#寫入
f.close()#關閉檔案
           

注意:以上代碼隻是Python爬蟲的一個簡單思路,還不能用于實戰,隻能下載下傳前幾章,然後IP就會被網站封禁。因為網站的風控技術可以檢測到是非真實使用者通路的。

下一篇給大家帶來如何騙過網站的風控技術,模仿真實使用者通路網站。後附源碼,歡迎大家批評指正。

爬蟲源碼