Python爬取奇书网(用Python下载小说到本地)
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                Python爬取奇书网(用Python下载小说到本地)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                今天我們來進行Python爬取小說網的案例,與前面學習的爬取圖片和爬取電影網不同,小說網的數據量比較大,相比前兩者要復雜的多。
首先分析需求,我們要對每個分類的小說進行爬取,并且進行分類,不僅是文字還有圖片信息,著重考慮的是網頁目錄,頁數跳轉和下載后亂碼的問題。
 
 
下面開始寫代碼吧!
首先導入今天的幾個包
import requests from lxml import etree from urllib.request import urlretrieve from urllib.parse import quote import os # 正則表達式:從目標字符串提取需要的字符的一種匹配規則。 import re一部小說的全部信息需要如下代碼
# 小說名稱 novel_name = div.xpath('h1/text()')[0] # 小說點擊次數 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] # 小說連載狀態 novel_status = div.xpath('ul/li[5]/text()')[0].split(":")[-1] # 小說作者 novel_author = div.xpath('ul/li[6]/text()')[0].split(":")[-1] # 小說運行環境 novel_run_envir = div.xpath('ul/li[7]/text()')[0].split(":")[-1] # 小說最新章節 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] # 小說的下載地址 # 根據正則表達式提取 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 # 正則表達式:從目標字符串提取需要的字符的一種匹配規則。 import re# 判斷是否有奇書網這個文件夾,如果沒有,就創建一個并且切換進去 # 如果有則直接切換進去 if not os.path.exists("奇書網"):os.mkdir("奇書網")os.chdir("奇書網") else:os.chdir("奇書網") # 首先對網站首頁發起請求,目的是為了解析出來每個小說分類的名稱和地址 response = requests.get("https://www.qisuu.la/") html_obj = etree.HTML(response.text) a_list = html_obj.xpath('//div[@class="nav"]/a') # 刪除首頁所在的a標簽 del a_list[0] 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)# 根據每個分類的href屬性值,拼接出來每個分類詳細的地址type_url = "https://www.qisuu.la" + href# 對每個小說分類的地址發起訪問response = requests.get(type_url)# 編寫正則表達式規則,從每個小說分類首頁提取該小說分類的總頁數# .*?:非貪婪匹配pattern_obj = re.compile(r"頁次:1/(.*?) 每頁", re.S)# 根據正則表達式匹配規則,從頁面源代碼中提取總頁數total_num = re.search(pattern_obj, response.text).group(1)# 正則表達式匹配到的total_num是一個字符串,所有需要用int轉換一下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))# 在小說分類地址的基礎上,拼接出來每一頁小說的地址every_page_url = type_url + "index_{}.html".format(page_num)# 對每一頁小說發起訪問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)# 拼接出來每一本小說的地址,然后發起訪問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]# 小說點擊次數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]# 小說連載狀態novel_status = div.xpath('ul/li[5]/text()')[0].split(":")[-1]# 小說作者novel_author = div.xpath('ul/li[6]/text()')[0].split(":")[-1]# 小說運行環境novel_run_envir = div.xpath('ul/li[7]/text()')[0].split(":")[-1]# 小說最新章節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]# 小說的下載地址# 根據正則表達式提取pattern_obj = re.compile(r"get_down_url.*?,'(.*?)',", re.S)novel_download_url = re.search(pattern_obj, response.text).group(1)print("沒有轉換之前的小說地址:", novel_download_url)# 從小說下載地址中把其中的文字部分取出來,使用quote對文字部分內容進行編碼novel_download_url = novel_download_url.replace(novel_download_url.split("/")[-1].split(".")[0],quote(novel_download_url.split("/")[-1].split(".")[0]))print("轉換過后的下載地址是:", novel_download_url)# 下載小說圖片urlretrieve(novel_img_url, "{}.jpg".format(novel_name))# 由于使用urlretrieve進行文件下載的時候,下載地址中不能含有中文,需要進行對中文進行轉換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("點擊次數:{}".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("連載狀態:{}".format(novel_status))f.write("\n")f.write("小說作者:{}".format(novel_author))f.write("\n")f.write("運行環境:{}".format(novel_run_envir))f.write("\n")f.write("最新章節:{}".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("文件關閉")# 關閉文件f.close()os.chdir(os.pardir)os.chdir(os.pardir)os.chdir(os.pardir)運行程序后,
 
我這里網路比較卡,只下載了一本就停止運行了 ,如果想下載全部,耐心等待就好了,489頁 每頁25本,太多了。哈哈 運行完后去你程序的源文件就可以看到奇書網文件夾了,好看的小說就都在里面啦!
 
做的不好 僅供參考
總結
以上是生活随笔為你收集整理的Python爬取奇书网(用Python下载小说到本地)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 在火狐3中安装google工具栏
- 下一篇: 量子化学计算机程序,量子化学程序gaus
