首页 > 编程语言 >python使用aiohttp通过设置代理爬取基金数据

python使用aiohttp通过设置代理爬取基金数据

时间:2023-06-15 16:33:16浏览次数:45  
标签:parse task aiohttp python 代理 results 爬取 asyncio

说到python爬虫,我们就会想到它那强大的库,很多新手小白在选择框架的时候都会想到使用Scrapy,但是仅仅停留在会使用的阶段。在实际爬虫过程中遇到反爬机制是再常见不过的,今天为了增加对爬虫机制的理解,我们就通过手动实现多线程的爬虫过程,同时引入IP代理池进行基本的反爬操作。

这里我们就以天天基金数据为实际项目,该网站具有反爬机制,同时数量足够大,多线程效果较为明显。所以这里需要使用的到的技术路线有

  • IP代理池
  • 多线程
  • 爬虫与反爬

通过基础的分析天天基金网的一些数据。经过抓包分析,可知:./fundcode_search.js包含所有基金的数据,同时,该地址具有反爬机制,多次访问将会失败甚至封IP的情况。分析完天天基金网的数据后,我们选择使用搭建IP代理池,用于反爬作用。代理池直接通过代理厂家提供就可以,有太多的代理很多同学不知道怎么选择,经过多年爬虫经验和使用代理的经验这里推荐亿牛云代理,长期使用不管是代理质量还是售后服务都是优于其他代理长家的。

搭建完IP代理池后,我们开始着手多线程爬取数据的工作。一旦使用多线程,就需要考虑到一些爬取中会出现的问题。接下来的实际就是,python使用aiohttp 通过设置代理IP获取数据的过程:

# 导入相关库
import asyncio
import aiohttp
from aiohttp_socks import ProxyConnector
from bs4 import BeautifulSoup

# 定义目标网站和代理服务器的参数
url = "http://fund.eastmoney.com/fund.html#os_0;isall_0;ft_;pt_1"
proxy = "socks5://16yun:[email protected]: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())

标签:parse,task,aiohttp,python,代理,results,爬取,asyncio
From: https://blog.51cto.com/u_13789715/6493244

相关文章

  • Nginx支持web界面执行bash|python等系统命令和脚本
    ##关闭防火墙##(centos6)serviceiptablesstopchkconfigiptablesoff##(centos7)systemctlstopfirewalldsystemctldisablefirewalld#关闭selinuxsed-i's/SELINUX=enforcing/SELINUX=disabled/'/etc/selinux/configsetenforce0#已有epel源的跳过此步骤,直接安装......
  • Python - 函数声明中的 : 和 -> 符号的含义
     函数注释包括:: 标记给函数参数打注释的意思。-> 标记给函数返回值打注释的意思。 例子:#代码:defdd(w:list)->int:returnw[0]+w[1]#调用:dd([1,2])#输出:3 解释:: 表示参数w应该传入list类型的值,但只是注释(在你的代码里,你传入其他的类型,只要代码......
  • python中列表推导式语法问题记录
    有问题代码:w=[0,1,2]e={0:[1,2],1:[3,4],2:[5,6]}r=[dimfordimine[i]foriinw]#这一段python代码有什么问题报错:Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>NameError:name'i'isnotdefined.Didyou......
  • [-003-]-Python3+Unittest+Uiautomation Windows桌面App UI自动化之控件查找
    1、获取所有的子控件:control.GetChildren()2、获取首个子控件:control.GetFirstChildControl()3、获取最后一个子控件:control.GetLastChildControl()4、获取下一个兄弟控件:control.GetNextSiblingControl()5、获取前一个兄弟控件:control.GetPreviousSiblingContr......
  • Python的map()方法如何使用?
    Python的map()方法如何使用?>>>help(map)Helponclassmapinmodulebuiltins:classmap(object)|map(func,*iterables)-->mapobject||Makeaniteratorthatcomputesthefunctionusingargumentsfrom|eachoftheiterables.Stopswhen......
  • Python项目-学生信息管理系统
    Python项目-学生信息管理系统一、功能介绍学生信息管理系统实现的功能如下:1、添加学生信息2、删除学生信息3、修改学生信息4、查询学生信息5、显示所有学生信息6、按班级查询学生信息7、退出系统二、代码实现#定义打印系统函数definfo_print():print('-------......
  • Python用字典构建多级菜单
    Python用字典构建多级菜单#key-value#字典是无序的,因为他没有下标,通过key找info={'stu01':"liuhaolai",'stu02':"wangshulin"}print(info['stu01'])info['stu03']='刘**'#若不存在该key,则直接添加info['stu04&#......
  • python unitest 文件结构
    unittest框架的文件结构可以按照以下方式组织:1.导入所需的模块和类:在测试文件的开头,需要导入unittest模块以及待测试的模块或类。2.定义测试类:使用class关键字定义一个测试类,类名通常以"Test"开头,并继承unittest.TestCase类。3.定义测试方法:在测试类中,可以定义多个......
  • 【Python】表格模块
      ......
  • Python(request)爬虫有多强大?
    requests是Python中的一种HTTP客户端库,用于发送HTTP请求并获取服务器响应。使用requests库可以轻松地进行常见的HTTP操作,如GET、POST、PUT、DELETE等,支持HTTPS和HTTP连接以及摘要验证、基本认证等身份验证方式。因此,Python的requests库是一个很棒的选择,如果您需要编写一个简单又......