今天以其中一本小說為例,講一下下載小說的主體部分,了解正常的爬取步驟,用到的是request和xpath。
爬取數據三步走:訪問url --》爬取數據 --》保存數據
一、訪問千千小說網址: https://www.qqxsnew.com/
二、隨便選一部小說,打開章節目錄界面(比方說魔道祖師):https://www.qqxsnew.com/18/18991/
三、開始編寫代碼。
a. 利用request訪問網頁,是get請求還是post請求要看網頁上面寫的是啥
右擊檢查,選擇network,隨便找個頁面,看下request Method方法是什么。
url = "https://www.qqxsnew.com/18/18991/" html = requests.get(url, headers=headers).text
b. 得到網頁的html頁面(html頁面 == 在網頁鼠標右擊“查看網頁源代碼”),獲取章節名字和章節鏈接。
章節名字和章節鏈接獲取需要用到XPath --》在網頁鼠標右擊檢查 --》定位到任意章節(如第一章)--》copy --》copy XPath --》 //*[@id="list"]/dl/dd[13]/a
如果安裝過XPath插件的話,可以將上面復制的XPath在插件里面查詢,可以看到只查詢到了一個
我們的目的是獲取到所有章節的名字和鏈接,分析上面XPath的字串,發現dd[13]這個地方是定位,每個dd都是一個章節,所以我們模糊定位看看
咦,可以看出來dd里面的內容都出來了,但是前面12章的內容不是我們需要的,我們要的是從第一章開始,所以需要把它們過濾掉,position是一個定位的函數,大於12是說從第13位開始,也就是第一章
這數據正好是我們想要提取的文字,所以我們已經得到了文字提取的XPath字串://*[@id="list"]/dl/dd[position()>12]/a
文字和鏈接都在a標簽里面,鏈接在href屬性里面,所以鏈接的XPath字串://*[@id="list"]/dl/dd[position()>12]/a/@href
好了,前面是在分析XPath字串是怎么得到的,如果自己對XPath語法熟的話,也可以自己寫提取字串,然后用插件去驗證,或者直接用代碼驗證都是可以的。現在我們把它放到代碼中去
# 獲取a標簽對象 chapter_titles_obj = datas.xpath('//*[@id="list"]/dl/dd[position()>12]/a') for chapter_title_obj in chapter_titles_obj: # 獲取a標簽文本 chapter_title_text = chapter_title_obj.xpath('./text()')[0] # 獲取a標簽的鏈接 chapter_url = chapter_title_obj.xpath('./@href')[0]
打印出來看看結果
c. 每個章節的鏈接都拿到了,接下來就是請求了,這個不多說,和上面請求的方法一樣,XPath獲取方法也相同。
d. 存儲獲取到的數據
for content_chapter_text in content_chapter: print(content_chapter_text) with open("魔道祖師/" + chapter_title_text + ".txt", 'a', encoding='utf-8') as f: f.write(content_chapter_text)
這樣,一篇小說從訪問到下載的過程就結束了。
完整代碼

#!/usr/bin/env python # _*_ coding: UTF-8 _*_ """================================================= @Project -> File : six-dialog_design -> qianqian.py @IDE : PyCharm @Author : zihan @Date : 2020/5/25 14:50 @Desc : =================================================""" import requests from lxml import etree headers = { 'User-Agent': "" } def main(): url = "https://www.qqxsnew.com/18/18991/" html = requests.get(url, headers=headers).text datas = etree.HTML(html) chapter_titles_obj = datas.xpath('//*[@id="list"]/dl/dd[position()>12]/a') for chapter_title_obj in chapter_titles_obj: chapter_title_text = chapter_title_obj.xpath('./text()')[0] chapter_url = chapter_title_obj.xpath('./@href')[0] chapter_url = "https://www.qqxsnew.com" + chapter_url # 對每一章的鏈接發送請求 html_chapter = requests.get(chapter_url, headers=headers).text datas_chapter = etree.HTML(html_chapter) content_chapter = datas_chapter.xpath('//*[@id="content"]/text()') print(chapter_title_text, "開始下載") for content_chapter_text in content_chapter: print(content_chapter_text) with open("魔道祖師/" + chapter_title_text + ".txt", 'a', encoding='utf-8') as f: f.write(content_chapter_text) if __name__ == '__main__': main()
OK。如果想要批量下載,或者選擇下載等,只是改變url而已,了解主體方法后,這些都不難。