Troubleshooting Computer Issues
用于系统性诊断和解决软件配置、安装错误及运行异常等问题。
下载 123
通过API实现反爬虫绕过与JavaScript渲染的网页数据采集。
openclaw skills install @scrapfly/scrapfly-scraper命令、参数、文件名以原文为准
使用 Scrapfly 抓取 API 收集网页数据,支持代理轮换、反机器人防护绕过、JavaScript 渲染以及浏览器控制的 JavaScript 场景。
pip install scrapfly-sdkAPI 密钥必须通过环境变量 SCRAPFLY_API_KEY 提供,或直接传递给客户端。
端点: https://api.scrapfly.io/scrape
HTTP 方法将转发至上游 URL。
要从网页或 API 获取数据,请使用 GET 方法(默认方法)。
如果 API 资源需要其他方法(如 POST),可通过 ScrapeConfig 的 method 参数指定。
from scrapfly import ScrapflyClient, ScrapeConfig, ScrapeApiResponse
import os
client = ScrapflyClient(key=os.environ["SCRAPFLY_API_KEY"])| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
url | str | 必填 | 目标抓取 URL |
method | str | "GET" | HTTP 方法:GET、POST、PUT、PATCH、HEAD、OPTIONS |
headers | dict | None | 自定义 HTTP 头部 |
cookies | dict | None | 自定义 cookies(合并到 headers["cookie"]) |
body | str | None | POST/PUT/PATCH 的原始请求体(用于预编码负载) |
data | dict | None | 表单/JSON 数据,用于 POST/PUT/PATCH;当未提供 body 时按 Content-Type 编码 |
timeout | int | None | 请求超时时间(毫秒),默认约 150,000ms |
retry | bool | True | 网络失败时自动重试 |
country | str | None | 代理所在国家(ISO 3166-1 alpha-2 标准,如 "us"、"de") |
proxy_pool | str | "public_datacenter_pool" | 代理池类型:"public_datacenter_pool" 或 "public_residential_pool" |
session | str | None | 会话 ID,用于跨请求保持 cookies/fingerprint |
session_sticky_proxy | bool | False | 对于指定的 session,保持相同的代理 IP |
asp | bool | False | 启用反抓取保护绕过 |
render_js | bool | False | 启用无头浏览器 JavaScript 渲染(+5 积分) |
rendering_wait | int | None | 页面加载后等待时间(毫秒),需配合 render_js=True |
rendering_stage | str | "complete" | 浏览器就绪阶段:"complete" 或 "domcontentloaded"(需 render_js=True) |
wait_for_selector | str | None | 等待的 CSS/XPath 选择器(需 render_js=True) |
js | str | None | 在浏览器中执行的 JavaScript 代码(自动编码) |
js_scenario | list | None | 浏览器操作列表(点击、填写、滚动、等待等) |
auto_scroll | bool | None | 渲染过程中自动滚动页面以加载懒加载内容(需 render_js=True) |
screenshots | dict | None | 截图设置:{"fullpage": "png"} 或 {"selector": ".element"}(需 render_js=True) |
screenshot_flags | list[str] | None | 截图选项:"load_images"、"dark_mode"、"block_banners"、"high_quality"、"print_media_format" |
format | str | "raw" | 输出格式:"raw"、"clean_html"、"json"、"markdown"、"text" |
format_options | list[str] | None | 格式修饰符(仅 Markdown 有效):"no_images"、"no_links"、"only_content" |
extract | dict | None | 要应用在响应上的原始提取规则(编码后作为 extract 发送) |
extraction_template | str | None | 保存在服务器端的提取模板名称 |
extraction_ephemeral_template | dict | None | 一次性使用的内联 JSON 提取模板(前缀为 ephemeral:) |
extraction_prompt | str | None | 用于 Extraction API 的自然语言指令 |
extraction_model | str | None | 用于 Extraction API 的 LLM 模型名称 |
cache | bool | False | 启用响应缓存 |
cache_ttl | int | None | 缓存存活时间(秒) |
cache_clear | bool | False | 当 cache=True 时清除现有缓存响应 |
dns | bool | False | 在 result.dns 中收集 DNS 记录和耗时(较慢) |
ssl | bool | False | 在 result.ssl 中收集 SSL 证书详情(较慢) |
debug | bool | False | 启用调试记录和额外元数据 |
raise_on_upstream_error | bool | True | 上游返回 4xx/5xx HTTP 响应时抛出异常 |
correlation_id | str | None | 自定义请求跟踪 ID,用于跨系统追踪 |
tags | list[str] | None | 自定义标签,用于请求组织与分析 |
lang | list[str] | None | Accept-Language 值,例如 ["en-US", "en"] |
os | str | None | 覆盖浏览器操作系统指纹,例如 "windows"、"macos" |
webhook | str | None | 命名 webhook,用于异步抓取完成后的回调通知 |
cost_budget | int | None | ASP 重试及附加功能的最大积分消耗 |
response = client.scrape(ScrapeConfig(url="https://httpbin.dev"))
response.content # 页面内容(HTML/JSON/文本)
response.scrape_result # 完整结果字典
response.status_code # Scrapfly API HTTP 状态码
response.scrape_result["status_code"] # 上游 HTTP 状态码
response.headers # 响应头部
response.context # 使用功能的元数据from scrapfly import ScrapflyClient, ScrapeConfig
import os
client = ScrapflyClient(key=os.environ["SCRAPFLY_API_KEY"])
result = client.scrape(ScrapeConfig(
url="https://httpbin.dev",
))
print(result.content)result = client.scrape(ScrapeConfig(
url="https://httpbin.dev",
asp=True, # 启用 ASP 以绕过反机器人机制
country="us", # 将代理与目标域名所在国家匹配
proxy_pool="public_residential_pool", # 使用住宅代理池,模拟真实 ISP IP 地址
))result = client.scrape(ScrapeConfig(
url="https://web-scraping.dev/products",
render_js=True, # 启用云浏览器渲染 JavaScript
rendering_wait=5000, # 渲染等待时间(毫秒)
wait_for_selector="div.product", # 等待页面上指定选择器出现
))result = client.scrape(ScrapeConfig(
url="https://web-scraping.dev/products",
format="markdown", # 支持的其他格式包括:json、text、clean_html
))
print(result.content)result = client.scrape(ScrapeConfig(
url="https://httpbin.dev/anything",
method="POST",
headers={"Content-Type": "application/json"},
body='{"query": "search term"}',
))
print(result.content)result = client.scrape(ScrapeConfig(
url="https://web-scraping.dev/login",
render_js=True,
# 浏览器控制指令
js_scenario=[
{
"fill": {
"selector": "input[name='username']",
"clear": True,
"value": "user123"
}
},
{
"fill": {
"selector": "input[name='password']",
"clear": True,
"value": "password"
}
},
{
"click": {
"selector": "form > button[type='submit']"
}
},
{
"wait_for_navigation": {
"timeout": 5000
}
}
],
# 请求头设置
headers={
"cookie": "cookiesAccepted=true"
}
))
# 访问登录后的页面元素
print(result.selector.css("div#secret-message::text").get())result = client.scrape(ScrapeConfig(
url="https://web-scraping.dev/products",
render_js=True
))
# 使用内置的 Parsel 选择器
selector = result.selector
for product in selector.css("div.product"):
print("商品名称:", product.xpath(".//a/text()").get()) # 使用 XPath
print("商品价格:", product.css("div.price::text").get()) # 使用 CSS 选择器import asyncio
from scrapfly import ScrapflyClient, ScrapeConfig
client = ScrapflyClient(key=os.environ["SCRAPFLY_API_KEY"])
urls = [
"https://web-scraping.dev/products",
"https://web-scraping.dev/products?page=2",
"https://web-scraping.dev/products?page=3",
]
configs = [ScrapeConfig(url=url) for url in urls]
async def concurrent_scraping():
results = []
async for result in client.concurrent_scrape(configs):
results.append(result)
for result in results:
print(result.content[:100])
print("===========")
asyncio.run(concurrent_scraping())# 第一次请求:登录
result = client.scrape(ScrapeConfig(
url="https://web-scraping.dev/login",
render_js=True,
# 浏览器操作指令
js_scenario=[
{
"fill": {
"selector": "input[name='username']",
"clear": True,
"value": "user123"
}
},
{
"fill": {
"selector": "input[name='password']",
"clear": True,
"value": "password"
}
},
{
"click": {
"selector": "form > button[type='submit']"
}
},
{
"wait_for_navigation": {
"timeout": 5000
}
}
],
# 请求头设置
headers={
"cookie": "cookiesAccepted=true"
},
session="logged-in-session"
))
# 第二次请求:使用相同会话访问受保护页面
result = client.scrape(ScrapeConfig(
url="https://web-scraping.dev/login",
session="logged-in-session"
))
# 使用内置选择器访问内容
print(result.selector.css("div#secret-message::text").get())result = client.scrape(ScrapeConfig(
url="https://example.com",
cache=True,
cache_ttl=3600, # 缓存时长为 1 小时
))from scrapfly import ScrapflyClient, ScrapeConfig
from scrapfly.errors import (
ScrapflyError,
UpstreamHttpClientError,
UpstreamHttpServerError,
ScrapflyProxyError,
ScrapflyThrottleError,
)
try:
result = client.scrape(ScrapeConfig(url="https://httpbin.dev", asp=True))
except ScrapflyThrottleError as e:
print(f"请求过于频繁,建议在 {e.retry_delay} 秒后重试")
except UpstreamHttpClientError as e:
print(f"目标服务器返回 4xx 错误:{e.message}")
except UpstreamHttpServerError as e:
print(f"目标服务器返回 5xx 错误:{e.message}")
except ScrapflyProxyError as e:
print(f"代理错误:{e.message}")
except ScrapflyError as e:
print(f"Scrapfly 错误:{e.message}")render_js=True 是使用 rendering_wait、wait_for_selector、js_scenario、screenshots 等功能的前提asp=True 时,推荐搭配 proxy_pool="public_residential_pool" 以获得更真实的访问行为format="markdown" 可获取结构清晰的内容,适合用于大模型处理session 参数可在多个请求间保持状态(如登录状态)concurrent_scrape 方法会自动处理速率限制已收录 3 个 Skill