此程序只是單純的為了練習而做,首先這個頂點小說非收費型的那種小說網站(咳咳,我們應該支持正版,正版萬歲,✌)。經常在這個網站看小說,所以就光榮的選擇了這個網站。此外,其實里面是自帶下載功能的,而且支持各種格式:(TXT,CHM,UMD,JAR,APK,HTML),所以可能也並沒有設置什么反爬措施,我也只設置了請求頭。然后內容是保存為txt格式。
內容涉及到request的使用(編碼問題),xpath的使用,字符串的處理(repalce產生列表達到換行效果),文件I/O
頂點小說:https://www.booktxt.net
代碼功能:輸入小說名,若頂點小說中存在,則可直接下載。最終效果如下:
1 # -*- coding:utf-8 -*- 2 import requests 3 from lxml import etree 4 5 novel_name = '' #全局變量,存放小說名稱 6 headers = { 7 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'} 8 9 def get_url(name): 10 ''' 11 通過百度獲取小說在頂點小說中的網址 12 name:小說名 13 ''' 14 #site: booktxt.net + 小說名 指定為該網站搜索 15 baidu = 'https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=site%3A%20booktxt.net%20'+name 16 17 #獲取該小說在頂點小說中的網址 18 r = requests.get(baidu, headers=headers) 19 html = etree.HTML(r.content) 20 try: 21 #提取網址鏈接,若不存在則退出程序 22 url = html.xpath('//*[@id="1"]/h3/a/@href')[0] 23 url =requests.get(url, headers=headers).url 24 except: 25 print("該小說不存在!") 26 exit(0) 27 if url[-4:] == 'html': #搜索結果為某一章節,結果無效 28 print("該小說不存在!") 29 exit(0) 30 get_chapter(url) #獲取小說章節 31 32 def get_chapter(url): 33 ''' 34 獲取搜索到的小說名,並詢問是否下載 35 36 :param url: 小說的鏈接 37 ''' 38 global novel_name 39 40 r = requests.get(url=url,headers=headers) 41 coding = r.apparent_encoding #獲取網頁編碼格式 42 43 html = etree.HTML(r.content, parser=etree.HTMLParser(encoding=coding)) 44 45 novel_name = html.xpath('//*[@id="info"]/h1/text()')[0] 46 print('小說名:'+novel_name+'\n是否下載?是/否\n') 47 flag = input() 48 if flag=='否': 49 print('退出系統') 50 exit(0) 51 52 list = html.xpath('//*[@id="list"]/dl/dd[position()>8]') #獲取章節列表 53 for item in list: 54 chapter_name = item.xpath('./a')[0].text #每一章的名稱 55 print(chapter_name) 56 link = item.xpath('./a/@href')[0] #每章的網址鏈接 57 full_link = url+link #每章的完整地址 58 print(full_link) 59 get_text(chapter_name,full_link) 60 61 def get_text(name,link): 62 ''' 63 獲取每章的內容並寫入至txt文件中 64 :param name: 小說章節名 65 :param link: 章節鏈接 66 :return: 67 ''' 68 69 r = requests.get(url=link, headers=headers) 70 coding = r.apparent_encoding 71 r = r.content 72 73 html = etree.HTML(r, parser=etree.HTMLParser(encoding=coding)) 74 #獲取一章內容,並以空格為界分割成字符串列表 75 text = html.xpath('string(//*[@id="content"])').split() 76 #print(text) 77 #創建小說名.txt文件 78 with open('{}.txt'.format(novel_name),'a+',encoding='utf-8') as f: 79 f.write('\t'*3+name+'\n') #章節名 80 for i in range(len(text)): 81 f.write(' '*4+text[i]+'\n') 82 83 if __name__ == '__main__': 86 novel_name = input('請輸入小說名稱:') 88 get_url(novel_name)