环境:Python 3.11
使用组件:FlareSolverr、curl_cffi
目标:
- 获取受WAF保护的HTML文档类型资源。
- 获取受WAF保护的图片静态资源。
获取受WAF保护的HTML文档类型资源
一句话概括:使用FlareSolverr代理请求。
FlareSolverr提供了Windows、Linux上的可执行程序包与Docker镜像。默认在8191端口启动。以http请求的方式使用代理。例如使用httpx的情况:
response = httpx.post( url="http://192.168.1.20:8191/v1", json={ "cmd": "request.post", "url": "https://ascii2d.net/search/uri", "postData": f"utf8=✓&uri={url}", "maxTimeout": 60000, "proxy": {"url": "http://127.0.0.1:7890"}, }, timeout=60 ) print(response.json()["solution"]["response"])
有关proxy的解释
FlareSolverr运行在192.168.1.20上,上述代码中的proxy设置中的127.0.0.1指的是FlareSolverr所在的服务器,即FlareSolverr向ascii2d.net发送请求时需要使用与其运行在同一设备上7890端口的代理服务,这里填写127.0.0.1:7890等同于192.168.1.20:7890。
大量请求请使用sessions,详细的使用方法参阅官方示例:https://github.com/FlareSolverr/FlareSolverr?tab=readme-ov-file#usage
获取受WAF保护的图片静态资源
WAF对静态资源的反爬机制主要为验证TLS/JA3和HTTP/2指纹,curl_cffi可模拟浏览器的指纹,从而避免请求被检测和阻止。代码如下所示:
from curl_cffi import requests
url = "https://ascii2d.net/thumbnail/c/8/6/0/c860b41bf625911cf677eaa2f4d8a4ab.jpg"
r = requests.get(url, impersonate="chrome124")
print(r.content)
这里给出使用 代理+异步+会话 获取图片字节流的示例:
from curl_cffi.requests import AsyncSession
import asyncio
async def curl_cffi_ImageBatchDownload(urls: list) -> list[bytes]:
proxies = {"https": "http://127.0.0.1:7890"}
async with AsyncSession(proxies=proxies) as s:
tasks = [
asyncio.create_task(s.get(url, impersonate="chrome124")) for url in urls
]
results = await asyncio.gather(*tasks)
return [result.content for result in results]
方法入参是存有若干个链接字符串的列表,返回值是它们对应下载的字节组成的列表。
8-10行使用列表生成式,根据每个链接创建对应的异步下载任务,tasks是下载任务组成的列表。
然后 asyncio.gather(*tasks) 异步执行tasks列表中的任务,这时从宏观角度上看,程序同时发送了若干个网络请求,并行地在下载字节流。使用await阻塞式等待所有任务执行完成,再用列表生成式取出content组成列表并返回。
评论