python分析并爬取起点中文网的章节数据,最后保存为txt文档
如題,分析起點中文網,并提取出來章節鏈接,保存為txt文檔。
代碼僅供交流使用,請勿用作商業用途,如有違規,請聯系刪除
一,分析
1.打開帶有章節的鏈接,例如:(隨便選的一篇文章)
2.打開瀏覽器的抓包工具f12(我用的是谷歌瀏覽器),點擊頁面的免費試讀,因為頁面是在一個頁面跳轉,不需要多開瀏覽器。
抓到包會發現很雜亂,通過篩選會出現所需要的一些鏈接,這些鏈接一個個點擊查看返回詳情,最后發現那條藍色鏈接是包含所有這篇小說的目錄的。
3.可以發現這個是一個get包,變化的參數有兩個。
4.bookid可以發現是書的id,_csrfToken是一個可變的參數,這個得找到從哪獲取的,先在所有鏈接里進行搜索這個內容,可以發現這個token是存在cookie中,查看了沒有返回過cookie,就只能從refer來,找到最先出現這個token的鏈接,在這個鏈接里提取refer的,然后通過代碼提取到這個token的值。
5.回到出現目錄的鏈接那里(這個鏈接要在頁面點擊一下目錄),分析返回的內容,返回的是屬于json格式,提取也能用過key值提取出來,紅色方框是主key,箭頭是列表,小說包含的章節數多,圓圈的是代表目錄的內容。具體的提取方式會在代碼顯示,公式是:返回內容[主key1][主key2][列表數][圓圈][具體提取的key]。其中提取的每章的鏈接需要自己補全。
?
二.代碼
代碼上面附上解釋說明,詳情請看:
def get_qidian(url):import requestsimport jsonimport refrom lxml import etree#設置全局變量some_ = ''#提取bookidbid = url.split("/")[-1]# print(bid)headers ={"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"}res = requests.get(url, headers=headers)#提取后面用到的refernew_url = 'https:' + re.search(re.compile(r'<a class="red-btn J-getJumpUrl " href="(.*?)"'), res.text).group(1)#提取小說名字title = re.search(re.compile('《(.*?)》'), res.text).group(1)#兩種提取cookie成字典模式#第一種# print(res.cookies.list_domains())# print(res.cookies.list_paths())# print(res.cookies.get_dict(res.cookies.list_domains()[0],res.cookies.list_paths()[0]))#第二種cookie = requests.utils.dict_from_cookiejar(res.cookies)Token = cookie['_csrfToken']#更新字典的headersheaders.update({"x-requested-with": "XMLHttpRequest", "referer": new_url})headers.update(cookie)#解碼返回的內容res = requests.get(f'https://read.qidian.com/ajax/book/category?_csrfToken={Token}&bookId={bid}',headers=headers).text.encode("raw_unicode_escape").decode()# 把返回的內容轉為json格式res = json.loads(res)headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"}#提取列表for s in res['data']['vs']:#提取目錄內容for i in s['cs']:#提取章節名字chapter = i['cN']#提取鏈接后半部分ch_url = 'https://read.qidian.com/chapter/' + i['cU']# print(chapter)# print(ch_url)#https://read.qidian.com/chapter/#<div class="read-content j_readContent">res = requests.get(ch_url, headers=headers).text# print(res)#通過etree提取每一章的內容selector = etree.HTML(res)txt_ = selector.xpath('//div[@class="read-content j_readContent"]/p/text()')# print(txt_)all_txt = ''for g in txt_:#對每一條內容進行處理g = str(g)g = g.replace('\u3000\u3000', '').replace('\n', '').strip() + '\n'all_txt = all_txt + g#把所有內容放在一個變量里,最后再保存all_txt = chapter + '\n\n' + all_txtsome_ = some_ + all_txt#把所有處理好了,進行寫出保存with open(f'{title}.txt', 'w') as f:f.write(some_)f.close()if __name__ == '__main__':get_qidian('https://book.qidian.com/info/1018027842')本文僅交流學習,覺得有幫助的點個贊,后續將會發布更多的好文章,請持續關注。
總結
以上是生活随笔為你收集整理的python分析并爬取起点中文网的章节数据,最后保存为txt文档的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: codeforces 628.div2
- 下一篇: 用过滤器实现file类实现输出目录以及子