python 异步协程爬虫-半次元图片
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 异步协程爬虫-半次元图片相关推荐
- python异步协程爬虫报错:【aiohttp.client_exceptions.ClientPayloadError: Response payload is not comple】解决办法
今天在练习异步爬取视频时,程序报错:aiohttp.client_exceptions.ClientPayloadError: Response payload is not completed. 查 ...
- python获取get请求的耗时时间_突破python爬取极限,超牛逼的异步协程爬虫
异步协程 1. event_loop 2. coroutine 中文翻译叫协程,在 Python 中昌指代为协程对象类型,可以将协程对象注册到时间循环中被调用.使用 async 关键字来定义的方法在调 ...
- 超牛逼的异步协程爬虫
写在前面: 本来这篇文章只是用来记录一下学习异步协程爬虫的笔记,感谢CSDN的大力支持,引来了很多关注和浏览,也有很多大佬的批评指针. 事先声明:本文只是学习使用,在爬虫的实战应用中还要添加诸多限制, ...
- 小爬爬4.协程基本用法多任务异步协程爬虫示例(大数据量)
1.测试学习 (2)单线程: from time import sleep import time def request(url):print('正在请求:',url)sleep(2)print(' ...
- python异步协程实战:wallhaven壁纸网站
开发环境:Python3.9.idea 相较于线程池大约优化了50%的速度,在学校网100M宽带下,爬取一页24张需要60s 代码中默认是下载第一页的图片,想要多爬点的话加个循环就好了 url = & ...
- python异步协程,抓取豆瓣top250电影海报。
# 利用正则及异步协程 爬取豆瓣top250电影图片 # author:xyislove # 欢迎各位大神修改指导 from asyncio import tasks import re from f ...
- Python异步协程
Python asyncio 异步协程百万并发 协程(coroutine) 本质就是一个函数 事件循环--(event_loop) 协程函数,不是像普通函数那样直接调用运行的,必须添加到事件循环中,然 ...
- python3异步协程爬虫_Python实现基于协程的异步爬虫
Python实现基于协程的异步爬虫 一.课程介绍 1. 课程来源 本课程核心部分来自<500 lines or less>项目,作者是来自 MongoDB 的工程师 A. Jesse Ji ...
- python3异步协程爬虫,simpyder
Simpyder - Simple Python Spider Simpyder - 轻量级协程Python爬虫 特点 轻量级:下载便利,依赖较少,使用简单. 协程:单线程,通过协程实现并发. 可定制 ...
最新文章
- 需要监控JanusGraph的一些指标
- C# ASP.NET 开发指引简要
- php实现qq相册功能,使用javascript如何实现QQ空间相册展示
- 苹果AirTag遭破解,网友放出“教程”,可重写程序,可能成为恶意跟踪“神器”...
- PHP环境服务器搭建
- Delphi应用程序的调试(二)使用断点
- 史上最复杂业务场景,逼出阿里高可用三大法宝
- 通过超分辨率重构来提高二维码的对比度
- 谷歌Edge TPU:将机器学习引入边缘,撬动边缘计算/IOT大“地球”
- python3环境变量和pip_Tool_linux环境安装python3和pip
- 相机标定后图像像素和物理尺寸对应_你需要事件相机标定板,咱做了个
- 租服务器的 直连100m是啥,如何知道我的服务器带宽是独享10M或者100M?
- js打印线程id_泥瓦匠聊并发编程:线程与多线程必知必会(基础篇)
- Android Studio4.0以上设置护眼背景色
- 解决this application failed to start
- TFN F7 M1 光时域反射仪 多模OTDR 光纤测试仪 高精度 触摸屏 波长850/1300nm
- esp32A1S ubuntu环境搭建
- 关于地方美食的HTML网页设计——地方美食介绍网站 HTML顺德美食介绍 html网页制作代码大全
- 有12个苹果,其中一个苹果只有质量与其他苹果不一样,现要求用天平秤3次,找出与其他苹果不一样的那个苹果。
- win32汇编 屏幕截图保存BMP 学习笔记第三篇之odbg调试
热门文章
- APP:校园网登录app—中小南—源码简析
- 将一个文件夹中的图片写成视频
- KeyError: ‘label‘
- rdms系统_什么是关系数据库管理系统(RDMS)?
- 10个 Istio 流量管理 最常用的例子,你知道几个?
- 人口流向数据_中国各地人口净流入流出示意图
- 我的世界手机版javaui材质包_我的世界手机版幸运方块2.1
- 【数据集格式】coco格式转txt格式
- PNG透明图片叠加(Opencv实现,包括旋转缩放以及边界处理)
- 「今日 GitHub 趋势」让全世界程序员体会中国的 12306 抢票狂潮