此程序只是单纯的为了练习而做, 首先这个顶点小说非收费型的那种小说网站 (咳咳, 我们应该支持正版, 正版万岁,?). 经常在这个网站看小说, 所以就光荣的选择了这个网站. 此外, 其实里面是自带下载功能的, 而且支持各种格式:(TXT,CHM,UMD,JAR,APK,html), 所以可能也并没有设置什么反爬措施, 我也只设置了请求头. 然后内容是保存为 txt 格式.
内容涉及到 request 的使用 (编码问题),xpath 的使用, 字符串的处理 (repalce 产生列表达到换行效果), 文件 I/O
顶点小说: https://www.booktxt.net
代码功能: 输入小说名, 若顶点小说中存在, 则可直接下载. 最终效果如下:
- # -*- coding:utf-8 -*-
- import requests
- from lxml import etree
- novel_name = '' #全局变量, 存放小说名称
- headers = {
- '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'}
- def get_url(name):
- '''
- 通过百度获取小说在顶点小说中的网址
- name: 小说名
- '''
- #site: booktxt.NET + 小说名 指定为该网站搜索
- baidu = 'https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=site: booktxt.net '+name
- #获取该小说在顶点小说中的网址
- r = requests.get(baidu, headers=headers)
- HTML = etree.HTML(r.content)
- try:
- #提取网址链接, 若不存在则退出程序
- url = HTML.xpath('//*[@id="1"]/h3/a/@href')[0]
- url =requests.get(url, headers=headers).url
- except:
- print("该小说不存在!")
- exit(0)
- if url[-4:] == 'html': #搜索结果为某一章节, 结果无效
- print("该小说不存在!")
- exit(0)
- get_chapter(url) #获取小说章节
- def get_chapter(url):
- '''
- 获取搜索到的小说名, 并询问是否下载
- :param url: 小说的链接
- '''
- global novel_name
- r = requests.get(url=url,headers=headers)
- coding = r.apparent_encoding #获取网页编码格式
- HTML = etree.HTML(r.content, parser=etree.HTMLParser(encoding=coding))
- novel_name = HTML.xpath('//*[@id="info"]/h1/text()')[0]
- print('小说名:'+novel_name+'\n 是否下载? 是 / 否 \ n')
- flag = input()
- if flag=='否':
- print('退出系统')
- exit(0)
- list = HTML.xpath('//*[@id="list"]/dl/dd[position()>8]') #获取章节列表
- for item in list:
- chapter_name = item.xpath('./a')[0].text #每一章的名称
- print(chapter_name)
- link = item.xpath('./a/@href')[0] #每章的网址链接
- full_link = url+link #每章的完整地址
- print(full_link)
- get_text(chapter_name,full_link)
- def get_text(name,link):
- '''
- 获取每章的内容并写入至 txt 文件中
- :param name: 小说章节名
- :param link: 章节链接
- :return:
- '''
- r = requests.get(url=link, headers=headers)
- coding = r.apparent_encoding
- r = r.content
- HTML = etree.HTML(r, parser=etree.HTMLParser(encoding=coding))
- #获取一章内容, 并以空格为界分割成字符串列表
- text = HTML.xpath('string(//*[@id="content"])').split()
- #print(text)
- #创建小说名. txt 文件
- with open('{}.txt'.format(novel_name),'a+',encoding='utf-8') as f:
- f.write('\t'*3+name+'\n') #章节名
- for i in range(len(text)):
- f.write(''*4+text[i]+'\n')
- if __name__ == '__main__':
- novel_name = input('请输入小说名称:')
- get_url(novel_name)
来源: http://www.bubuko.com/infodetail-2934863.html