首页 > 其他分享 >笔趣阁分布式flask爬虫

笔趣阁分布式flask爬虫

时间:2022-11-06 17:13:47浏览次数:75  
标签:task name flask 爬虫 url coll 笔趣

通过flask+mongo+requests实现一个主从分布式爬虫

一:分布式爬虫介绍
1、对等分布式:每台机器上的的爬虫都一致
  • 无论那台机器掉线,都不会影响其他机器的爬虫
  • 可以根据需求动态的增/删计算机和爬虫的数量

试用场景:非递进关系网站

2、主从分布式:不同的机器类型做不同的动作,例如主机器只做详情url的提取,从机器只做详情页的解析
  • 分工明确,有效的控制资源消耗

试用场景:递进关系的网站

二:本程序实现构想

读书网站为目录页+书本章节页+内容页,因此主从的分布式架构比较适合

整体架构如图所示:

本例中的数据存储通过flask来转换进行,从机不需要安装mongo,只需要能访问主机开启的flask就行

3、实现(以目录页爬虫为例)

爬虫的代码比较简单就不放了。有兴趣的可以去github上找

关键说说怎么通过了flask将所有的访问的数据进行存储。

首先在主机上开启flask的服务,服务中有:插入任务、插入数据等接口

@app.route('/insert_task', methods=['POST'])
def insert_task():
    """
    当存在url时不更新
    @return:
    """
    rj = request.get_json()
    coll_name = rj['coll_name']
    data = rj['data']
    if not db[coll_name].find_one({'url': data['url']}):
        db[coll_name].insert_one(data)
    return 'OK'

在每个从机中需要插入数据的时候,进行一层调用,原本直接存储的数据,通过flask来进行指定存储。

            for item in items:
                novel_url = item.xpath('./li[@class="two"]/a/@href')[0]
                name = item.xpath('./li[@class="two"]/a/text()')[0][:-4]
                catalog = {
                    "name": name,
                    "url": novel_url
                }
                # 数据插入点,调用的是下面函数
                insert_task("catalog_task", catalog)
def insert_task(coll_name, task, logger=None):
    """
    通过控制不同的coll_name实现对不同集合的写入
    @param coll_name:
    @param task:
    @param logger:
    @return:
    """
    while True:
        try:
            url = '{}/insert_task'.format(HOST)
            data = {
                'coll_name': coll_name,
                'data': task
            }
            res = requests.post(url, json=data)
            if res.status_code != 200:
                raise Exception('status_code:{}'.format(res.status_code))
            break
        except Exception as e:
            trace = traceback.format_exc()
            info = 'error:{},trace:{}'.format(str(e), trace)
            logger.error(info)
            time.sleep(5)
4、效果展示

catalog为目录集合,catalog_task,为目录任务集合,novels为章节信息集合,novels_task为章节信息任务集合,chapter为章节内容集合。

github地址:https://github.com/tuhou/spider_practice

标签:task,name,flask,爬虫,url,coll,笔趣
From: https://www.cnblogs.com/FlowerNotGiveYou/p/16863034.html

相关文章

  • Flask简易使用教程
    创建应用fromflaskimportFlaskapp=Flask(__name__)URL方法URL方法不带参数@app.route('/')defhello_world():return'Hello,World!'URL方法带参数通......
  • flask
    RuntimeError:Workingoutsideofapplicationcontext.Thistypicallymeansthatyouattemptedtousefunctionalitythatneededthecurrentapplication.Tosolve......
  • Python 爬虫之多进程
    网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、......
  • 20行代码简单python爬虫,爬虫实例
    函数介绍 函数功能简单介绍 库函数介绍 importrequests#请求网页fromlxmlimportetree#对网页进行解析函数功能介绍  函数1 defgetdata(url):......
  • Python 爬虫之多线程
    网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、......
  • 3、爬虫常用的基础内置模块
    """#time模块importtimet=time.tiem()#返回时间戳time.sleep(10)#设置程序休眠,单位秒""""""#os模块importosos.makedirs('文件路径')#创建文件......
  • 爬虫 - demo
    #-*-coding=utf-8-*-#@Time:20:55#@Author:zzc#@File:spider.py#@Software:PyCharmimporturllib.requestfrombs4importBeautifulSoupimportopenp......
  • 12.认识爬虫
    爬虫概念概念网络爬虫也叫网络蜘蛛,特指一类自动批量下载网络资源的程序,这是一个比较口语化的定义。更加专业和全面对的定义是:网络爬虫是伪装成客户端与服务端进行数据......
  • 【Web开发】Python实现Web图表功能(pyecharts,Flask)
    <fontcolor=purpleface=华文行楷size="5">"柳丝榆荚自芳菲,不管桃飘与李飞;"1、简介APythonEchartsPlottingLibrary.ApacheEcharts是一个由百度开源的数据可视化......
  • 为什么说高匿的HTTP代理是爬虫过程中必须的
    不少人在选择代理套餐的时候,追求低成本,选择的HTTP代理套餐也是五花八门,但唯一的要求就是要便宜,能有多便宜就要有多便宜,以致于直接选择一般的透明代理也在所不惜。透明......