|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
Python 爬取笔趣阁小说
本来只想爬一部的(和同学炫耀,他们不借我书我就自己爬下来看),结果发现是个通用爬虫,
基本上都可以爬。
一开始是给出小说URL直接上去爬,后来改了下,加了个搜索功能。
后来,想起来IDM有个什么断点续传功能,我就加了一个。
默认开启断点,想关掉只能改代码(这个我后面会改)。
每次会在程序所在位置产生一个breakpoint.cfg,当然,是隐藏的(调API侠)。
这个文件里面有小说名字,章节数,和下载列表。
这个章节没有标题,只有数字。
后面考虑下加个多线程,但没啥思路,还请各位大佬帮助。
不多说了,放代码:
- from requests import get
- from lxml import etree
- import win32api, win32con
- def open_url(url):
- res = get(url)
- res.encoding = 'utf-8'
- return res
- def search():
- html = etree.HTML(open_url('http://www.tianxiabachang.cn/cse/search?q=%s' % input("请输入小说关键词:")).text)
- res = list(filter(None, [each.strip() for each in html.xpath('//*[@id="main"]/div[1]//text()')[19:]]))
- typ, href = ["\n类型:", "名字:", "更新章节:", "作者:", "点击量:", "更新日期:", "状态:"], ['http://www.tianxiabachang.cn' + each for each in html.xpath('//*[@id="main"]/div[1]/ul/li[2]/span[2]/a/@href')]
- length = len(typ)
- cnt = 1
- for i in range(len(res)):
- if not i % 7:
- print('\n', f"第{cnt}个:", sep = '')
- cnt += 1
- print(typ[i % length], res[i], sep = '')
- n = int(input("请输入想要选择的小说序号:"))
- return href[n - 1], res[1::7][n]
- def get_breakpoint():
- try:
- point = open("breakpoint.cfg")
- except:
- print("断点不存在!")
- else:
- zj = eval(point.readline())
- name = point.readline()
- href = eval(point.readline())
- return zj, href, name
- def get_Info(res, zj, f):
- html = etree.HTML(res.text)
- print("第 %d 章开始爬取.." % zj)
- f.write(f'\n\t\t\t\t\t\t\t 第{zj}章 \n\n')
- for each in html.xpath('//*[@id="content"]//text()'):
- temp = ''.join(each.split()) + '\n'
- for i in range(len(temp)):
- if temp[i] in ',。!?“‘”’…': # 这段代码我还未检测过是否好用,各位可以随时反馈给我!
- f.write('\n')
- f.write(temp[i])
- cnt += 1
- get_url = lambda res: ['http://www.tianxiabachang.cn' + each for each in etree.HTML(res.text).xpath('//*[@id="list"]/dl/dd/a/@href')][9:]
- def main():
- isbp = input("请输入是否使用断点: Y/N")
- if isbp == "Y":
- zj, url_list, fname = get_breakpoint()
- f = open(r"%s.txt" % fname.strip(), 'a', encoding = "utf-8") # 加上strip是为了去掉readline带来的\n
- else:
- url, fname = search()
- f = open(r"%s.txt" % fname, 'w', encoding = "utf-8")
- url_list = get_url(open_url(url))
- zj = -1
- try:
- temp = url_list[:]
- if zj > 0:
- for i in range(zj, len(url_list)):
- get_Info(open_url(url_list[i]), i + 1, f)
- temp.remove(url_list[i])
- else:
- for i in range(len(url_list)):
- get_Info(open_url(url_list[i]), i + 1, f)
- temp.remove(url_list[i])
-
- except KeyboardInterrupt:
- point = open("breakpoint.cfg", 'w')
- win32api.SetFileAttributes('breakpoint.cfg', win32con.FILE_ATTRIBUTE_HIDDEN) # 把这个配置文件设置为隐藏
- point.write(str(i) + '\n')
- point.write(fname + '\n')
- point.write(str(temp))
- point.close()
- print("程序结束,断点设置完毕!")
- except Exception as exc:print("出现错误!", exc)
- finally:f.close()
- main()
复制代码
当然,爬下来的小说断句还是很差的....正在慢慢改进。
有BUG请指出!:D |
评分
-
查看全部评分
|