日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python爬取奇书网(用Python下载小说到本地)

發(fā)布時間:2023/12/16 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python爬取奇书网(用Python下载小说到本地) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

今天我們來進行Python爬取小說網(wǎng)的案例,與前面學(xué)習(xí)的爬取圖片和爬取電影網(wǎng)不同,小說網(wǎng)的數(shù)據(jù)量比較大,相比前兩者要復(fù)雜的多。

首先分析需求,我們要對每個分類的小說進行爬取,并且進行分類,不僅是文字還有圖片信息,著重考慮的是網(wǎng)頁目錄,頁數(shù)跳轉(zhuǎn)和下載后亂碼的問題。

下面開始寫代碼吧!

首先導(dǎo)入今天的幾個包

import requests from lxml import etree from urllib.request import urlretrieve from urllib.parse import quote import os # 正則表達式:從目標(biāo)字符串提取需要的字符的一種匹配規(guī)則。 import re

一部小說的全部信息需要如下代碼

# 小說名稱 novel_name = div.xpath('h1/text()')[0] # 小說點擊次數(shù) novel_click_num = div.xpath('ul/li[1]/text()')[0].split(":")[-1] # 小說文件大小 novel_size = div.xpath('ul/li[2]/text()')[0].split(":")[-1] # 小說書籍類型 novel_file_type = div.xpath('ul/li[3]/text()')[0].split(":")[-1] # 小說更新日期 novel_update_time = div.xpath('ul/li[4]/text()')[0].split(":")[-1] # 小說連載狀態(tài) novel_status = div.xpath('ul/li[5]/text()')[0].split(":")[-1] # 小說作者 novel_author = div.xpath('ul/li[6]/text()')[0].split(":")[-1] # 小說運行環(huán)境 novel_run_envir = div.xpath('ul/li[7]/text()')[0].split(":")[-1] # 小說最新章節(jié) novel_last_chapter = div.xpath('ul/li[8]/a/text()')[0] # 小說圖片的地址 novel_img_url = "https://www.qisuu.la" + html_obj.xpath('//div[@class="detail_pic"]/img/@src')[0] # 小說的下載地址 # 根據(jù)正則表達式提取 pattern_obj = re.compile(r"get_down_url.*?,'(.*?)',", re.S) novel_download_url = re.search(pattern_obj, response.text).group(1)

全部代碼:

import requests from lxml import etree from urllib.request import urlretrieve from urllib.parse import quote import os # 正則表達式:從目標(biāo)字符串提取需要的字符的一種匹配規(guī)則。 import re# 判斷是否有奇書網(wǎng)這個文件夾,如果沒有,就創(chuàng)建一個并且切換進去 # 如果有則直接切換進去 if not os.path.exists("奇書網(wǎng)"):os.mkdir("奇書網(wǎng)")os.chdir("奇書網(wǎng)") else:os.chdir("奇書網(wǎng)") # 首先對網(wǎng)站首頁發(fā)起請求,目的是為了解析出來每個小說分類的名稱和地址 response = requests.get("https://www.qisuu.la/") html_obj = etree.HTML(response.text) a_list = html_obj.xpath('//div[@class="nav"]/a') # 刪除首頁所在的a標(biāo)簽 del a_list[0] for a in a_list:href = a.xpath("@href")[0]text = a.xpath("text()")[0]print("正在爬取-{}-分類小說".format(text))# 通過分類的名稱創(chuàng)建文件夾,保證對應(yīng)的分類小說存儲到對應(yīng)的文件夾中if not os.path.exists(text):os.mkdir(text)os.chdir(text)else:os.chdir(text)# 根據(jù)每個分類的href屬性值,拼接出來每個分類詳細(xì)的地址type_url = "https://www.qisuu.la" + href# 對每個小說分類的地址發(fā)起訪問response = requests.get(type_url)# 編寫正則表達式規(guī)則,從每個小說分類首頁提取該小說分類的總頁數(shù)# .*?:非貪婪匹配pattern_obj = re.compile(r"頁次:1/(.*?) 每頁", re.S)# 根據(jù)正則表達式匹配規(guī)則,從頁面源代碼中提取總頁數(shù)total_num = re.search(pattern_obj, response.text).group(1)# 正則表達式匹配到的total_num是一個字符串,所有需要用int轉(zhuǎn)換一下for page_num in range(1, int(total_num) + 1):print("正在爬取第{}頁小說".format(page_num))if not os.path.exists("第{}頁".format(page_num)):os.mkdir("第{}頁".format(page_num))os.chdir("第{}頁".format(page_num))else:os.chdir("第{}頁".format(page_num))# 在小說分類地址的基礎(chǔ)上,拼接出來每一頁小說的地址every_page_url = type_url + "index_{}.html".format(page_num)# 對每一頁小說發(fā)起訪問response = requests.get(every_page_url)html_obj = etree.HTML(response.text)# 解析出來每一本小說的地址a_list = html_obj.xpath('//div[@class="listBox"]/ul/li/a')for a in a_list:href = a.xpath("@href")[0]text = a.xpath("text()")[0]print("正在爬取-{}-小說".format(text))if not os.path.exists(text):os.mkdir(text)os.chdir(text)else:os.chdir(text)# 拼接出來每一本小說的地址,然后發(fā)起訪問every_novel_url = "https://www.qisuu.la" + hrefresponse = requests.get(every_novel_url)response.encoding = "utf-8"html_obj = etree.HTML(response.text)div = html_obj.xpath('//div[@class="detail_right"]')[0]# 小說名稱novel_name = div.xpath('h1/text()')[0]# 小說點擊次數(shù)novel_click_num = div.xpath('ul/li[1]/text()')[0].split(":")[-1]# 小說文件大小novel_size = div.xpath('ul/li[2]/text()')[0].split(":")[-1]# 小說書籍類型novel_file_type = div.xpath('ul/li[3]/text()')[0].split(":")[-1]# 小說更新日期novel_update_time = div.xpath('ul/li[4]/text()')[0].split(":")[-1]# 小說連載狀態(tài)novel_status = div.xpath('ul/li[5]/text()')[0].split(":")[-1]# 小說作者novel_author = div.xpath('ul/li[6]/text()')[0].split(":")[-1]# 小說運行環(huán)境novel_run_envir = div.xpath('ul/li[7]/text()')[0].split(":")[-1]# 小說最新章節(jié)novel_last_chapter = div.xpath('ul/li[8]/a/text()')[0]# 小說圖片的地址novel_img_url = "https://www.qisuu.la" + html_obj.xpath('//div[@class="detail_pic"]/img/@src')[0]# 小說的下載地址# 根據(jù)正則表達式提取pattern_obj = re.compile(r"get_down_url.*?,'(.*?)',", re.S)novel_download_url = re.search(pattern_obj, response.text).group(1)print("沒有轉(zhuǎn)換之前的小說地址:", novel_download_url)# 從小說下載地址中把其中的文字部分取出來,使用quote對文字部分內(nèi)容進行編碼novel_download_url = novel_download_url.replace(novel_download_url.split("/")[-1].split(".")[0],quote(novel_download_url.split("/")[-1].split(".")[0]))print("轉(zhuǎn)換過后的下載地址是:", novel_download_url)# 下載小說圖片urlretrieve(novel_img_url, "{}.jpg".format(novel_name))# 由于使用urlretrieve進行文件下載的時候,下載地址中不能含有中文,需要進行對中文進行轉(zhuǎn)換urlretrieve(novel_download_url, "{}.txt".format(novel_name))f = open("{}信息.txt".format(novel_name), "w", encoding="utf-8")# write():文件寫入f.write("小說名稱:{}".format(novel_name))f.write("\n")f.write("點擊次數(shù):{}".format(novel_click_num))f.write("\n")f.write("文件大小:{}".format(novel_size))f.write("\n")f.write("書籍類型:{}".format(novel_file_type))f.write("\n")f.write("更新日期:{}".format(novel_update_time))f.write("\n")f.write("連載狀態(tài):{}".format(novel_status))f.write("\n")f.write("小說作者:{}".format(novel_author))f.write("\n")f.write("運行環(huán)境:{}".format(novel_run_envir))f.write("\n")f.write("最新章節(jié):{}".format(novel_last_chapter))f.write("\n")f.write("圖片地址:{}".format(novel_img_url))f.write("\n")f.write("下載地址:{}".format(novel_download_url))f.write("\n")print("文件關(guān)閉")# 關(guān)閉文件f.close()os.chdir(os.pardir)os.chdir(os.pardir)os.chdir(os.pardir)

運行程序后,

我這里網(wǎng)路比較卡,只下載了一本就停止運行了 ,如果想下載全部,耐心等待就好了,489頁 每頁25本,太多了。哈哈 運行完后去你程序的源文件就可以看到奇書網(wǎng)文件夾了,好看的小說就都在里面啦!

做的不好 僅供參考

總結(jié)

以上是生活随笔為你收集整理的Python爬取奇书网(用Python下载小说到本地)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。