最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Python實(shí)戰(zhàn)案例——某點(diǎn)中文小說網(wǎng)小說爬取

2023-08-16 16:05 作者:T___T___  | 我要投稿

?前言

現(xiàn)在喜歡看小說的朋友越來越多了,但是每次都要到某個(gè)網(wǎng)站去看有很麻煩。特別是有時(shí)候回鄉(xiāng)下老家,信號差數(shù)據(jù)網(wǎng)絡(luò)用不了,有沒有WIFI。所以,要是能提前把小說下載好就OK了。

準(zhǔn)備

其實(shí),沒什么要準(zhǔn)備的。爬蟲經(jīng)常用的那幾個(gè)模塊就OK了。今天只用到了三個(gè)模塊,分別是requests、json和re。

開始正題

抓包

其實(shí),爬蟲的步驟都是非常固定的。第一步,還是抓包,隨便選一本小說然后點(diǎn)擊免費(fèi)試讀,小說的內(nèi)容就呈現(xiàn)在我們面前了。點(diǎn)擊目錄,發(fā)現(xiàn)地址欄的地址并沒有改變過,所以就是阿賈克斯請求了,直接在Fetch/XHR中找數(shù)據(jù)包。


?果不其然,在下面這個(gè)數(shù)據(jù)包中就找到了所有章節(jié)的json數(shù)據(jù)


層層展開,發(fā)現(xiàn)每個(gè)索引下面有這些內(nèi)容

?


接下來就是尋找這些數(shù)據(jù)和每一章節(jié)的關(guān)系,我觀察了三章的地址欄,很容易就找出了規(guī)律,和我之前做的那個(gè)音樂爬蟲如出一轍。

第二章


第三章


第四章?


?大家很容易就發(fā)現(xiàn)了,這個(gè)地址的前面的所有字符都是沒有改變的,唯一改變了的就是最后一個(gè)數(shù)據(jù)。而這個(gè)數(shù)據(jù),大家仔細(xì)觀察,也很容易發(fā)現(xiàn),它就是我們上面那個(gè)數(shù)據(jù)包中的章節(jié)索引下面的id對應(yīng)的值。那么這樣一來,每個(gè)章節(jié)的地址解決了。

接下來,我們就要來到每個(gè)章節(jié)的詳情頁,來想辦法得到這本小說的文本內(nèi)容。


我在“全部”的第一個(gè)數(shù)據(jù)包中,就找到了小說的文本內(nèi)容?


?到這里,我們可以停下來,回頭看看。到現(xiàn)在,我們已經(jīng)得到了哪些有用信息。

1.每個(gè)章節(jié)的地址即URL

2.每個(gè)章節(jié)詳情頁的小說文本內(nèi)容在哪

接下來,我們要做的就是根據(jù)這個(gè)URL獲得小說文本內(nèi)容就OK了

敲代碼

首先,就是請求目錄頁的數(shù)據(jù)包,然后通過目錄頁的數(shù)據(jù)包得到每個(gè)章節(jié)的URL。在這里有一個(gè)需要注意的點(diǎn),就是這個(gè)網(wǎng)站進(jìn)行了一定程度的反爬,如果你不帶上請求頭就請求不到數(shù)據(jù)。


?


請求的URL和請求頭就如上圖所示,這樣就可以請求到數(shù)據(jù)了。大家注意一下bookId,大家使用的話直接輸入這個(gè)bookId就可以正常使用了,也就是我剛才展示的每個(gè)章節(jié)URL的倒數(shù)第二個(gè)數(shù)據(jù),也就是倒數(shù)第二個(gè)位置的那串?dāng)?shù)字,就是小說的ID。還有一個(gè)點(diǎn),就是請求頭中其實(shí)有很多經(jīng)過加密的字段,如果加上這些字段,是請求不到數(shù)據(jù)的,我沒有將它們截圖進(jìn)來。?請求代碼如下:

bookId = input('bookId:') url = 'https://www.qidian.com/ajax/book/category?bookId={}&_csrfToken=mLzoQhBuJ9pPDdAm8VpBuvMFXCgQQAlhFrC9TuvU'.format(bookId) headers = { ? ?'Accept':'application/json, text/plain, */*', ? ?'Accept-Encoding':'gzip, deflate, br', ? ?'Accept-Language':'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', ? ?'Connection':'keep-alive', ? ?'Cookie':'_csrfToken=mLzoQhBuJ9pPDdAm8VpBuvMFXCgQQAlhFrC9TuvU; newstatisticUUID=1692151465_166373733; Hm_lvt_f00f67093ce2f38f215010b699629083=1692151469; fu=1381548093; _yep_uuid=ad752dda-9748-ea50-e98f-865f3b8bb989; _gid=GA1.2.1689446406.1692151469; supportwebp=true; supportWebp=true; trkf=1; qdrs=0%7C3%7C0%7C0%7C1; navWelfareTime=1692152350314; showSectionCommentGuide=1; qdgd=1; rcr=1036370336; bc=1036370336; e1=%7B%22pid%22%3A%22qd_P_mycenter%22%2C%22eid%22%3A%22qd_H_mall_bottomaddownload%22%2C%22l7%22%3A%22hddl%22%7D; e2=%7B%22l6%22%3A%22%22%2C%22pid%22%3A%22qd_p_qidian%22%2C%22eid%22%3A%22qd_A16%22%2C%22l1%22%3A3%7D; lrbc=1036370336%7C749524263%7C0; _gat_gtag_UA_199934072_2=1; traffic_utm_referer=https%3A%2F%2Flink.csdn.net%2F; Hm_lpvt_f00f67093ce2f38f215010b699629083=1692155018; _ga_FZMMH98S83=GS1.1.1692151469.1.1.1692155018.0.0.0; _ga_PFYW0QLV3P=GS1.1.1692151469.1.1.1692155018.0.0.0; _ga=GA1.2.2023067070.1692151469', ? ?'Host':'www.qidian.com', ? ?'Referer':'https://www.qidian.com/chapter/1023826840/573073457/', ? ?'sec-ch-ua':'"Microsoft Edge";v="113", "Chromium";v="113", "Not-A.Brand";v="24"', ? ?'sec-ch-ua-mobile':'?0', ? ?'sec-ch-ua-platform':'"Windows"', ? ?'Sec-Fetch-Dest':'empty', ? ?'Sec-Fetch-Mode':'cors', ? ?'Sec-Fetch-Site':'same-origin', ? ?'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.42', ? ?'X-D':'0'} response = requests.get(url=url, headers=headers)

還有一個(gè)點(diǎn),直接輸出text會出現(xiàn)亂碼,我們手動(dòng)設(shè)置一下編碼格式為utf-8

response.encoding = 'utf-8'

然后,就是用正則表達(dá)式來提取文本中的id值了,當(dāng)然還有每個(gè)章節(jié)的名稱。

ex = '{"uuid":.*?,"cN":"(.*?)","uT":.*?,"cnt":.*?,"cU":.*?,"id":(.*?),"sS":.*?}'data = re.findall(ex, response.text, re.S)

至此,咱們就得到了每個(gè)章節(jié)的URL和每個(gè)章節(jié)的名稱了。

數(shù)據(jù)提取

接下來,咱們就要對每個(gè)章節(jié)的數(shù)據(jù)進(jìn)行提取了。當(dāng)然首先是要構(gòu)成每個(gè)章節(jié)的URL,然后再對每個(gè)章節(jié)的URL進(jìn)行請求。然后繼續(xù)用正則表達(dá)式對小說文本進(jìn)行提取,代碼如下:

chapterUrlList = [] titleList = [] bookBodyList = []print("正在獲取書籍內(nèi)容,請耐心等待哦!")for i in data: ? ?# 獲取每一章的章名 ? ?title = i[0] ? ?titleList.append(title) ? ?# 獲取每一章的鏈接地址 ? ?chapterUrl = 'https://www.qidian.com/chapter/{}/'.format(bookId) + i[-1] + '/' ? ?chapterUrlList.append(chapterUrl) ? ?# 用正則表達(dá)式獲取每一章的內(nèi)容 ? ?book = requests.get(url = chapterUrl) ? ?ex1 = '<main .*?><p>(.*?)</p></main>' ? ?bookBody = re.findall(ex1, book.text, re.S) ? ?# 用replace替換掉小說文本中的一些特殊符號 ? ?body = bookBody[0].replace('\u3000\u3000', '\n') ? ?body = body.replace('<p>', '') ? ?body = body.replace('</p>', '') ? ?# 將文本保存到列表中 ? ?bookBodyList.append(body)# 獲取小說名字和小說作者等信息book_Info = requests.get(url = chapterUrl) ex2 = '<script id="vite-plugin-ssr_pageContext" type="application/json">(.*?)</script>'book_Info = re.findall(ex2, book_Info.text, re.S)[0] json_data = json.loads(book_Info)print(type(json_data)) bookName = json_data['pageContext']['pageProps']['pageData']['bookInfo']['bookName'] authorName = json_data['pageContext']['pageProps']['pageData']['bookInfo']['authorName']print("正在保存,馬上就好哦!")


最后就是保存請求來下的小說文本了

with open('書名:'+bookName + '作者' + authorName + '.txt', 'w') as f: ? ?for j in range(0, len(titleList)): ? ? ? f.write(titleList[j]) ? ? ? f.write(':') ? ? ? f.write(chapterUrlList[j]) ? ? ? f.write(bookBodyList[j])print("保存成功!")

?到這里咱們就大功告成了!

注意事項(xiàng)

1.就是網(wǎng)站進(jìn)行了一定程度的反爬,但是請求頭中又有一些進(jìn)行了加密的參數(shù),如果全部加上也請求不到數(shù)據(jù);如果一個(gè)不加也請求不到數(shù)據(jù)。

2.其實(shí)最麻煩的一個(gè)點(diǎn)還是數(shù)據(jù)提取,我們有的小說文本內(nèi)容中,有很多html的語法符號,我們有必要把它們給清理掉。

3.正則表達(dá)式其實(shí)不太好配對,也可能是我學(xué)藝不精。因?yàn)槲覀儚捻憫?yīng)中直接將html標(biāo)準(zhǔn)的代碼復(fù)制過來,它其中包含有換行符之類的符號是顯現(xiàn)不出來的。在我們配對的時(shí)候就無法配對這些限制字符了。


完整代碼我會上到資源里面的,有興趣的可以下載哦。


僅供學(xué)習(xí)使用,請不要用于違法犯罪。


Python實(shí)戰(zhàn)案例——某點(diǎn)中文小說網(wǎng)小說爬取的評論 (共 條)

分享到微博請遵守國家法律
阿坝县| 肇州县| 安泽县| 关岭| 泽库县| 横山县| 南皮县| 成武县| 云和县| 彭阳县| 丰镇市| 深圳市| 武宁县| 桂平市| 榕江县| 册亨县| 建宁县| 木兰县| 铜梁县| 金乡县| 山丹县| 阜康市| 高陵县| 青海省| 延川县| 安陆市| 密山市| 饶河县| 秭归县| 禹城市| 迭部县| 大冶市| 青阳县| 西乡县| 花莲市| 固始县| 隆子县| 阿拉善右旗| 山阳县| 香港 | 嘉峪关市|