鱼C论坛

 找回密码
 立即注册
查看: 2882|回复: 17

[技术交流] Python 爬取笔趣阁小说

[复制链接]
发表于 2020-6-17 10:26:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

评分

参与人数 2荣誉 +6 鱼币 +5 收起 理由
Hello. + 1 鱼C有你更精彩^_^
Twilight6 + 5 + 5 鱼C有你更精彩^_^

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-17 10:27:51 | 显示全部楼层
我刚给人推荐这个app,还挺不错的。

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +3 收起 理由
qiuyouzhi + 3 + 3 + 3 神速啊

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-17 10:28:12 | 显示全部楼层
heidern0612 发表于 2020-6-17 10:27
我刚给人推荐这个app,还挺不错的。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-17 10:31:27 | 显示全部楼层
  很强
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-17 11:01:31 | 显示全部楼层
套娃,笔趣阁是白嫖正版网站的,你是白嫖笔趣阁的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-17 11:08:59 | 显示全部楼层
PLUS甲鱼 发表于 2020-6-17 11:01
套娃,笔趣阁是白嫖正版网站的,你是白嫖笔趣阁的。

咋算我白嫖笔趣阁的呢
好歹也是我自己写代码爬的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-17 11:32:26 From FishC Mobile | 显示全部楼层
都是大神
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-17 13:32:12 | 显示全部楼层
加个多线程吧,之前写过爬笔趣阁的,不用的多线程几千章的小说挺慢的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-17 13:51:49 | 显示全部楼层
qiuyouzhi 发表于 2020-6-17 11:08
咋算我白嫖笔趣阁的呢
好歹也是我自己写代码爬的

少年好思路,不过笔趣阁这个鬼东西其实是腾讯的,白嫖党第一人
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-17 13:53:00 | 显示全部楼层
PLUS甲鱼 发表于 2020-6-17 13:51
少年好思路,不过笔趣阁这个鬼东西其实是腾讯的,白嫖党第一人

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-17 14:38:11 | 显示全部楼层
很强我还是个萌新加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-28 20:49:00 | 显示全部楼层
qiuyouzhi 发表于 2020-6-17 11:08
咋算我白嫖笔趣阁的呢
好歹也是我自己写代码爬的

大佬,萌新想问下,为什么直接复制代码,放到IDLE保存之后用不了呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-29 08:48:43 | 显示全部楼层
xiyi2 发表于 2020-6-28 20:49
大佬,萌新想问下,为什么直接复制代码,放到IDLE保存之后用不了呢

Ctrl+N新建一个文件再把我的代码复制进去
那些模块啥的都得安装好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-29 20:55:16 | 显示全部楼层
qiuyouzhi 发表于 2020-6-29 08:48
Ctrl+N新建一个文件再把我的代码复制进去
那些模块啥的都得安装好

不懂...看来我还需要学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-7 16:25:10 | 显示全部楼层
有一说一最近天天都是一堆人爬笔趣阁。。。要不是笔趣阁多  感觉真遭不住
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-17 19:04:32 | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-18 08:42:23 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-18 10:41:43 | 显示全部楼层
这个厉害,谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 12:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表