爬取千千小说 -- xpath
今天以其中一本小說為例,講一下下載小說的主體部分,了解正常的爬取步驟,用到的是request和xpath。
爬取數(shù)據(jù)三步走:訪問url --》爬取數(shù)據(jù) --》保存數(shù)據(jù)
一、訪問千千小說網(wǎng)址:https://www.qqxsnew.com/
二、隨便選一部小說,打開章節(jié)目錄界面(比方說魔道祖師):https://www.qqxsnew.com/18/18991/
三、開始編寫代碼。
a. 利用request訪問網(wǎng)頁,是get請(qǐng)求還是post請(qǐng)求要看網(wǎng)頁上面寫的是啥
右擊檢查,選擇network,隨便找個(gè)頁面,看下request Method方法是什么。
url = "https://www.qqxsnew.com/18/18991/" html = requests.get(url, headers=headers).text
b. 得到網(wǎng)頁的html頁面(html頁面 == 在網(wǎng)頁鼠標(biāo)右擊“查看網(wǎng)頁源代碼”),獲取章節(jié)名字和章節(jié)鏈接。
章節(jié)名字和章節(jié)鏈接獲取需要用到XPath --》在網(wǎng)頁鼠標(biāo)右擊檢查 --》定位到任意章節(jié)(如第一章)--》copy --》copy XPath --》//*[@id="list"]/dl/dd[13]/a
如果安裝過XPath插件的話,可以將上面復(fù)制的XPath在插件里面查詢,可以看到只查詢到了一個(gè)
我們的目的是獲取到所有章節(jié)的名字和鏈接,分析上面XPath的字串,發(fā)現(xiàn)dd[13]這個(gè)地方是定位,每個(gè)dd都是一個(gè)章節(jié),所以我們模糊定位看看
咦,可以看出來dd里面的內(nèi)容都出來了,但是前面12章的內(nèi)容不是我們需要的,我們要的是從第一章開始,所以需要把它們過濾掉,position是一個(gè)定位的函數(shù),大于12是說從第13位開始,也就是第一章
這數(shù)據(jù)正好是我們想要提取的文字,所以我們已經(jīng)得到了文字提取的XPath字串://*[@id="list"]/dl/dd[position()>12]/a
文字和鏈接都在a標(biāo)簽里面,鏈接在href屬性里面,所以鏈接的XPath字串://*[@id="list"]/dl/dd[position()>12]/a/@href
好了,前面是在分析XPath字串是怎么得到的,如果自己對(duì)XPath語法熟的話,也可以自己寫提取字串,然后用插件去驗(yàn)證,或者直接用代碼驗(yàn)證都是可以的。現(xiàn)在我們把它放到代碼中去
# 獲取a標(biāo)簽對(duì)象
chapter_titles_obj = datas.xpath('//*[@id="list"]/dl/dd[position()>12]/a')
for chapter_title_obj in chapter_titles_obj:
# 獲取a標(biāo)簽文本
chapter_title_text = chapter_title_obj.xpath('./text()')[0]
# 獲取a標(biāo)簽的鏈接
chapter_url = chapter_title_obj.xpath('./@href')[0]
打印出來看看結(jié)果
c. 每個(gè)章節(jié)的鏈接都拿到了,接下來就是請(qǐng)求了,這個(gè)不多說,和上面請(qǐng)求的方法一樣,XPath獲取方法也相同。
d. 存儲(chǔ)獲取到的數(shù)據(jù)
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)
這樣,一篇小說從訪問到下載的過程就結(jié)束了。
完整代碼
#!/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
# 對(duì)每一章的鏈接發(fā)送請(qǐng)求
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而已,了解主體方法后,這些都不難。
總結(jié)
以上是生活随笔為你收集整理的爬取千千小说 -- xpath的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Visual Studio:error
- 下一篇: 向sqlserver 数据库插入emoj