python爬虫实战之异步爬取数据


文章目录

  • 前言
  • 一、需求
  • 二、使用步骤
    • 1.思路
    • 2.引入库
    • 3.代码如下
  • 总结

前言

python中异步编程的主要三种方法:回调函数、生成器函数、线程大法。
以进程、线程、协程、函数/方法作为执行任务程序的基本单位,结合回调、事件循环、信号量等机制,以提高程序整体执行效率和并发能力的编程方式。
如果在某程序的运行时,能根据已经执行的指令准确判断它接下来要进行哪个具体操作,那它是同步程序,反之则为异步程序。(无序与有序的区别)
同步/异步、阻塞/非阻塞并非水火不容,要看讨论的程序所处的封装级别。例如购物程序在处理多个用户的浏览请求可以是异步的,而更新库存时必须是同步的。
优点:异步操作无须额外的线程开销,并且使用回调的方式进行处理。在设计良好的情况下,处理函数可以不必使用共享变量(即使无法完全不使用共享变量,至少可以减少共享变量的数量),减少了死锁的可能性。
缺点:异步编程复杂度较高,且难以调试。最大的问题在于回调,这增加了软件上的设计难度


一、需求

  • 使用 asyncio 和 aiohttp 模块来异步爬取数据
  • 控制异步的并发量
  • 爬取页面的数据

二、使用步骤

1.思路

  • 访问网站分析要爬取的数据
  • 通过异步来实现一次访问所有要爬取的页面来获取数据
  • 设置一个控制异步一次访问的数据

代码如下(示例):

2.引入库

代码如下(示例):

import asyncio
import aiohttp
import json
import time
import requests
import re
from lxml import etree
import datetime

3.代码如下

代码如下(示例):

import asyncio
import aiohttp
import json
import time
import requests
import re
from lxml import etree
import datetimeCONCURRENCY = 5
headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9','Accept-Encoding': 'gzip, deflate, br','Accept-Language': 'zh-CN,zh;q=0.9','Cache-Control': 'no-cache','Connection': 'keep-alive','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36',
}
# URL = 'http://127.0.0.1:30328'
#  asyncio 的 Semaphore 来控制并发量
semaphore = asyncio.Semaphore(CONCURRENCY)url_3011 = 'xxxx'
response_3011 = requests.get(url='xxxx', headers=headers)
HTML_1 = etree.HTML(response_3011.text)
# 数据列表
json_data_list = []
tasks = []async def scrape_api(session, URL):# 控制并发量async with semaphore:# print('scraping', URL)# 请求网站,获取html代码和状态码async with session.get(URL, headers=headers) as response:await asyncio.sleep(1)# 关闭会话# await session.close()return await response.text()async def session_url(url):# 设置超时timeout = aiohttp.ClientTimeout(total=7)# 用 with as 可以自动关闭会话# 请求库由 requests 改成了 aiohttp,通过 aiohttp 的 ClientSession 类的 get 方法进行请求async with aiohttp.ClientSession(timeout=timeout) as session:html = await scrape_api(session, url)print('scraping', url)pages_1 = etree.HTML(html)for b in pages_1.xpath('/html/body/div[2]/div[3]/ul/li'):game_name = b.xpath('div[2]/div[1]/a/text()')[0]service = b.xpath('div[3]/text()')[0].strip()print({"game": game_name, "server": service,"mobile": "安卓", "time": timestamp})json_data_list.append({"game": game_name, "server": service, "mobile": "安卓", "time": timestamp})def url_list():for number1, day in enumerate(HTML_1.xpath('/html/body/div[2]/div[2]/div'), 1):day1 = day.xpath('a/div[1]/text()')[0]# 转换成时间数组timeArray = time.strptime(str(datetime.datetime.now().year) + '-' + str(datetime.datetime.now().month) + '-' + str(day1) + ' ' + '00:00:00', "%Y-%m-%d %H:%M:%S")# 转换成时间戳global timestamptimestamp = int(time.mktime(timeArray))*1000urls = ('https://www.3011.cn/server/%s/1.html' % (number1))response_3011_page = requests.get(url=urls, headers=headers)pattern_page = r'<li>共(\d+)页</li>'pages = re.findall(pattern_page, response_3011_page.text, re.S)[0]for a in range(1, int(pages)+1):# 生成访问链接urls_1 = ('https://www.3011.cn/server/%s/%s.html' % (number1, a))yield urls_1async def main():scrape_index_tasks = []for url1 in url_list():# ensure_future 方法,返回结果也是 task 对象,这样的话我们就可以不借助 loop 来定义scrape_index_tasks.append(asyncio.ensure_future(session_url(url1)))# 声明了 10000 个 task,将其传递给 gather 方法运行,已经生成的任务await asyncio.gather(*scrape_index_tasks)# scrape_index_tasks = [asyncio.ensure_future(scrape_api()) for _ in range(10000)]# 声明了 10000 个 task,将其传递给 gather 方法运行# await asyncio.gather(*scrape_index_tasks)if __name__ == '__main__':asyncio.get_event_loop().run_until_complete(main())

总结

以上就是今天要讲的内容,本文仅仅简单介绍了asyncio 和 aiohttp的使用,通过使用这两个模块可以大大提高爬虫的速度。

python爬虫实战之异步爬取数据相关推荐

  1. python爬虫实战之多线程爬取前程无忧简历

    python爬虫实战之多线程爬取前程无忧简历 import requests import re import threading import time from queue import Queu ...

  2. 转 Python爬虫实战一之爬取糗事百科段子

    静觅 » Python爬虫实战一之爬取糗事百科段子 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致 ...

  3. 《python爬虫实战》:爬取贴吧上的帖子

    <python爬虫实战>:爬取贴吧上的帖子 经过前面两篇例子的练习,自己也对爬虫有了一定的经验. 由于目前还没有利用BeautifulSoup库,因此关于爬虫的难点还是正则表达式的书写. ...

  4. Python爬虫实战一之爬取糗事百科段子

    点我进入原文 另外, 中间遇到两个问题: 1. ascii codec can't decode byte 0xe8 in position 0:ordinal not in range(128) 解 ...

  5. Python爬虫实战:selenium爬取电商平台商品数据

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 极客挖掘机 PS:如有需要Python学习资料的小伙伴可以加点击下 ...

  6. Python爬虫实战Pro | (1) 爬取猫眼电影Top100榜单

    在本篇博客中,我们将使用requests+正则表达式来爬取猫眼电影官网的TOP100电影榜单,获取每部电影的序号,片名,主演,上映日期,评分和封面等内容. 之前在Python爬虫实战(1)中我们曾爬取 ...

  7. Python爬虫实战练习:爬取微信公众号文章

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:徐洲更 为了实现该爬虫我们需要用到如下工具 Chrome浏览器 Py ...

  8. Python爬虫实战-详细讲解爬取安居客房价数据

    最近在尝试用python爬取安居客房价数据,在这里给需要的小伙伴们提供代码,并且给出一点小心得. 首先是爬取之前应该尽可能伪装成浏览器而不被识别出来是爬虫,基本的是加请求头,但是这样的纯文本数据爬取的 ...

  9. Python爬虫实战之电影爬取过程

    俗话说,兴趣所在,方能大展拳脚.so结合兴趣的学习才能事半功倍,更加努力专心,apparently本次任务是在视频网站爬取一些好看的小电影,地址不放(狗头保命)只记录过程. 实现功能: 从网站上爬取采 ...

最新文章

  1. 系统通知,居然用拉取
  2. 《Beginning C# Objcets》学习笔记
  3. java常见_关于Java的常见误解
  4. mysql数据库的三级模式_2016年计算机三级MySQL数据库试题
  5. python conf配置文件
  6. WWDC 2018: ARKit 2 的新功能
  7. python 面试题(1)--- python模块
  8. java通过桥访问excel_通过jdbc-odbc桥来访问excel文件
  9. 腾讯员工人均年薪曝光!比上一年涨薪7万,这个柠檬我先吃了...
  10. Linux开机启动过程(9):进入内核入口点之前最后的准备工作
  11. 用C#编写ActiveX控件(二) 转载
  12. C++Primer中文版(第5版)(顶级畅销书重磅升级 全面采用最新 C++ 11标准)
  13. 从html提取swf文件,Sothink SWF Catcher(SWF文件捕捉提取工具)V2.7 正式版
  14. CC2540和CC2541蓝牙芯片将升级为蓝牙5.0
  15. H264视频传输、编解码----H264数据结构
  16. [解决]IDEA每次启动都会打开Licenses激活弹窗、IDEA打不开
  17. 拼多多第二季度表现亮眼,“贪便宜”的你贡献了多少?
  18. 用JSP/Servlet应用开发一个简单的考试报名系统
  19. iOS KeyChain使用
  20. STM32 之 MDA

热门文章

  1. USB通讯基于FPGA的CY7C68013A实现(1)
  2. SpringBoot的缓存管理
  3. 微信小程序保存图片到相册授权被拒绝后重新拉取授权的方法
  4. 开源知识付费APP代码分析
  5. 无人机管控平台,推动电力巡检管理水平提升
  6. Ubuntu配置apt安装源(阿里源,中科大源,清华源,163源)
  7. 手写RPC框架(十六)
  8. “屏联天下·星辰大海”2022联诚发全国品牌推介会成都站圆满成功
  9. Kaggle 手机号码验证
  10. 测试邮箱的smtp端口是否开启