二战《中国作物种质信息网》“异步协程“ 优化
Posted ZSYL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二战《中国作物种质信息网》“异步协程“ 优化相关的知识,希望对你有一定的参考价值。
一战:多线程
更多内容请参考:一战《中国作物种质信息网》(再也不怕没有小麦数据源了)
二战:异步协程
执着的小猪,我又回来了
定义协程:需要在方法前加上 async
同时需要安装 asyncio & aiohttp
pip install asyncio -i 清华镜像
# 爬取小麦数据,使用异步协程提高效率
# MY0:14400
"""
action: item
p: MY014200
croptype: ["粮食作物", "小麦"]
_:
"""
'''
Referer: https://www.cgris.net/query/do.php
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/93.0.4542.2 Safari/537.36
'''
import csv
import asyncio
import aiohttp
# 设置表头
fieldnames = ['库编号', '统一编号', '保存单位', '品种名称', '译名', '科名', '属名', '学名', '系谱', '育成年限', '原产地', '高程', '东经', '北纬', '来源国',
'芒', '壳色', '粒色', '冬春性', '成熟期', '穗粒数', '穗长', '株高', '千粒重', '粗蛋白', '赖氨酸', '沉淀值', '硬度', '容重', '抗旱性',
'耐涝性', '芽期耐盐', '苗期耐盐', '田间抗寒性', '人工抗寒性', '条锈严重度', '条锈反应型', '条锈普遍率', '叶锈严重度', '叶锈反应型', '叶锈普遍率',
'秆锈严重度', '秆锈反应型', '秆锈普遍率', '白粉严重度', '白粉反应型', '黄矮病', '赤霉病病穗', '赤霉病病指', '赤霉病指数', '赤霉病抗性', '根腐叶病级',
'根腐穗病级', '其它', '省', '样品类型']
# 获取csv文件
file = open('./wheat.csv', mode='a', encoding='utf-8', newline='')
# 建立一个字典写入对象,并指定列名fieldnames
csvWriter = csv.DictWriter(file, fieldnames=fieldnames)
# 写入表头
csvWriter.writeheader()
# 获取一页的小麦数据
async def getData(url, index, session):
# 请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4542.2 Safari/537.36',
'Referer': url # 防盗链
}
data = {
'action': 'item',
'p': f'MY0{index}',
'croptype': '["粮食作物", "小麦"]',
}
# 获取异步requests
async with session.post(url, headers=headers, data=data) as resp:
# 写入数据
csvWriter.writerow(await resp.json(content_type='text/html', encoding='utf-8')) # 读取内容是异步的,需要挂起
print('库编号', data['p'], '爬取完毕!')
# # 获取post请求对象
# resp = requests.post(url, headers=headers, data=data)
#
# # 写入数据
# csvWriter.writerow(resp.json())
# print('库编号', data['p'], '爬取完毕!')
async def main():
# 访问地址
url = 'https://www.cgris.net/query/o.php'
# 获取异步requests
async with aiohttp.ClientSession() as session:
tasks = []
for i in range(1482, 1520):
tasks.append(asyncio.create_task(getData(url=url, index='%05d'%i, session=session)))
await asyncio.wait(tasks)
if __name__ == '__main__':
# run协程
asyncio.run(main())
# 关闭文件流
file.close()
速度提升了!但是不是最优解。期待下次王者回归!
以上是关于二战《中国作物种质信息网》“异步协程“ 优化的主要内容,如果未能解决你的问题,请参考以下文章
python爬虫积累--------selenium+python+PhantomJS的使用