【12.8】asyncio高并发爬虫
时间:2019-08-24
本文章向大家介绍【12.8】asyncio高并发爬虫,主要包括【12.8】asyncio高并发爬虫使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # asyncio爬虫、去重、入库 4 5 import asyncio 6 import re 7 8 import aiohttp 9 import aiomysql 10 from pyquery import PyQuery 11 from aiohttp import TCPConnector 12 13 14 start_url = 'http://www.xbiquge.la/paihangbang/' 15 waitting_urls = [] 16 seen_urls = set() 17 stopping = False 18 19 sem = asyncio.Semaphore(3) 20 21 22 async def fetch(url, session): 23 async with sem: 24 try: 25 async with session.get(url) as resp: 26 print('url status: {}'.format(resp.status)) 27 if resp.status in [200, 201]: 28 data = await resp.text() 29 return data 30 except Exception as e: 31 print(e) 32 33 34 def extract_urls(html): 35 pq = PyQuery(html) 36 for link in pq.items('a'): 37 url = link.attr('href') 38 if url and url.startswith('http') and url not in seen_urls: 39 global waitting_urls 40 waitting_urls.append(url) 41 42 43 async def init_urls(url, session): 44 html = await fetch(url, session) 45 seen_urls.add(url) 46 extract_urls(html) 47 48 49 async def article_handle(url, session, pool): 50 # 获取文章详情并解析入库 51 html = await fetch(url, session) 52 seen_urls.add(url) 53 extract_urls(html) 54 pq = PyQuery(html) 55 title = pq("title").text() 56 # title = title + '\n' 57 async with pool.acquire() as conn: 58 async with conn.cursor() as cur: 59 insert_sql = "INSERT INTO article_test VALUES('{}')".format(title) 60 print(insert_sql) 61 await cur.execute(insert_sql) 62 # 文件操作 63 # with open('aiohttp_spider.txt', mode='a', encoding='utf-8') as file_object: 64 # file_object.write(title) 65 66 67 async def consumer(pool, session): 68 while not stopping: 69 if len(waitting_urls) == 0: 70 await asyncio.sleep(0.5) 71 continue 72 73 url = waitting_urls.pop() 74 print('start get url: {}'.format(url)) 75 if re.match('http://www.xbiquge.la/\d+/\d+/', url): 76 if url not in seen_urls: 77 asyncio.ensure_future(article_handle(url, session, pool)) 78 else: 79 if url not in seen_urls: 80 asyncio.ensure_future(init_urls(url, session)) 81 82 83 async def main(loop): 84 # 等待mysql连接建立好 85 pool = await aiomysql.create_pool(host='127.0.0.1', port=3306, 86 user='root', password='123456', 87 db='aiomysql_test', loop=loop, 88 charset='utf8', autocommit=True) 89 90 session = aiohttp.ClientSession() 91 html = await fetch(start_url, session) 92 seen_urls.add(start_url) 93 extract_urls(html) 94 95 asyncio.ensure_future(consumer(pool, session)) 96 97 98 if __name__ == '__main__': 99 loop = asyncio.get_event_loop() 100 asyncio.ensure_future(main(loop)) 101 loop.run_forever()
原文地址:https://www.cnblogs.com/zydeboke/p/11405336.html
- Android中如何动态的实现设置全屏和退出全屏
- Android 双进程Service常驻后台,无惧“一键清理”
- Android之捕获TextView超链接
- 自封装Android软键盘工具类ImeUtil
- XSS挑战第一期Writeup
- 安全公司新星Aorato推出“行为防火墙”
- 倍数提高工作效率的 Android Studio 奇技
- xss如何加载远程js的一些tips
- Android中如何实现图文混排
- Jenkins 创始人:持续交付的 What、Why 及 How
- Android中如何提取和生成mp4文件
- 两张图片告诉你为什么域名会被解析到65.49.2.178
- 【有人@我】Android中高亮变色显示文本中的关键字
- 一个简单易用的 Android 导航栏TitleBar
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一文学会哈希法解题
- 一小时彻底掌握stm32中断。
- Python 爬虫进阶必备 | 关于某虚拟币网站加密签名的分析(难度0.1)
- PHP中的数据库连接持久化
- ClickHouse王炸功能即将来袭?
- 搭建Amoeba实现MySQL主从数据库读写分离
- 如何在centos7上看墙外的世界
- 远程仓库的使用
- 破解某交(y)友(p)app的VIP&&半自动im机器人
- 关于compareTo使用的几种情况
- 高通量数据中批次效应的鉴定和处理(二)
- 通过ansible管理docker容器
- HBASE 技术细节 读取与写入 Region Split与合并介绍
- django2.2+Daphne+nginx+supervisor 生产环境部署
- Python 爬虫进阶必备 | 趣解某不可逆加密(短文警告)