爬取千千小說 -- xpath


今天以其中一本小說為例,講一下下載小說的主體部分,了解正常的爬取步驟,用到的是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()
View Code

 

OK。如果想要批量下載,或者選擇下載等,只是改變url而已,了解主體方法后,這些都不難。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM