在 jsoup 中通过 HTTP 代理抓取页面
使用 jsoup 的请求级 HTTP 代理 API,并在多个 worker 共享会话设置时创建彼此独立的请求。
jsoup 可以在同一次调用中通过 HTTP 代理抓取页面并解析响应:
Document page = Jsoup.connect("https://www.example.com/")
.proxy("proxy.example", 8080)
.get();
主机名和整数端口共同确定代理。对于获准访问公开页面的请求,请从你的服务或 HTTP 代理列表中选择一个 HTTP 端点。传给 connect 的 URL 仍然是你要抓取的页面。仅仅为了加上这条路由,你并不需要用单独的 URLConnection 把 HTML 下载成字符串。
proxy(String, int) 用于为该请求选择 HTTP 代理。像 1080 这样的端口号不会把协议变成 SOCKS;代理端点必须支持正在配置的类型。jsoup 还提供了接受 java.net.Proxy 的重载,但某条具体路由能否工作仍取决于所用的 HTTP 实现。
让每个 worker 使用自己的请求
请求级选项让并行工作比在每次下载前后改动 JVM 系统属性更容易。请为每个 worker 保留各自可变的那份请求。现代 jsoup 可以在创建新请求的同时共享会话的设置和 Cookie 存储:
Connection session = Jsoup.newSession();
Document first = session.newRequest()
.url("https://www.example.com/one")
.proxy("proxy-a.example", 8080)
.get();
Document second = session.newRequest()
.url("https://www.example.com/two")
.proxy("proxy-b.example", 8080)
.get();
上面的调用为了清晰而按顺序执行。如果任务被并发分派,请各自独立创建请求,而不是在一个正在进行的 Connection 上更换代理。共享会话也会共享 Cookie;当浏览身份需要彼此分开时,请使用不同的会话。
这些接口存在于 jsoup 1.21.2 中。无参数的 newRequest() 接口从 1.14.1 起就存在,因此较旧的应用在采用会话示例前应先检查自己的依赖版本。
凭据是使用需要认证的代理时的另一项要求。成功选定路由并不提供账号,而收到代理的认证质询与无法连接其端口是两回事。