十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Scrapling 交互式 Shell 实战:基于 IPython 的 Web Scraping REPL,从 get 快捷函数到 curl 命令转换

Scrapling 交互式 Shell 实战:基于 IPython 的 Web Scraping REPL,从 get 快捷函数到 curl 命令转换 Scrapling 交互式 Shell 实战基于 IPython 的 Web Scraping REPL从 get 快捷函数到 curl 命令转换【免费下载链接】Scrapling️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!项目地址: https://gitcode.com/GitHub_Trending/sc/ScraplingScrapling 的交互式 Shell 是一个面向 Web 抓取任务的 IPython 增强版 REPL进入即预置全部 Fetcher 类、请求快捷函数、自动页面追踪和 curl 命令转换工具让“写脚本—运行—改选择器”的循环变成即输即得的探索式体验。本文基于文档 docs/cli/interactive-shell.md 展开并结合 scrapling/core/shell.py、scrapling/core/_shell_signatures.py 等源码讲清每个快捷命令背后的实现机制与可复制的实操流程。读完本文你能够独立安装并启动 Shell、熟练使用page/pages页面管理、用uncurl/curl2fetcher把浏览器 DevTools 中的请求一键转为 Fetcher 请求并理解其底层解析链路。为什么使用交互式 Shell文档把 Shell 定位成把抓取从“慢速脚本循环”变成“快速探索”的工具官方列出的典型场景包括快速原型Rapid prototyping即时验证抓取策略数据探索Data exploration交互式地导航网站并抽取数据学习 Scrapling在实时环境中试验各种特性调试爬虫逐步检查请求并查看结果工作流转换Converting workflows把浏览器 DevTools 里的 curl 命令一行转换为 Fetcher 请求。这些能力的共同基础是Shell 把 Scrapling 最常用的一等对象Fetcher、Selector、Response和请求函数全部注入命名空间用户不需要任何import语句。前置知识在开始之前文档建议先阅读以下页面链接均以仓库根目录为起点Fetchers 基础理解 Response 对象 以及如何选择 Fetcher元素查询理解如何从 Selector/Response 对象中查找/提取元素主类理解 Response 从 Selector 继承的属性与方法至少一页抓取器文档用于实际发请求HTTP 请求、动态网站 或 强保护动态网站。安装与启动安装依赖Shell 属于 CLI 能力之一参见 CLI 总览需要先安装shell依赖组再安装各 Fetcher 的浏览器等运行依赖pip install scrapling[shell] scrapling install从 pyproject.toml 可以看到shell额外依赖的具体内容IPython8.37源码注释说明这是最后一个支持 Python 3.10 的版本线、markdownify1.2.0以及传递依赖scrapling[fetchers]。scrapling install会下载 Chromium 浏览器、系统依赖与指纹处理相关依赖详见 cli.py 中的 install 命令实现。启动命令# 启动交互式 Shell scrapling shell # 执行一段代码后退出适合脚本化场景 scrapling shell -c get(https://quotes.toscrape.com); print(len(page.css(.quote))) # 设置日志级别 scrapling shell --loglevel info这三个入口对应 cli.py 中的 Click 命令定义-c/--code在 Shell 中执行给定代码后退出。源码中通过InteractiveShellEmbed.run_cell(self.code, store_historyFalse)实现执行异常会被捕获并记录日志而不是让进程崩溃-L/--loglevel取值为debug、info、warning、error、critical、fatal之一case_sensitiveFalse默认值为debug。源码 shell.py 用_known_logging_levels映射到标准 logging 级别未知级别会回落到DEBUG并打一条 warning。启动后终端会显示 Scrapling 的自定义 Banner。从 CustomShell.banner() 可以看到 Banner 分三部分可用的 Scrapling 对象Fetcher/AsyncFetcher/FetcherSession、DynamicFetcher/DynamicSession/AsyncDynamicSession、StealthyFetcher/StealthySession/AsyncStealthySession、Selector、六个请求快捷函数、以及page/response/pages/uncurl/curl2fetcher/view/help这些实用命令。退出方式为exit或 CtrlD。进入 Shell 后即可直接抓取无需任何导入# 无需 import一切就绪 get(https://news.ycombinator.com) # 探索页面结构 page.css(a)[:5] # 查看前 5 个链接 # 精炼选择器 stories page.css(.titlelinea) len(stories) # 30 # 提取具体数据 for story in stories[:3]: ... title story.text ... url story[href] ... print(f{title}: {url}) # 尝试不同的写法 titles page.css(.titlelinea::text) # 直接提取文本 urls page.css(.titlelinea::attr(href)) # 直接提取属性内置快捷函数与预置对象六个请求快捷函数Shell 提供了消除样板代码的快捷函数对应关系见 get_namespace 与 banner快捷函数等价于说明get(url, **kwargs)Fetcher.getHTTP GET 请求post(url, **kwargs)Fetcher.postHTTP POST 请求put(url, **kwargs)Fetcher.putHTTP PUT 请求delete(url, **kwargs)Fetcher.deleteHTTP DELETE 请求fetch(url, **kwargs)DynamicFetcher.fetch基于浏览器的动态页面抓取stealthy_fetch(url, **kwargs)StealthyFetcher.fetch隐身浏览器抓取对抗强防护站点常用类也被自动注入命名空间包括Fetcher、AsyncFetcher、FetcherSession、DynamicFetcher、DynamicSession、AsyncDynamicSession、StealthyFetcher、StealthySession、AsyncStealthySession和Selector全部来自 scrapling.fetchers 的导出无需 import 即可使用。快捷函数的参数提示**kwargs的签名展开一个容易忽略的细节是get等函数的签名中大量参数走**kwargsUnpack[TypedDict]注解在普通 IPython 里 Tab 补全只能看到**kwargs无法提示具体参数名。Shell 专门解决了这一点scrapling/core/_shell_signatures.py 在模块级维护了三组参数字典_REQUESTS_PARAMSparams、cookies、auth、impersonate、http3、stealthy_headers、proxies、proxy、proxy_auth、timeout、headers、retries、retry_delay、follow_redirects、max_redirects、verify、cert、selector_config、_FETCH_PARAMSheadless、disable_resources、network_idle、wait_selector、page_action、proxy、extra_headers、timeout、cdp_url、block_ads、retries、capture_xhr、dns_over_https等浏览器参数、_STEALTHY_FETCH_PARAMS在_FETCH_PARAMS基础上增加allow_webgl、hide_canvas、block_webrtc、solve_cloudflare等隐身参数并以Signatures_map把函数名get/post/put/delete/fetch/stealthy_fetch映射到对应参数字典其中post/put额外带有data与json参数scrapling/core/shell.py 的 _unpack_signature 在CustomShell.create_wrapper中被调用把**kwargsParameter.VAR_KEYWORD替换为一个个KEYWORD_ONLY参数并写回包装函数的__signature__于是 IPython 的补全和get?帮助就能像 IDE 一样展示impersonate、proxy、timeout等具体参数及其类型注解。这就是文档中page.cTAB、Fetcher.TAB等补全体验完整的底层原因。智能页面管理page、response与pagesShell 会自动追踪你的请求与页面这是它区别于普通 Python REPL 的核心体验当前页面访问page和response两个名字会自动更新为最近一次抓取的页面get(https://quotes.toscrape.com) # page 和 response 都指向最后一次抓取的页面 page.url # https://quotes.toscrape.com response.status # 打印 200与 page.status 等价页面历史pages是一个Selectors对象保留最近5 个页面get(https://site1.com) get(https://site2.com) get(https://site3.com) # 访问最近 5 个页面 len(pages) # 保存页面历史的 Selectors 对象 - 3 pages[0].url # 历史中的第一个页面 - https://site1.com pages[-1].url # 最新的页面 - https://site3.com # 处理历史页面 for i, old_page in enumerate(pages): ... print(fPage {i}: {old_page.url} - {old_page.status})源码侧的实现非常清晰所有快捷函数都是CustomShell.create_wrapper生成的包装函数包装函数在执行完真实请求后统一调用 update_page若返回结果是Response或Selector实例则self.page result并向self.pages追加当len(self.pages) 5时pop(0)丢弃最旧一项这就是“最近 5 页”上限的来源随后把page、response、pages三个名字同步写回self.shell.user_nsIPython 用户命名空间保证你在 REPL 里看到的始终是最新值若结果不是页面例如uncurl返回的Request对象则原样返回且不更新页面状态。Selectors本体定义在 scrapling/parser.py它是一个List[Selector]的子类因此支持len()、下标、切片和迭代。附加实用命令页面可视化view()在浏览器中直接查看抓下来的页面get(https://quotes.toscrape.com) view(page) # 在默认浏览器中打开该页面的 HTML对应实现 show_page_in_browser它先校验输入必须是Selector实例否则记录错误日志然后写入一个scrapling_view_前缀的临时 HTML 文件编码取自page.encoding最后通过webbrowser.open(ffile://{fname})调用系统默认浏览器打开。适合在调整 CSS 选择器时对照真实页面结构。curl 命令集成uncurl与curl2fetcherShell 提供了把浏览器 DevTools 中的 curl 命令转换为Fetcher请求的两个函数uncurl只转换和curl2fetcher转换并直接执行。使用流程在 Chrome DevTools 的 Network 面板中选择请求右键 “Copy as cURL”粘贴进 Shell。第一步把 curl 命令转换为 Request 对象curl_cmd curl https://scrapling.requestcatcher.com/post \ ... -X POST \ ... -H Content-Type: application/json \ ... -d {name: test, value: 123} request uncurl(curl_cmd) request.method # - post request.url # - https://scrapling.requestcatcher.com/post request.headers # - {Content-Type: application/json}第二步一步转换并执行# 转换 执行一步到位 curl2fetcher(curl_cmd) page.status # - 200 page.json()[json] # - {name: test, value: 123}底层实现CurlParser 的解析细节这两个函数背后是 scrapling/core/shell.py 的 CurlParser。它的设计目标是“优先处理从 DevTools 网络面板复制出来的 curl 命令”要点如下基于 argparse 而非正则CurlParser.__init__构造一个禁用了 help 的NoExitArgumentParsershell.py 中让解析错误抛出ValueError而不是直接sys.exit保证 REPL 不会因一条坏命令而退出注册了 DevTools 常见参数url、-X/--request、-H/--header可重复、-A/--user-agent、-d/--data、--data-raw浏览器 JSON body 常用、--data-binary、--data-urlencode可重复、-G/--get、-b/--cookie、-x/--proxy、-U/--proxy-user、-k/--insecure、--compressed、-i/-s/-v等解析主流程 parse()先剥离curl前缀并把\\\n续行替换为空格用shlex.split按 shell 语法切分 token再用parse_known_args解析——出现未知参数会抛出AttributeError测试用例test_invalid_curl_commands验证了这一点方法推断规则默认get-G强制 GET否则取-X的值并转小写若都没有但存在任意 data 参数-d/--data-raw/--data-binary/--data-urlencode则推断为postHeader 与 Cookie-H列表交给 _ParseHeaders 拆分其中键名为cookie的 header 会被 _CookieParser基于http.cookies.SimpleCookie解析为字典-b的 cookie 字符串解析后按同名覆盖 header 中已有的 cookie请求体优先级--data-binary转为 bytes--data-raw剥离行首$前缀-d--data-urlencode合并为串再解析为字典若最终 data 是字符串且能被 orjson 解析成 dict/list则升级为json_data即json参数并把data置空-G场景下 data 会被移入 URLparams代理-x缺省补http://前缀-U user:pass会拼入代理 URL 的 netloc最终生成{http: proxy_url, https: proxy_url}的标准字典格式返回值uncurl返回一个 8 字段的Requestnamed tuplemethod/url/params/data/json_data/headers/cookies/proxy/follow_redirects定义见 shell.pyfollow_redirects固定为safe——跟随重定向但拒绝指向内网/私有 IP 的重定向执行链路 convert2fetcher把Request._asdict()展开仅支持get/post/put/delete四种方法_supported_methodsjson_data键被重命名为json以匹配Fetcher的参数名GET/DELETE 会丢弃data/json最后getattr(Fetcher, method)(**request_args)发起真实请求返回值经update_page写入page/pages因此curl2fetcher之后可以直接page.status、page.json()继续操作。这套解析逻辑有完整的测试覆盖见 tests/cli/test_shell_functionality.py 的TestCurlParser基础 GET、headers、表单/JSON data、-H Cookie与-b合并、-x/-U代理、convert2fetcher调用验证、非法命令抛错以及 tests/core/test_shell_core.py 中对_CookieParser、_ParseHeaders、Request与日志级别映射的单元测试。IPython 全部能力Shell 继承自 IPythonInteractiveShellEmbed嵌入模式见 start()因此所有 IPython 特性都可用# 魔术命令 %time page get(https://example.com) # 计时 %history # 查看命令历史 %save filename.py 1-10 # 把第 1-10 条命令保存为文件 # 任意位置 Tab 补全 page.cTAB # 显示 css、cookies、headers 等 Fetcher.TAB # 显示 Fetcher 全部方法 # 对象检查 get? # 查看 get 的文档实战示例以下是文档提供的两个由 AI 辅助生成的示例场景展示从探索到放大的完整工作流。电商数据采集# 从商品列表页开始 catalog get(https://shop.example.com/products) # 找到商品链接 product_links catalog.css(.product-link::attr(href)) print(fFound {len(product_links)} products) # 先抽样几个商品验证选择器 for link in product_links[:3]: ... product get(fhttps://shop.example.com{link}) ... name product.css(.product-name::text).get() ... price product.css(.price::text).get() ... print(f{name}: {price}) # 验证无误后用 Session 提升批量抓取效率 from scrapling.fetchers import FetcherSession with FetcherSession() as session: ... products [] ... for link in product_links: ... product session.get(fhttps://shop.example.com{link}) ... products.append({ ... name: product.css(.product-name::text).get(), ... price: product.css(.price::text).get(), ... url: link ... })这个示例体现了 Shell 的典型用法先用get单发请求快速验证选择器确认无误后再切换到FetcherSession命名空间中已预置甚至不需要 import做规模化抓取。API 集成与测试 # 交互式测试 API 端点 response get(https://jsonplaceholder.typicode.com/posts/1) response.json() {userId: 1, id: 1, title: sunt aut..., body: quia et...} # 测试 POST 请求 new_post post(https://jsonplaceholder.typicode.com/posts, ... json{title: Test Post, body: Test content, userId: 1}) new_post.json()[id] 101 # 测试更新请求 updated put(fhttps://jsonplaceholder.typicode.com/posts/{new_post.json()[id]}, ... json{title: Updated Title})post/put的json参数与Fetcher.post/Fetcher.put完全一致参见 Signatures_map 中post/put额外包含的data、json参数因此交互中验证通过的请求可以原样搬进生产代码。源码索引与延伸阅读Shell 的实现集中在以下几个文件便于按需深入scrapling/cli.pyscrapling shell的 Click 命令定义-c、-L/--loglevelscrapling/core/shell.pyCustomShell命名空间、Banner、页面更新、CurlParsercurl 解析与uncurl/curl2fetcher、show_page_in_browserview、Convertor供scrapling extract命令做 HTML→Markdown/文本转换属于 CLI 总览 中的另一条能力线scrapling/core/_shell_signatures.py六个快捷函数的参数签名表支撑 IPython 的参数级补全scrapling/core/utils/_shell.pyHeader/Cookie 字符串解析工具测试tests/cli/test_shell_functionality.pyCurlParser、CustomShell、Convertor、tests/core/test_shell_core.pycookie/header 解析、Request、日志级别。与 Shell 相关的其他 CLI 文档可参考 CLI 总览 和 Extract 命令抓取器选型见 choosing.md。Shell 的适用前提再次强调需要安装scrapling[shell]依赖组并执行scrapling install完成浏览器依赖安装-c模式适合把 Shell 纳入脚本流程--loglevel默认debug生产调试时可调整为info及以上以降噪。【免费下载链接】Scrapling️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!项目地址: https://gitcode.com/GitHub_Trending/sc/Scrapling创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表