python 异步协程爬虫-半次元图片

  • 1. 页面分析
  • 2.代码大体构思
  • 3.源码分析
    • 3.1 完成效果
  • 4.异步协程的优势
  • 5.难点分析
  • 6.可扩展性
    • 欢迎私信或评论区交流

爬取网址 : https://www.bcy.net/item/detail/7086637143778401318
1、免职申明 :内容仅供参考学习使用,侵删
2、图片可能存在侵权风险均打码处理 望谅解

1. 页面分析

1.查看原页面

2.查看响应数据源码页面

3.查看是否为ajax异步加载

经判断非异步加载
翻看源代码,发现图片来源于源码中js渲染如下图:

太长截不完,明白就行

2.代码大体构思

懒得画流程图了将就看【笑】
实现很简单

"""
函数共6个:
get_img_src(url) # 获取网页标题及图片地址
check_title(title) # 修改文件夹标题以符合windows文件夹的命名规范
download_img(session, url, path) # 异步函数爬取图片
run_tasks(task_list) # 执行异步任务
error_download(url, path) # 异步任务错误的图片重新爬取
main(url) # 主函数
"""

3.源码分析

# 目标 :https://www.bcy.net/item/detail/7086637143778401318
import os
import re
import time
import js2py
import requests
from bs4 import BeautifulSoup
import ua
import asyncio
import aiohttperror_src_list = list()def get_img_src(url):response = requests.get(url, headers=ua.headers())response.encoding = 'utf-8'html = response.textsoup = BeautifulSoup(html, 'lxml')title = check_title(soup.find('title').string)script = 'var window = Object();%s;function show(){return window.__ssr_data}' % soup.find_all('script')[-5].stringjs = js2py.EvalJs()js.execute(script)result = js.show()img_src_list = [i['original_path'] for i in result['detail']['post_data']['multi']]return [title, img_src_list]
"""
get_img_src(url)
获取网页源代码
BeautifulSoup()解析网页
script 重构js代码
运行js代码{可以使用的方法:1.调用node.js :麻烦2.使用execjs库 :问题:兼容性不佳,编码问题,速度慢3.使用js2py库:问题:兼容性不佳, 速度中等......还有很多 自己搜索
}
"""def check_title(title):rep = re.compile(r'[\\/:*?"<>|\r\n]+')change_name = rep.findall(title)if change_name:name = ''for i in change_name:name = title.replace(i, "_")return nameelse:return title
"""
check_title(title)
修改标题
正则查找,遍历修改
"""async def download_img(session, url, path):async with semaphore:async with session.get(url, headers=ua.headers()) as response:if response.status == 200:with open(path, 'wb') as f:while True:buffer = await response.content.read(4096)if not buffer:breakf.write(buffer)f.flush()print('成功 : ' + url)else:print('失败 : ' + url)error_src_list.append([url, path])
"""
def download_img(session, url, path)
异步函数不会的自学
"""async def run_tasks(task_list):async with aiohttp.ClientSession() as session:title = task_list[0]try:os.mkdir(f'./img/{title}')except os.error:passurls = task_list[1]tasks = [download_img(session, url, './img/{}/{}.jpg'.format(title, p)) for p, url in enumerate(urls)]await asyncio.wait(tasks)
"""
run_tasks(task_list)
异步函数
aiohttp库重点
异步中无法使用requests库
不会的自学
"""def error_download(url, path):response = requests.get(url, headers=ua.headers(), stream=True)if response.status_code == 200:with open(path, 'wb') as f:for data in response.iter_content(4096):f.write(data)f.flush()print('重试成功 : ' + url)else:time.sleep(5)error_download(url, path)
"""
error_download(url, path)
失败后重新下载
异步高并发,同时请求大量数据会失败
失败后添加到error_src_list列表异步协程任务完成后调用普通下载
"""def main(url):tasks_list = get_img_src(url)loop = asyncio.get_event_loop()loop.run_until_complete(run_tasks(tasks_list))for url, path in error_src_list:error_download(url, path)
"""
main()
获取任务列表运行协程任务
"""if __name__ == '__main__':semaphore = asyncio.Semaphore(50) # 控制任务并发数main('https://www.bcy.net/item/detail/7086637143778401318')

3.1 完成效果

4.异步协程的优势

协程本质上是个单进程,协程相对于多进程来说,无需线程上下文切换的开销,无需原子操作锁定及同步的开销,编程模型也非常简单。
我们可以使用协程来实现异步操作,比如在网络爬虫场景下,我们发出一个请求之后,需要等待一定的时间才能得到响应,但其实在这个等待过程中,程序可以干许多其他的事情,等到响应得到之后才切换回来继续处理,这样可以充分利用 CPU 和其他资源,这就是异步协程的优势。

5.难点分析

1.寻找图片出处

2.解析源码运行js代码获得json数据,提取列表

3.异步协程的实现及错误后的重试

6.可扩展性

可以把总任务数量增加
爬取日榜, 周榜,单独标签爬取

# 伪代码
# 一个函数 爬取日榜,周榜的链接地址
# 一个函数 循环 给main()函数传递任务

还可以连接数据库传入任务给主函数

# 伪代码
# 一个函数 连接数据库读取数据
# 一个函数 循环 给main()传递任务

欢迎私信或评论区交流

python 异步协程爬虫-半次元图片相关推荐

  1. python异步协程爬虫报错:【aiohttp.client_exceptions.ClientPayloadError: Response payload is not comple】解决办法

    今天在练习异步爬取视频时,程序报错:aiohttp.client_exceptions.ClientPayloadError: Response payload is not completed. 查 ...

  2. python获取get请求的耗时时间_突破python爬取极限,超牛逼的异步协程爬虫

    异步协程 1. event_loop 2. coroutine 中文翻译叫协程,在 Python 中昌指代为协程对象类型,可以将协程对象注册到时间循环中被调用.使用 async 关键字来定义的方法在调 ...

  3. 超牛逼的异步协程爬虫

    写在前面: 本来这篇文章只是用来记录一下学习异步协程爬虫的笔记,感谢CSDN的大力支持,引来了很多关注和浏览,也有很多大佬的批评指针. 事先声明:本文只是学习使用,在爬虫的实战应用中还要添加诸多限制, ...

  4. 小爬爬4.协程基本用法多任务异步协程爬虫示例(大数据量)

    1.测试学习 (2)单线程: from time import sleep import time def request(url):print('正在请求:',url)sleep(2)print(' ...

  5. python异步协程实战:wallhaven壁纸网站

    开发环境:Python3.9.idea 相较于线程池大约优化了50%的速度,在学校网100M宽带下,爬取一页24张需要60s 代码中默认是下载第一页的图片,想要多爬点的话加个循环就好了 url = & ...

  6. python异步协程,抓取豆瓣top250电影海报。

    # 利用正则及异步协程 爬取豆瓣top250电影图片 # author:xyislove # 欢迎各位大神修改指导 from asyncio import tasks import re from f ...

  7. Python异步协程

    Python asyncio 异步协程百万并发 协程(coroutine) 本质就是一个函数 事件循环--(event_loop) 协程函数,不是像普通函数那样直接调用运行的,必须添加到事件循环中,然 ...

  8. python3异步协程爬虫_Python实现基于协程的异步爬虫

    Python实现基于协程的异步爬虫 一.课程介绍 1. 课程来源 本课程核心部分来自<500 lines or less>项目,作者是来自 MongoDB 的工程师 A. Jesse Ji ...

  9. python3异步协程爬虫,simpyder

    Simpyder - Simple Python Spider Simpyder - 轻量级协程Python爬虫 特点 轻量级:下载便利,依赖较少,使用简单. 协程:单线程,通过协程实现并发. 可定制 ...

最新文章

  1. 需要监控JanusGraph的一些指标
  2. C# ASP.NET 开发指引简要
  3. php实现qq相册功能,使用javascript如何实现QQ空间相册展示
  4. 苹果AirTag遭破解,网友放出“教程”,可重写程序,可能成为恶意跟踪“神器”...
  5. PHP环境服务器搭建
  6. Delphi应用程序的调试(二)使用断点
  7. 史上最复杂业务场景,逼出阿里高可用三大法宝
  8. 通过超分辨率重构来提高二维码的对比度
  9. 谷歌Edge TPU:将机器学习引入边缘,撬动边缘计算/IOT大“地球”
  10. python3环境变量和pip_Tool_linux环境安装python3和pip
  11. 相机标定后图像像素和物理尺寸对应_你需要事件相机标定板,咱做了个
  12. 租服务器的 直连100m是啥,如何知道我的服务器带宽是独享10M或者100M?
  13. js打印线程id_泥瓦匠聊并发编程:线程与多线程必知必会(基础篇)
  14. Android Studio4.0以上设置护眼背景色
  15. 解决this application failed to start
  16. TFN F7 M1 光时域反射仪 多模OTDR 光纤测试仪 高精度 触摸屏 波长850/1300nm
  17. esp32A1S ubuntu环境搭建
  18. 关于地方美食的HTML网页设计——地方美食介绍网站 HTML顺德美食介绍 html网页制作代码大全
  19. 有12个苹果,其中一个苹果只有质量与其他苹果不一样,现要求用天平秤3次,找出与其他苹果不一样的那个苹果。
  20. win32汇编 屏幕截图保存BMP 学习笔记第三篇之odbg调试

热门文章

  1. APP:校园网登录app—中小南—源码简析
  2. 将一个文件夹中的图片写成视频
  3. KeyError: ‘label‘
  4. rdms系统_什么是关系数据库管理系统(RDMS)?
  5. 10个 Istio 流量管理 最常用的例子,你知道几个?
  6. 人口流向数据_中国各地人口净流入流出示意图
  7. 我的世界手机版javaui材质包_我的世界手机版幸运方块2.1
  8. 【数据集格式】coco格式转txt格式
  9. PNG透明图片叠加(Opencv实现,包括旋转缩放以及边界处理)
  10. 「今日 GitHub 趋势」让全世界程序员体会中国的 12306 抢票狂潮