马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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 |