13.8 asyncio高并发爬虫

2023-10-27

# asyncio爬虫、去重、入库

import asyncio
import re

import aiohttp
import aiomysql
from pyquery import PyQuery
from aiohttp import TCPConnector


start_url = 'http://www.xbiquge.la/paihangbang/'
waitting_urls = []
seen_urls = set()
stopping = False

sem = asyncio.Semaphore(3)


async def fetch(url, session):
    async with sem:
        try:
            async with session.get(url) as resp:
                print('url status: {}'.format(resp.status))
                if resp.status in [200, 201]:
                    data = await resp.text()
                    return data
        except Exception as e:
            print(e)


def extract_urls(html):
    pq = PyQuery(html)
    for link in pq.items('a'):
        url = link.attr('href')
        if url and url.startswith('http') and url not in seen_urls:
            global waitting_urls
            waitting_urls.append(url)


async def init_urls(url, session):
    html = await fetch(url, session)
    seen_urls.add(url)
    extract_urls(html)


async def article_handle(url, session, pool):
    # 获取文章详情并解析入库
    html = await fetch(url, session)
    seen_urls.add(url)
    extract_urls(html)
    pq = PyQuery(html)
    title = pq("title").text()
    # title = title + '\n'
    async with pool.acquire() as conn:
        async with conn.cursor() as cur:
            insert_sql = "INSERT INTO article_test VALUES('{}')".format(title)
            print(insert_sql)
            await cur.execute(insert_sql)
    # 文件操作
    # with open('aiohttp_spider.txt', mode='a', encoding='utf-8') as file_object:
    #     file_object.write(title)


async def consumer(pool, session):
    while not stopping:
        if len(waitting_urls) == 0:
                await asyncio.sleep(0.5)
                continue

        url = waitting_urls.pop()
        print('start get url: {}'.format(url))
        if re.match('http://www.xbiquge.la/\d+/\d+/', url):
            if url not in seen_urls:
                asyncio.ensure_future(article_handle(url, session, pool))
        else:
            if url not in seen_urls:
                asyncio.ensure_future(init_urls(url, session))


async def main(loop):
    # 等待mysql连接建立好
    pool = await aiomysql.create_pool(host='127.0.0.1', port=3306,
                                      user='root', password='123456',
                                      db='aiomysql_test', loop=loop,
                                      charset='utf8', autocommit=True)

    session = aiohttp.ClientSession()
    html = await fetch(start_url, session)
    seen_urls.add(start_url)
    extract_urls(html)

    asyncio.ensure_future(consumer(pool, session))


if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    asyncio.ensure_future(main(loop))
    loop.run_forever()


学习视频

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

13.8 asyncio高并发爬虫 的相关文章

  • 如何替换 Pandas Dataframe 中不在列表中的所有值? [复制]

    这个问题在这里已经有答案了 我有一个值列表 如何替换 Dataframe 列中不在给定值列表中的所有值 例如 gt gt gt df pd DataFrame D ND D garbage columns S gt gt gt df S 0
  • 使用 MongoDB 作为我们的主数据库,我应该使用单独的图数据库来实现实体之间的关系吗?

    我们目前正在为一家专业公司内部实施类似 CRM 的解决方案 由于存储信息的性质以及信息的不同值和键 我们决定使用文档存储数据库 因为它完全适合目的 在本例中我们选择 MongoDB 作为此 CRM 解决方案的一部分 我们希望存储实体之间的关
  • Pandas set_levels,如何避免标签排序?

    我使用时遇到问题set levels多索引 from io import StringIO txt Name Height Age Metres A 1 25 B 95 1 df pd read csv StringIO txt heade
  • Python - 比较同一字典中的值

    我有一本字典 d Trump MAGA FollowTheMoney Clinton dems Clinton Stein FollowTheMoney Atlanta 我想删除字符串列表中的重复字符串 该字符串是键的值 对于这个例子 期望
  • Gunicorn 工作人员无论如何都会超时

    我正在尝试通过gunicorn运行一个简单的烧瓶应用程序 但是无论我做什么 我的工作人员都会超时 无论是否有针对应用程序的活动 工作人员在我设置任何内容后总是会超时timeout值到 是什么导致它们超时 当我发出请求时 请求成功通过 但工作
  • 使用主题交换运行多个 Celery 任务

    我正在用 Celery 替换一些自制代码 但很难复制当前的行为 我期望的行为如下 创建新用户时 应向tasks与交换user created路由键 该消息应该触发两个 Celery 任务 即send user activate email
  • 在 Django Admin 中调整字段大小

    在管理上添加或编辑条目时 Django 倾向于填充水平空间 但在某些情况下 当编辑 8 个字符宽的日期字段或 6 或 8 个字符的 CharField 时 这确实是一种空间浪费 字符宽 然后编辑框最多可容纳 15 或 20 个字符 我如何告
  • Python 3d 绘图设置固定色阶

    我正在尝试绘制两个 3d 数组 第一个数组的 z 值在范围内 0 15 0 15 第二个来自 0 001 0 001 当我绘图时 色标自动遵循数据范围 如何设置自定义比例 我不想看到 0 001 的浅色 而应该看到 0 15 的浅色 如何修
  • 更好地相当于这个疯狂的嵌套 python for 循环

    for a in map for b in map a for c in map b for d in map c for e in map d print a b c d e 上面的代码用于创建图中一定长度的所有路径 map a 表示从
  • 如何将特定范围内的标量添加到 numpy 数组?

    有没有一种更简单 更节省内存的方法可以单独在 numpy 中执行以下操作 import numpy as np ar np array a l r ar c a a 0 l ar tolist a r 它可能看起来很原始 但它涉及获取给定数
  • 使用 python/numpy 重塑数组

    我想重塑以下数组 gt gt gt test array 11 12 13 14 21 22 23 24 31 32 33 34 41 42 43 44 为了得到 gt gt gt test2 array 11 12 21 22 13 14
  • 导入错误:没有名为flask.ext.login的模块

    我的flask login 模块有问题 我已经成功安装了flask login模块 另外 从命令提示符我可以轻松运行此脚本 不会出现错误 Python 2 7 r27 82525 Jul 4 2010 07 43 08 MSC v 1500
  • 嵌套作用域和 Lambda

    def funct x 4 action lambda n x n return action x funct print x 2 prints 16 我不太明白为什么2会自动分配给n n是返回的匿名函数的参数funct 完全等价的定义fu
  • 当字段是数字时怎么说...在 mongodb 中匹配?

    所以我的结果中有一个名为 城市 的字段 结果已损坏 有时它是一个实际名称 有时它是一个数字 以下代码显示所有记录 db zips aggregate project city substr city 0 1 sort city 1 我需要修
  • 如何将 ascii 值列表转换为 python 中的字符串?

    我在 Python 程序中有一个列表 其中包含一系列数字 这些数字本身就是 ASCII 值 如何将其转换为可以在屏幕上回显的 常规 字符串 您可能正在寻找 chr gt gt gt L 104 101 108 108 111 44 32 1
  • 如何以正确的方式为独立的Python应用程序制作setup.py?

    我读过几个类似的主题 但还没有成功 我觉得我错过或误解了一些基本的事情 这就是我失败的原因 我有一个用 python 编写的 应用程序 我想在标准 setup py 的帮助下进行部署 由于功能复杂 它由不同的 python 模块组成 但单独
  • 如何使用 Boto3 启动具有 IAM 角色的 EC2 实例?

    我无法弄清楚如何使用指定的 IAM 角色在 Boto3 中启动 EC2 实例 以下是迄今为止我如何成功创建实例的一些示例代码 import boto3 ec2 boto3 resource ec2 region name us west 2
  • 如何将 Django 中的权限添加到模型并使用 shell 进行测试

    我在模型中添加了 Meta 类并同步了数据库 然后在 shell 中创建了一个对象 它返回 false 所以我真的无法理解错误在哪里或者缺少什么是否在其他文件中可能存在某种配置 class Employer User Employer in
  • 等待子进程使用 os.system

    我用了很多os system在 for 循环内调用创建后台进程 如何等待所有后台进程结束 os wait告诉我没有子进程 ps 我使用的是Solaris 这是我的代码 usr bin python import subprocess imp
  • python 对浮点数进行不正确的舍入

    gt gt gt a 0 3135 gt gt gt print 3f a 0 314 gt gt gt a 0 3125 gt gt gt print 3f a 0 312 gt gt gt 我期待 0 313 而不是 0 312 有没有

随机推荐

  • python3GUI--在线小说播放器By:PyQt5(附ui源码)

    文章目录 一 准备工作 1 PyQt5 2 qtawesome 3 QMediaPlayer 4 LAVFilters 二 预览 1 启动 2 查看小说详情 播放小说 3 搜索后播放 4 动态演示 三 设计流程 1 UI设计 2 整体流程设
  • pycharm自带python解释器吗,如何设置默认PyCharm解释器?

    My PyCharm installation has two interpreters available Python 3 3 2 usr bin python3 3m Python 2 7 5 usr bin python2 7 Wh
  • docker获取镜像image id命令_Docker之镜像和容器基础操作命令

    本篇文章是介绍镜像 image 和 容器 container 的基础操作命令 后直接使用英文 image 和 container 替代 首先来讲解释一下 image 和 container 的关系 image 概念 image 就是我们从
  • Blender 建模案例一(1)

    目录 1 指环 1 1 创建一个柱体 1 2 柱体微调 1 3 缩放 1 4 应用缩放 1 5 物体属性回归默认 1 6 进入编辑模式 1 7 内插面 1 8 桥接循环边 1 9 添加表面细分修改器 1 10 平滑着色 1 11 添加环切
  • LTH7锂电池充电IC

    LTH7是一个完善的单片锂离子电池恒流 恒压线形电源管理芯片 它薄的尺寸和小的外包装使它便于便携应用 更值得一提的是 LTH7专门设计适用于USB的供电规格 得益于内部的MOSFET 结构 在应用上不需要外部电阻 和阻塞二极管 在高能量运行
  • libsvm相关变量总结以及libsvm 参数粗调、微调技巧 和PCA主成分分析princomp函数的使用

    libsvm搭建的支持向量机运行起来 在命令行里会蹦出很多变量 开始的时候 我不以为意 现在想想这样糊弄 到最后还是稀里糊涂 不如一次总结 当做日后的复习资料 运行起来会出现这些 1 变量总结 optimization finished i
  • 点击移除样式,再点击新增样式jq代码

    点击增加样式 再点击移除样式的jq function exam back click function if exam back hasClass exam modf5 exam back removeClass exam modf5 el
  • 什么是ui/ux

    目录 前言 1 图形元素 2 布局 3 颜色和视觉效果 4 动画和过渡效果 5 6 用户体验 User Experience UX 7 响应式设计 Responsive Design 8 可用性 Usability 9 信息架构 Infor
  • python firefly 游戏引擎 教程(一) 程序入口

    程序基本结构 程序的基本流程 firefly 基本程序流程如上所示 首先通过master模块分别启动 gate 网关 db 数据库相关 net 网络 chat 聊天 game 游戏逻辑 模块 然后各个模块分别调用initconfig进行初始
  • 入门指南:深入解析OpenCV的copyTo函数及其与rect的应用场景

    文章目录 导言 copyTo函数的示例 copyTo函数与rect的应用场景 结论 导言 OpenCV是一个功能强大的开源计算机视觉库 广泛应用于图像处理和计算机视觉任务 在OpenCV中 copyTo函数是一个重要的图像处理函数 它允许我
  • JAVA-final关键字和接口

    1 Final 关键字 final 关键字代表最终的 不可改变的 final 可以修饰变量 包括类属性 对象属性 局部变量和形参 方法 包括类方法和对象方法 和类 final修饰类 即代表它不能有儿子类 不能被继承 final修饰类 方法
  • Matlab 中 global 全局变量用法

    用法 在主函数里面 你需要设置 a 这个变量是一个全局变量 就需要声明一下 global a 然后在子函数里面你又用到了 a 这个全局变量 你需要在子函数里面再次声明 global a 这样在子函数中 就可以使用 a 这个全局变量了 不用在
  • 插入数据库喊单双引号解决方案(python)

    记录一下最近在写python 将数据持久化时 数据含单引号 双引号问题 数据库中有这样一张表 CREATE TABLE test test id INT NOT NULL AUTO INCREMENT article VARCHAR 45
  • 【VTK】可拖动的坐标轴MovableAxesWidget

    VTK 可拖动的坐标轴MovableAxesWidget 一直想从头写一个vtkWidget来了解vtk 这两天晚上比较空 正好自己选一个交互实现下 vtk官网有一个可以拖动轴的例子MovableAxes 可惜AxesActor继承自Pro
  • ansible playbook的使用

    一 playbook的使用 1 ansible的playbook与临时命令 临时命令可以对一组目标主机进行一项简单的任务 要发挥ansible的真正力量 还需要了解如何使用playbook轻松的对一组目标主机执行多项复杂的任务 playbo
  • 解决centos7 中 使用mariadb 安装mysql不成功的问题

    按照openstack官网的步骤安装openstack Install and configure components Install the packages yum install mariadb mariadb server pyt
  • 无需第三者的交换

    a i a i a index a index a i a index a i a i a index 无需第三者的交换
  • IDEA的使用

    文章目录 2 IDEA的使用 2 1 工具栏 2 2 启动IDEA选择项目 2 3 IDEA重启 2 4 自动提示区分大小写 2 5 tomcat启动中文乱码 2 5 1 修改tomcat 2 5 2 修改IDEA 2 6 jsp改变需要重
  • Alibaba Java Coding Guidelines,Java开发规范IDEA插件

    阿里巴巴Java开发规约 让开发者更加方便 快速将代码规范起来 Alibaba Java Coding Guidelines 是阿里巴巴基于手册内容 研发的一套自动化的IDE检测插件 IDEA Eclipse 安装步骤如下 1 打开 IDE
  • 13.8 asyncio高并发爬虫

    asyncio爬虫 去重 入库 import asyncio import re import aiohttp import aiomysql from pyquery import PyQuery from aiohttp import