爬蟲新手入門實戰專案(爬取筆趣閣小說並下載)

Mr.DDG發表於2019-05-09

網路爬蟲是什麼?簡單來說就是一個指令碼,他能幫助我們自動採集我們需要的資源。

  1. 爬蟲步驟

  2. 獲取資料

# 匯入模組
import requests
import re
url = 'https://www.biqudu.com/43_43821/'

模擬頭部資訊

headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36"}

用瀏覽器開啟網頁(我用的是谷歌瀏覽器),按 F12 開啟檢查元素。
在這裡插入圖片描述
將 User-Agent 複製下來。

模擬瀏覽器傳送 http 請求

response = requests.get(url, headers=headers, verify=False)

因為這裡是 https 請求,如果不加 verify=False 會報錯。

編碼方式(不新增編碼,看到的網頁會有亂碼)

response.encoding = 'utf-8'

目標網頁原始碼

html = response.text
  1. 分析資料載入流程(使用正規表示式)
def multiple_replace(text, adict):

    rx = re.compile('|'.join(map(re.escape, adict)))

    def one_xlat(match):
        return adict[match.group(0)]
    return rx.sub(one_xlat, text)

提取小說名字

# 因為列表中只有一個元素,所以是 [0]
title = re.findall(r'<meta property="og:title" content="(.*?)"/>', html)[0]
# print(title)

在這裡插入圖片描述
如圖,一般情況下小說標題都在 head 的 meter 裡面。

獲取每一章節的資訊

dl = re.findall(r'<dt>《聖墟》正文</dt>.*?</dl>', html, re.S)[0]  # re.S 匹配不可見字元
chapter_info_list = re.findall(r'href="(.*?)">(.*?)<', dl)

在這裡插入圖片描述
要以唯一欄位開頭結尾

<dt>《聖墟》正文</dt>.*?</dl>

這是唯一欄位ka,如果不是唯一欄位,會導致匹配不準確。

  1. 下載資料
    迴圈每一個章節並下載
for chapter_info in chapter_info_list:

    # chapter_title = chapter_info[0]
    # chapter_url = chapter_info[1]

    chapter_url, chapter_title = chapter_info

    # 不用加號拼接,會增加新的字串物件,增加記憶體
    chapter_url = "https://www.biqudu.com%s" % chapter_url
    # 下載章節內容
    chapter_response = requests.get(chapter_url, headers=headers, verify=False)
    chapter_response.encoding = 'utf-8'
    chapter_html = chapter_response.text  # 網頁原始碼
    # 提取章節內容
    chapter_content = re.findall(r'<script>readx\(\);</script>(.*?)<script>chaptererror\(\);</script>',
                                 chapter_html, re.S)[0]
  1. 清洗資料
adict = {'<br/>': '', '\t': '', '  ': '\n', ';&lt;="="/js/"&gt;&lt;/&gt;': ''}
chapter_content = multiple_replace(chapter_content, adict)

5.儲存資料

   with open('%s.txt' % title, 'a', encoding='utf-8') as f:
        f.write(chapter_title)
        f.write(chapter_content)
        f.write('\n')
        print(chapter_url)

相關文章