Skip to content

[任务] 浏览器抓取 #41

Closed
Closed

Description

@JunieXD

关联与状态

路线图 #2,一期。状态:进行中,@lym12321 认领,PR #77 按审查意见修改中。适合熟悉 Python、用过 Playwright 的同学。有问题直接在这里留言。

目标

少数学院的官网要用浏览器打开才看得到内容。比如电科计算机学院用了瑞数的反爬,普通请求只拿到一段脚本。这类来源标着 browser,读列表和读正文都要用浏览器(总体设计 §7.2、§5.2 的实测)。

已经有的

  • 项目骨架:crawler/ 是 Python 3.14 + uv 的项目,装依赖 uv sync,跑全部检查 ./check.sh(格式、lint、Pyright 严格模式、测试)。命令见 AGENTS.md。
  • 一轮的流程:crawl/rounds.py 的 crawl_source 已经把一个来源的一轮串好:读列表 → 初筛 → 读正文和附件 → 抽取 → 交结果。四步作为 Steps 传进来,签名和交接的数据写在那里,测试的写法见 rounds_test.py。抓不成时抛 FetchError 或 StepError,流程会把原因记进抓取记录(开发约定 §2)。
  • 请求层:所有对来源网站的请求都经过 crawl/fetch.py 的 Fetcher,它管 UA、同一网站一次一个请求和间隔,不要自己用 httpx 发请求。
  • 和网站交接的类型:crawl/contract.py 由网站的接口定义生成,不手改(接口 §6)。
  • 浏览器的设置:已经实测过,写在开发约定 §2:
    • 关掉自动化标记,UA 用浏览器自己的,HeadlessChrome 写成 Chrome,末尾加上鼠钟的标识;
    • 一轮里同一个网站共用一个无痕会话;
    • 不加载图片、字体和音视频,拒绝弹窗和下载。
  • 资源:抓取节点只有 3.6GB 内存,同时最多开 2 个页面(§16)。

范围

  1. 浏览器:用 Playwright 驱动 Chromium 的无头精简版,按上面的设置打开页面,拿到渲染后的 HTML,交给读列表和读正文去解析([任务] 读列表:通用抓取、配置和往回翻页 #6、[任务] 读正文和附件 #40)。
  2. 守规矩:浏览器打开每个页面之前,也要先过 Fetcher 的间隔。需要的话给 Fetcher 加一个入口,比如先拿到许可再打开(开发约定 §2)。
  3. 附件:附件由程序另外下载,要带上浏览器会话里的 Cookie,不然过不了挑战。
  4. 用在哪:WorkSource.browser 为真的来源,读列表和读正文都走浏览器。

需要知道的

  • 加 Playwright 依赖用 uv add,先在这里说一声;浏览器只在 parse 或 crawl 的一个模块里用(AGENTS.md · 写代码)。
  • CI 不装浏览器:测试覆盖「先过规矩再打开」这类逻辑,真实网站在本地手动试,在 PR 里写明结果。

建议的第一步

  1. 在本 Issue 留言认领。
  2. 本地用 Playwright 按开发约定的设置打开电科计算机学院的首页,确认能过挑战,在这里贴结果,再动手接进 Fetcher。

验收标准

  • 电科计算机学院的列表页和通知页能抓到,附件能下载
  • 浏览器打开的每个页面都先过 Fetcher 的间隔,同时最多 2 个页面
  • ./check.sh 通过

Activity

  1. added
    task可以认领的具体工作
    crawler抓取节点:抓取、初筛、抽取
    on Oct 27, 2026
  2. lym12321 commented on Oct 28, 2026

    @lym12321
    Contributor

    认领

  3. JunieXD commented on Oct 28, 2026

    @JunieXD
    ContributorAuthor

    @lym12321 谢谢认领,已经指派给你了,范围没有变。

    建议先按「建议的第一步」在本地用 Playwright 照开发约定 §2 的设置打开电科计算机学院的首页,确认能过挑战,把结果贴在这里;顺便写下打算怎么接进 Fetcher(每个页面打开前先过 robots.txt 和间隔)。加 Playwright 依赖前在这里说一声。

  4. JunieXD commented on Oct 30, 2026

    @JunieXD
    ContributorAuthor

    @lym12321 补充两点:

    1. 不再读 robots.txt:有的学院官网一请求 robots.txt 就断开连接(比如西电),抓取不再读 robots.txt #70 已经让 Fetcher 不再读它。正文里「先过 robots.txt」的说法已经改了:浏览器打开每个页面前,只要过 Fetcher 的间隔(同一网站一次一个请求)。
    2. 开发约定 §2 的设置实测能过瑞数:审查来源清单(补充第一批来源清单 #66)时,我们用 Playwright 的无头精简版(Chromium 156),关掉 AutomationControlled,UA 里的 HeadlessChrome 改成 Chrome、末尾加上鼠钟的标识,打开了下面 15 个列表页,都是先返回 412 或 202 的挑战,接着返回 200 和完整的列表。所以「建议的第一步」可以算做完了,这些网址可以用来手动验证(测试里用保存下来的页面):

    进展怎么样?有卡住的地方随时在这里说。

  5. added a commit that references this issue on Nov 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

crawler抓取节点:抓取、初筛、抽取task可以认领的具体工作

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions