美文网首页
python异步爬虫的实现过程

python异步爬虫的实现过程

作者: SunY7 | 来源:发表于2023-06-08 15:37 被阅读0次

在日常爬虫中我们会涉及到同步与异步问题,一般异步编程可以大幅度的提高系统的吞吐量,提高单位时间内发出的请求数目。之前的文章分享了些同步的知识,就是对aurl发起请求,等待响应。然后再访问burl,等待响应。。。

大量的时间消耗在等待上,如果能近似的同时对多个网址发起请求,等待响应,速度回快很多倍。其实所谓的同时也是有先后顺序的,所以叫异步。

异步爬虫的方式有以下2种

1、多线程,多进程(不建议):

好处:可以为相关阻塞的操作单独开启线程,阻塞操作就可以异步执行。弊端:无法无限制的开启多线程或者多进程。

2、线程池、进程池(适当的使用):好处:可以降低系统对进程或者线程创建和销毁的一个频率,从而很好的降低系统的开销。弊端:池中线程或进程的数量是有上限。

接下来我们通过aiohttp异步爬虫来爬取一个书籍网站的数据, https://spa5.scrape.center/,通过简单的网站分析,反爬机制不是很严,为了爬取顺

导入相关库

import asyncio
import aiohttp
from aiohttp_socks import ProxyConnector
from bs4 import BeautifulSoup

定义目标网站和代理服务器的参数

url = "https://spa5.scrape.center/"
proxy = "socks5://16yun:16ip@www.16yun.cn:11111"

定义异步函数来发送GET请求,并使用代理服务器来连接目标网站

async def fetch(session, url):
try:
async with session.get(url) as response:
# 检查响应状态码是否为200,否则抛出异常
if response.status != 200:
raise Exception(f"Bad status code: {response.status}")
# 返回响应内容的文本格式
return await response.text()
except Exception as e:
# 打印异常信息,并返回None
print(e)
return None

定义异步函数来处理响应结果,并解析HTML内容

async def parse(html):
# 如果响应结果不为空,则进行解析操作
if html is not None:
# 使用bs4库来创建BeautifulSoup对象,并指定解析器为html.parser
soup = BeautifulSoup(html, "html.parser")
# 提取网页中的标题标签,并打印其文本内容
title = soup.find("title")
print(title.text)
else:
# 否则打印None表示无效结果
print(None)

定义异步函数来统计成功次数,并打印结果

async def count(results):
# 初始化成功次数为0
success = 0
# 遍历所有的结果,如果不为空,则增加成功次数,否则跳过
for result in results:
if result is not None:
success += 1
# 打印总共的请求数和成功次数
print(f"Total requests: {len(results)}")
print(f"Success requests: {success}")

定义异步主函数来创建并运行多个协程任务,并控制并发数量和超时时间等参数

async def main():
# 创建一个aiohttp_socks.ProxyConnector对象,用来设置代理服务器的参数
connector = ProxyConnector.from_url(proxy)
# 创建一个aiohttp.ClientSession对象,用来发送HTTP请求,并传入connector参数
async with aiohttp.ClientSession(connector=connector) as session:
# 创建一个空列表,用来存储所有的协程任务
tasks = []
# 循环10000次,每次创建一个fetch函数的协程任务,并添加到列表中
for i in range(10000):
task = asyncio.create_task(fetch(session, url))
tasks.append(task)

    # 使用asyncio.gather函数来收集并执行所有的协程任务,并返回一个包含所有结果的列表        
    results = await asyncio.gather(*tasks)
    
    # 创建一个空列表,用来存储所有的解析任务        
    parse_tasks = []
    
     for result in results:
         parse_task = asyncio.create_task(parse(result))
         parse_tasks.append(parse_task)
         
     await asyncio.gather(*parse_tasks)   
     
     await count(results)

在程序入口处调用异步主函数,并启动事件循环

if name == "main":
asyncio.run(main())

相关文章

  • 干货 | Python爬虫学习路线,小白都能学会!

    一条学习路线,能让你更加精准、高效地学会Python爬虫! 学习 Python 包并实现基本的爬虫过程 大部分爬虫...

  • Scrapy

    Scrapy概述 Scrapy 是一个基于 Twisted 的异步处理框架,是纯 Python 实现的爬虫框架,其...

  • 爬虫框架scrapy总结

    scrapy简介: scrapy是一个基于Twisted的异步处理框架,是纯python实现的爬虫框架,其架构清晰...

  • scrapy总结

    scrapy简介: scrapy是一个基于Twisted的异步处理框架,是纯python实现的爬虫框架,其架构清晰...

  • Scrapy 框架学习(一):框架介绍

    Scrapy 是一个基于 Twisted 的异步处理框架,是纯 Python 实现的爬虫框架,其架构清晰,模块之间...

  • Python Scraping ———09.24.2017

    -非常好的介紹python 爬蟲入門 - 基于协程、异步IO的python爬虫 - python爬虫的最佳实践(六...

  • python爬虫框架Scrapy

    爬虫框架Scrapy(一) 框架Scrapy是使用python实现的一个爬取网站数据、提取数据的异步网络框架,加快...

  • Scrapy爬虫框架:安装和开始新项目

    Scrapy 是一套基于基于Twisted的异步处理框架,纯python实现的爬虫框架,只需要定制开发几个模块就可...

  • python爬虫-scrapy

    简介 Scrapy 是一套基于基于Twisted的异步处理框架,纯python实现的爬虫框架,用户只需要定制开发几...

  • Python学习笔记-第20天: 异步爬虫(1)

    第二十天 异步爬虫(1) 今天计划用Python开发一套异步爬虫框架用来补充blog内容,学习项目及练习源码地址:...

网友评论

      本文标题:python异步爬虫的实现过程

      本文链接:https://www.haomeiwen.com/subject/rtlaedtx.html