首页 > 其他分享 >aiohttp 异步爬虫实战

aiohttp 异步爬虫实战

时间:2023-05-25 13:11:05浏览次数:40  
标签:异步 aiohttp URL ip 爬虫 time print asyncio

想检测一下内网开放8080端口提供http服务的计算机,写了以下代码:

# 导入 requests 包
import requests,pathlib

# 发送请求
def req(ip):    
    try:
        print(ip)
        r = requests.get(ip,timeout=0.5)        
        if r.status_code == 200:            
            with pathlib.Path("1.txt").open("a") as f:
                f.write(ip+"\n") 
    except:
        pass

for i in range(1,255):
    for j in range(1,255):
        ip="http://" + "192.168."+ str(i) +"."+ str(j)+":8080"        
        req(ip)
print("完成")

然而上述代码是同步执行(写文件的用法也不对),太慢了。

 于是用改成:

import asyncio
import aiohttp,pathlib,time

CONCURRENCY = 500 #linux打开文件最大数1024,windows默认509
semaphore = asyncio.Semaphore(CONCURRENCY)
session = None
async def scrape_api(URL):
   async with semaphore:
       print(URL)
       try:
           async with session.get(URL) as response:
               await asyncio.sleep(1)              
               if response.status == 200:
                   return response
               else:
                   return None  #object int can't be used in 'await' expression
       except:
           pass
        
async def main():
   global session
   timeout = aiohttp.ClientTimeout(total=10)
   session = aiohttp.ClientSession(timeout=timeout)
   scrape_index_tasks = [asyncio.ensure_future(scrape_api(URL)) for URL in ["http://192.168."+ str(i) +"." + str(j) + ":8080" for i in range(1,255) for j in range(1,255)]]
   results = await asyncio.gather(*scrape_index_tasks)
   r2 = [r for r in results if r != None]
   print(*r2,file=open(r'./1.txt','w'))
if __name__ == '__main__':
   time_start=time.time()
   asyncio.get_event_loop().run_until_complete(main())
   time_end=time.time()
   print('耗时:',time_end-time_start)

 运行一遍大约半小时

  

参考:https://blog.csdn.net/rhx_qiuzhi/article/details/124332114

https://blog.csdn.net/weixin_38819889/article/details/108632640

标签:异步,aiohttp,URL,ip,爬虫,time,print,asyncio
From: https://www.cnblogs.com/pu369/p/17425560.html

相关文章

  • 自写爬虫工具——transfer-headers
    transfer-headers,转换请求头这两天趁有时间浅学了一下易语言,之前一直用python写工具,但python写启动软件慢,而且编译文件太大,易语言学的很浅,用中文写很不习惯,==因为经常做爬虫,经常要把请求头转换到python/代码里,每次做重复工作浪费时间,就自己写了这么个小工具,有的人会说,转换成、......
  • 多线程合集(三)---异步的那些事之自定义AsyncTaskMethodBuilder
    引言之前在上一篇文章中多线程合集(二)---异步的那些事,async和await原理抛析,我们从源码去分析了async和await如何运行,以及将编译后的IL代码写成了c#代码,以及实现自定义的Awaiter,自定义异步状态机同时将本系列的第一篇文章的自定义TaskScheduler和自定义的Awaiter......
  • 入门爬虫示例-爬取豆瓣短评
    群里有个小妹妹,让我帮她写的代码,好像是作业什么的。花了几分钟看了一下,随便写写,分享给有需要的童鞋,我用python3写的,实现的功能就是:爬取豆瓣短评,然后将数据写入本地的excel表格,数据大概有,电影名称,评分,评论人数,短评四项,稍微修改下也可以爬取其他数据。这属于入门学习的爬虫,博客里的......
  • Python 自动化爬虫利器 Playwright
    Python自动化爬虫利器PlaywrightPythonPlaywright是一个基于Node.js的自动化测试库,它支持多种浏览器(Chrome、Firefox、Safari、Edge等),并提供了一些方便的API来模拟用户在浏览器中的行为。本篇将介绍PythonPlaywright库的基本使用教程。安装首先需要安装PythonPlay......
  • Java开启异步的两种方式
    二、Java开启异步的两种方式1、注解开启:@Async1.1、配置异步的线程池必须配置异步线程池,否则异步不会生效。@EnableAsync注解:指定异步线程池。不指定默认使用:SimpleAsyncTaskExecutor线程池SimpleAsyncTaskExecutor是一个最简单的线程池,它没有任何的线程相关参数配置,它会为......
  • Python爬虫为什么需要库
    爬虫需要库是因为爬虫需要从网页中提取数据,并对数据进行处理和存储。库是一组已经封装好的工具,可以帮助爬虫快速地完成这些任务。这些库可以大大简化爬虫的开发过程,提高爬虫的效率和稳定性。Python爬虫常用的库有很多,以下是一些常用的库:1、requests:用于发送HTTP请求,获取网页内容。2......
  • 爬虫为什么会使用到代理ip?
    爬虫使用代理IP的主要目的是为了隐藏自己的真实IP地址,以避免被目标网站封禁或限制访问。如果一个爬虫频繁地向一个网站发送请求,而且每次请求的IP地址都相同,那么这个网站就有可能认为这是一种恶意行为,从而采取封禁或限制访问的措施。使用代理IP可以让爬虫在每次请求时使用不同的IP地......
  • Python多线程爬虫又来了
    Python多线程的主要好处是可以在单个程序中同时执行多个任务,从而提高应用程序的性能和效率。具体来说,多线程有以下几个优点:提高CPU利用率:通过多线程,可以更充分地利用CPU资源,尤其适用于计算密集型的任务。降低IO阻塞:对于需要等待IO操作完成的任务(如网络请求或文件读写),将它们放入......
  • 软硬件易混概念(二)同步vs异步
    1、硬件:同步时钟vs异步时钟同步时钟:同步时钟+当两个时钟间的相位是固定关系的,则可以称这两个时钟为同步时钟(synchronous+clock)。一般同源,如由同一个MMCMorPLL产生的两个时钟可以称为同步时钟。因此可以将主时钟和与之对应的衍生时钟约束成同一个时钟组。异步时钟:无法判定......
  • 新手如何学习爬虫
    作为一种常见的网络技术,网络爬虫有很多相关的资源可以帮助新手学习。以下是一些有效的学习路径和资源:1、爬虫基础知识网络爬虫的基础知识包括HTTP协议、HTML/CSS/JavaScript,以及Python等编程语言的基础语法和库等。2、掌握Python编程Python是网络爬虫最常用的编程语言之一,新......