此指南目的在于给想要自己添加测试项的开发者一个快速入门的机会。如果你是一个使用者,而非开发者,那么看到这里你可以关掉本文章了。 本文章仅作抛砖引玉,有更好的外接脚本方法可以进行讨论。
import asyncio # 异步io模块
import aiohttp # 爬取网页要用
from aiohttp import ClientConnectorError # 错误处理
from loguru import logger # 日志
async def fetch_XXX(Collector, session: aiohttp.ClientSession, proxy=None, reconnection=2):
"""
XXX检测, XXX是流媒体的名字
:param Collector: 采集器,来自 libs.collector.Collector() 类
:param session: session,来自 aiohttp.ClientSession() 类
:param proxy: 默认None即可,采集器会设置代理,这里不用设代理。
:param reconnection: 重连次数,如果网络不稳定可能会造成请求失败,所以会有重新发送请求机制,默认为2
:return: 不返回数据,所有数据维护在 Collector.info 属性中,它是一个字典。
"""
try:
# 这里写下你的测试逻辑
async with session.get(_url, proxy=proxy, timeout=5) as reqs:
Collector.info['XXX'] = "解锁" # 将数据放入字典中
# 强烈建议包含以下两个异常处理,可应对大部分情况。
except ClientConnectorError as c:
logger.warning("XXX请求发生错误:" + str(c))
if reconnection != 0:
await fetch_XXX(Collector, session=session, proxy=proxy, reconnection=reconnection - 1)
except asyncio.exceptions.TimeoutError:
logger.warning("XXX请求超时,正在重新发送请求......")
if reconnection != 0:
await fetch_XXX(Collector, session=session, proxy=proxy, reconnection=reconnection - 1)
提示:设计数据清洗的目的是为了区分功能,让采集器和清洗器各司其职,而不是让采集器干清洗数据的活。举个例子,假设拿到指定数据需要用到正则匹配,并且操作繁琐,那么应该写成以下这样的函数。采集器需要快速将请求内容输入完毕,这种可能增加时间的活应该先“放着”一边,之后交给清洗器处理。
def get_XXX_info(ReCleaner):
"""
获得XXX解锁信息
:param ReCleaner: 来自 libs.cleaner.ReClener() 类
:return: str: 解锁信息: [解锁(地区代码)、失败、N/A等等]
"""
try:
if 'XXX' not in ReCleaner.data:
logger.warning("采集器内无数据")
return "N/A"
else:
logger.info("XXX解锁情况:" + str(ReCleaner.data.get('netflix_new', "N/A")))
return ReCleaner.data.get('netflix_new', "N/A")
except Exception as e:
logger.error(e)
return "N/A"
def task(Collector, session, proxy):
return asyncio.create_task(fetch_XXX(Collector, session, proxy=proxy))
SCRIPT = {
"MYNAME": "Netflix",
"TASK": task,
"GET": get_xxx_info
}