用python實作自動化辦公------爬取小說天堂所有小說
-
- 摘要
- 聲明
- 快速爬取B站、愛奇藝、網易雲音樂、QQ音樂等視訊小技巧
- 一 緻敬青春
- 二 網站技術分析
- 三 爬蟲流程
- 四 精準爬取
- 五 分布式爬蟲
摘要
所謂爬蟲,其實就是使用者和後端碼農的互相較量。使用者想要從伺服器端爬取資料,伺服器端的碼農不樂意了,LZ辛辛苦苦收集到的資料豈能讓你寫幾行代碼就給偷走了,不行不行,必須加點反爬手段。随着一輪又一輪的較量,爬蟲興起,反爬手段也越來越多。對于我們普通大衆來說,平時想爬點小電影、小說之類的,愈發變得艱難。
但是并不是所有網站的後端碼農都是反爬黨,今天的目标TXT小說天堂首頁,就是要将該網站所有小說一網打盡。我會将源碼在下文中全部展示出來,但是警告大家,如果你的磁盤容量太小,可能冒煙哦!
聲明
對于本文涉及的程式請謹慎使用,如讀者使用此程式造成該網站癱瘓,帶來的後果自負。
本程式隻用作爬蟲技術交流,請勿用于商業用途!
後續本人将設計爬蟲GUI軟體,将免費送給讀者朋友們。
快速爬取B站、愛奇藝、網易雲音樂、QQ音樂等視訊小技巧
安裝you-get
可使用pip安裝。
安裝成功後可直接使用如下指令:
you-get url
url為你想爬取的網站的url,系統會自動将爬取的檔案儲存在C:\Users\你的賬号名**目錄下
如下示範:
①打開你想要的視訊,複制url。
②打開終端,輸入指令:you-get https://www.bilibili.com/video/BV11y4y1B7Uw?from=search&seid=1081825059945006533
下載下傳的檔案預設在C:\Users\你的賬号名**目錄下,下載下傳的檔案可以直接使用。
一 緻敬青春
整理房間的時候,發現了我塵封十幾年的mp3,太驚訝了!那時候在被窩裡看小說的場景浮現在眼前。那時候十歲左右的年紀,跑去黑網吧,專門下載下傳玄幻、暴力小說,記得當時的《壞蛋是怎樣煉成的》中的謝文東一直是我的偶像,為了下載下傳到此小說,不惜挨一頓暴打從家裡偷出5元錢跑去黑網吧。十幾年過去了,我已不是當時的少年,也不需要偷偷跑去黑網吧,此刻,我能爬取大多數小說網站,但是再也回不到那時候童真的年紀了,緻敬青春!!!
二 網站技術分析
這個網站經過我多次無headers爬取,居然沒有觸發反爬措施,是以我可以判定這個網站沒有反爬手段,讀者朋友們可以随意爬取。對于網站的整體架構,沒有渲染、設計簡單,是以爬蟲難度很小。很容易就可以将所有小說打包回家。還有就是,這個網站不能下載下傳,隻能線上閱讀,點選“立即下載下傳”也不會有任何下載下傳彈出視窗。
三 爬蟲流程
對于資源網站,要想将其一網打盡,那必然要擷取底層的url。怎麼獲得底層url呢?那麼該網站将所有小說分成了21個大類,每個大類裡邊包括各種小說,某一小說又分為各個章節,每一個章節才會将小說内容顯示出來。是以在爬取過程中,我們先要擷取大類的url,再到小說的url,再到小說章節的url,這樣子形成多級清單。
四 精準爬取
按照第三節的流程,我們按如下步驟進行:
第一步:擷取大類的url
#官網:'https://www.xstt5.com/'
start_url = 'https://www.xstt5.com/'
#擷取官網響應
response_all=session.get(start_url,headers=headers).content
response_all = etree.HTML(response_all)
#擷取官網所有大類的url清單
name_list_all = response_all.xpath('//ul/li/a/@href')
第二步:擷取小說的url
#擷取各個大類之下的小類的url
start_url = i
response = session.get(start_url, headers=headers).content
response = etree.HTML(response)
#擷取小說url清單
txt_url_list = response.xpath('//div[@class="w990"]/div[2]/div/div/h3/a/@href')
#擷取小說名
txt_name_list = response.xpath('//div[@class="w990"]/div[2]/div/div/h3/a/text()')
第三步:擷取小說章節的url
response_index = session.get('https://www.xstt5.com' + u, headers=headers).content
response_index = etree.HTML(response_index)
#擷取章節的url位址
txt_url_chapter_list = response_index.xpath('//td/ul/li/a/@href')
五 分布式爬蟲
現在大型爬蟲都是采用分布式爬蟲模式,就如Python的多級清單一樣,逐漸深入。
對于此網站的章節部分,設計者用了table标簽,章節數是被打亂的,是以需要将章節數進行排序,不然爬取的小說章節是錯亂的,沒有任何意義。
#對章節url進行排序
txt_url_chapter_list.sort()
現在我們就可以将第四節中三個清單進行聯立,使用分布式爬蟲了。源代碼如下:
"""User-agent大清單"""
USER_AGENT_LIST = [
'Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3451.0 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:57.0) Gecko/20100101 Firefox/57.0',
'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.71 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.2999.0 Safari/537.36',
'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.70 Safari/537.36',
'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2',
'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36 OPR/31.0.1889.174',
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.1.4322; MS-RTC LM 8; InfoPath.2; Tablet PC 2.0)',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36 OPR/55.0.2994.61',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.814.0 Safari/535.1',
'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/418.9.1 (KHTML, like Gecko) Safari/419.3',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36',
'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0; Touch; MASMJS)',
'Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1041.0 Safari/535.21',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
'Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3451.0 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:57.0) Gecko/20100101 Firefox/57.0',
'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.71 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.2999.0 Safari/537.36',
'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.70 Safari/537.36',
'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2',
'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36 OPR/31.0.1889.174',
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.1.4322; MS-RTC LM 8; InfoPath.2; Tablet PC 2.0)',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36 OPR/55.0.2994.61',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.814.0 Safari/535.1',
'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/418.9.1 (KHTML, like Gecko) Safari/419.3',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36',
'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0; Touch; MASMJS)',
'Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1041.0 Safari/535.21',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4093.3 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko; compatible; Swurl) Chrome/77.0.3865.120 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4086.0 Safari/537.36',
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:75.0) Gecko/20100101 Firefox/75.0',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) coc_coc_browser/91.0.146 Chrome/85.0.4183.146 Safari/537.36',
'Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36 VivoBrowser/8.4.72.0 Chrome/62.0.3202.84',
'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:83.0) Gecko/20100101 Firefox/83.0',
'Mozilla/5.0 (X11; CrOS x86_64 13505.63.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:68.0) Gecko/20100101 Firefox/68.0',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36 OPR/72.0.3815.400',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Safari/537.36',
]
from requests_html import HTMLSession
import os, xlwt, xlrd, random
import threading
from lxml import etree
session = HTMLSession()
class DFSpider(object):
def __init__(self,start_url,txt_name):
# 起始的請求位址、小說名----初始化
self.start_url = start_url
self.txt_name=txt_name
def parse_start_url(self):
"""
發送請求,擷取響應
:return:
"""
# 請求頭
headers = {
# 通過随機子產品提供的随機拿取資料方法
'User-Agent': random.choice(USER_AGENT_LIST)
}
# 發送請求,擷取響應位元組資料
response = session.get(self.start_url, headers=headers).content
"""序列化對象,将位元組内容資料,經過轉換,變成可進行xpath操作的對象"""
response = etree.HTML(response)
"""調用提取第二份響應資料"""
self.parse_response_data(response)
def parse_response_data(self, response):
"""
解析response響應資料,提取
:return:
"""
#小說内容
name_list_1 = response.xpath('//div[@class="zw"]/p/text()')
#小說章節
name_list_2 = response.xpath('//div[@class="atitle"]/h1/text()')
"""調用儲存小說的方法"""
self.save_txt_file(name_list_1,name_list_2)
def save_txt_file(self,name_list,name_list2):
with open(f'./資料/{self.txt_name}.txt','a+',encoding='utf-8')as f:
print(f"正在爬取{name_list2[0]}")
f.write(str(name_list2[0])+'\n')
for i in name_list:
# print(i)
f.write(i+'\n')
headers = {
# 通過随機子產品提供的随機拿取資料方法
'User-Agent': random.choice(USER_AGENT_LIST)
}
if __name__ == '__main__':
#官網:'https://www.xstt5.com/'
start_url = 'https://www.xstt5.com/'
#擷取官網響應
response_all=session.get(start_url,headers=headers).content
response_all = etree.HTML(response_all)
#擷取官網所有大類的url清單
name_list_all = response_all.xpath('//ul/li/a/@href')
#周遊
for i in name_list_all:
try:
#擷取各個大類之下的小類的url
start_url = i
response = session.get(start_url, headers=headers).content
response = etree.HTML(response)
#擷取小說url清單
txt_url_list = response.xpath('//div[@class="w990"]/div[2]/div/div/h3/a/@href')
#擷取小說名
txt_name_list = response.xpath('//div[@class="w990"]/div[2]/div/div/h3/a/text()')
#打包
for u, n in zip(txt_url_list, txt_name_list):
# print(u,n)
print('_'*80)
print(f"正在下載下傳 {n}")
response_index = session.get('https://www.xstt5.com' + u, headers=headers).content
response_index = etree.HTML(response_index)
#擷取章節的url位址
txt_url_chapter_list = response_index.xpath('//td/ul/li/a/@href')
#儲存小說url和小說名
with open("xiaoshuoliebiao.txt",'a+',encoding='utf-8') as f:
f.write('https://www.xstt5.com'+u+','+n+'\n')
#對章節url進行排序
txt_url_chapter_list.sort()
#逐個爬取儲存
# 方法一(單線程)
# for c in txt_url_chapter_list:
# url='https://www.xstt5.com'+c
# object=DFSpider(url,n)
# object.parse_start_url()
# print(f" {n} 下載下傳成功")
#
# 方法二(多線程)爬蟲速度加快,但是章節會亂
for c in txt_url_chapter_list:
url = 'https://www.xstt5.com' + c
object = DFSpider(url, n)
fun1=threading.Thread(target=object.parse_start_url)
fun1.start()
fun1.join()
except:
print("出錯了!未找到檔案")
當然,對于分布式任務,當然可以采用多線程、多程序、協程就行爬取工作,速度更快哦!
for c in txt_url_chapter_list:
url = 'https://www.xstt5.com' + c
object = DFSpider(url, n)
fun1=threading.Thread(target=object.parse_start_url)
fun1.start()
fun1.join()
以下就是運作截圖了
今天的分享就到這兒了,感謝大家的閱讀,别忘了給我點個贊哦!
如果對我的文章感興趣,請為我點一個贊,如果有python的知識需要了解或探讨,可以加本人微信cuiliang1666457052