吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3055|回复: 15
收起左侧

[Python 转载] 将在线观看的小说爬取到本地的爬虫

[复制链接]
事燃cs释然 发表于 2020-9-18 21:22
本帖最后由 事燃cs释然 于 2020-9-18 21:29 编辑

之前发布过一个功能差不多的爬虫程序,不过写的比较粗陋,现在把代码该删删,该换换,最后将代码进行了模块化,最终成型了下面的代码:
运行顺序:
1、main.py:获取用户输入的目录页地址
2、chapterList.py:解析所有的章节名及章节所在地址
2.1、query.py:判断该小说是否已经保存
3、chapter.py:解析每个章节内容
4、save.py:保存解析出来的数据


1、main.py:
[Python] 纯文本查看 复制代码
import chapterList

def main():
    url = input("请输入小说目录页地址:")
    book = chapterList.classify(url)
    input("保存结束!请点击任意键退出")

if __name__ == '__main__':
    main()


2、chapterList.py
[Python] 纯文本查看 复制代码
#解析整本书的章节名及章节地址

from lxml import etree
import requests
import chapter
import query

HEADER = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36'
}

#解析规则
rules = {
    "xbiquge":{
        "title":'//div[@id="list"]//dd//text()',
        "urlList":'//div[@id="list"]//dd/a/@href',
        "book_name":'//div[@id="info"]//h1/text()',
        "realm":"http://www.xbiquge.la/",
        "code":"utf-8"
    },
    "dawen":{
        "title":'//ul[@id="listsss"]//a/text()',
        "urlList":'//li[@id="chapter"]//a/@href',
        "book_name":'//div[@class="top"]//h3//text()',
        "realm":"",
        "code":"utf-8"
    },
    "biquge":{
        "title":'//div[@id="list"]//dd//text()',
        "urlList":'//div[@id="list"]//dd/a/@href',
        "book_name":'//div[@id="info"]//h1/text()',
        "realm":"",
        "code":"utf-8"
    }
}
#判断网站,识别运行哪一种解析规则
def classify(url):
    for web in rules:
        if rules[web]["realm"] == "":rules[web]["realm"] = url
    webName = url.split(".")[1]
    begin = False
    for i in rules:
        if webName == i:
            begin = True
    if begin:return analysis(webName,url)
    else:
        print("链接错误或暂不支持该网站,可前往论坛反馈,要求楼主添加!!!")
        return


#进行解析,获取章节名和章节链接
def analysis(webName,url):
    html = etree.HTML(requests.get(url,HEADER).content.decode(rules[webName]['code']))
    title = html.xpath(rules[webName]['title'])
    urlList = html.xpath(rules[webName]['urlList'])
    book_name = html.xpath(rules[webName]['book_name'])[0]
    #判断,判断该小说是否保存过
    query_all = query.query(book_name,title,urlList)
    store_old = []
    if query_all:
        title = query_all["title"]
        urlList = query_all["urlList"]
        store_old = query_all["store"]
    print("小说名称:%s"%book_name)
    print("小说章节:%d章"%(len(title)+len(store_old)))
    print("已存章节:%d章"%len(store_old))
    if input("是否开始保存?(y/n):") == "n":return
    print("-----开始保存-----")
    realm = rules[webName]['realm']
    store_all = []
    for i in range(len(title)):
        store = {
            "title":title[i],
            "urlList":realm+urlList[i]
        }
        store_all.append(store)
    chapter.classify(book_name,webName,store_all,store_old)


2.1、query.py
[Python] 纯文本查看 复制代码
#查找文件列表,判断是否保存过该小说,若保存过则从记录开始

import json
import os

def query(book_name,title,urlList):
    if os.path.isfile("%s.js"%book_name):
        with open('%s.js'%book_name,'r',encoding='utf-8')as fp:
            store = json.load(fp)
        index = 0
        for i in store:
            for y in range(len(title)):
                if i['title'] == title[y]:
                    index = y+1
        del title[:index]
        del urlList[:index]
        query_all = {
            "title":title,
            "urlList":urlList,
            "store":store
        }
        return query_all
    return False


3、chapter.py
[Python] 纯文本查看 复制代码
#解析每一个章节中的内容

from lxml import etree
import requests
import save

HEADER = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36'
}

store_save = []

def classify(book_name,webName,store,store_old):
    global store_save
    store_save = store_old
    for i in range(len(store)):
        title = store[i]['title']
        urlList = store[i]['urlList']
        analysis(webName,book_name,title,urlList)
    save.save(book_name,store_save)

#解析规则
rules = {
    "xbiquge":{
        "chapter":'//div[@id="content"]/text()',
        "code":"utf-8"
    },
    "dawen":{
        "chapter":'//div[@class="art_con"]/dd[not(@data-id="999")]//text()',
        "code":"utf-8"
    },
    "biquge":{
        "chapter":'//div[@id="content"]/text()',
        "code":"utf-8"
    }
}

#解析每个章节的内容
def analysis(webName,book_name,title,urlList):
    html = etree.HTML(requests.get(urlList,HEADER).content.decode(rules[webName]['code']))
    chapter = html.xpath(rules[webName]['chapter'])
    if chapter == []:
        analysis(webName,book_name,title,urlList)
        return
    chapter_cont = ''
    for i in chapter:
        if len(i) >= 2:
            chapter_cont = chapter_cont + "\n" + i.strip()
    storeList = {
        "title":title,
        "store":chapter_cont
    }
    store_save.append(storeList)
    save.save(book_name,store_save)
    print(title+"----保存成功")
    return store_save


4、save.py
[Python] 纯文本查看 复制代码
#将解析获得的章节名及章节内容保存

import json

def save(book_name,store):
    with open("%s.js"%book_name,"w",encoding='utf-8') as fp:
        json.dump(store,fp,ensure_ascii=False)
    with open("%s.txt"%book_name,"w",encoding='utf-8')as fp:
        for i in store:
            fp.write(i["title"])
            fp.write(i["store"]+'\n')


最后附上打包好的程序的帖子链接:https://www.52pojie.cn/forum.php?mod=viewthread&tid=1265020&page=1#pid34083564

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
幽静的风 + 1 + 1 谢谢@Thanks!
mdr + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

头像被屏蔽
vip1028 发表于 2020-9-18 21:59
提示: 该帖被管理员或版主屏蔽
幽静的风 发表于 2020-9-19 21:20
今天用了2.0的感觉很稳定,一上午没出错,下午只是到 儒道至圣:2475出错了。然后下了2.02,卡在http://www.xbiquge.la//0/119/6124663.html
请输入小说目录页地址:http://www.xbiquge.la//0/119/
小说名称:儒道至圣
小说章节:3927章
已存章节:2475章
是否开始保存?(y/n):
-----开始保存-----
http://www.xbiquge.la//0/119/6124663.html
http://www.xbiquge.la//0/119/6124663.html
http://www.xbiquge.la//0/119/6124663.html
http://www.xbiquge.la//0/119/6124663.html
http://www.xbiquge.la//0/119/6124663.html
不夜不夜 发表于 2020-9-18 21:38
yjn866y 发表于 2020-9-18 21:48
不错,,谢谢分享
丿小坤 发表于 2020-9-18 21:48
挺好的,感谢分享
honghai0119 发表于 2020-9-18 21:55
打包好的程序最适合我了
HuangQiguang 发表于 2020-9-18 21:58
支持支持
幽静的风 发表于 2020-9-19 09:28
楼主强大
更新后十分好用,要是能增加一些功能就好了,仅个人建议。
1、保存以前下载的未完结网址,下次继续下载时不用再从网站上搜索,可以另存一个文件,最好是目录形式的。
2,下载以后文件可以新建文件,名出现序号,可以分出哪个是新下载的。
幽静的风 发表于 2020-9-19 10:20
才发现与楼主同一天注册的52,然小白还是小白,楼主已经强大了
 楼主| 事燃cs释然 发表于 2020-9-19 11:43
本帖最后由 事燃cs释然 于 2020-9-19 11:51 编辑
幽静的风 发表于 2020-9-19 09:28
楼主强大
更新后十分好用,要是能增加一些功能就好了,仅个人建议。
1、保存以前下载的未完结网 ...

这个功能其实我已经写了,只是没有新建一个文件,而是直接覆盖的,具体代码你可以看一下2.1、query.py,它就是实现这个功能的模块。
至于目录的形式,你如果使用了,你应该会发现我还保存了一个js文件,里面由章节名和章节内容组成的一个json,只需要读取一下就可以把所有的已保存的章节名称获取出来,我判断是否有保存过也是靠这个判断的
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-4 03:16

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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