我已经使用JSoup为Java中的Google Scholar创建了一个网络刮板。刮板搜索Scholar寻找DOI,然后找到本文的引文。研究需要此数据。

但是,刮板仅适用于第一个请求。 ..
之后,刮板在Scholar网站上遇到了一个验证码。

但是,当我在浏览器(Chrome)中打开网站时,Google Scholar将正常打开。

这怎么可能?所有请求都来自相同的IP地址!
到目前为止,我已经尝试了以下选项:


为请求选择一个随机用户代理(从5个用户代理列表中)
请求之间的随机延迟介于5到50秒之间
使用TOR代理。但是,几乎所有终端节点都已被Google阻止


当我分析Chrome对Scholar的请求时,我发现Cookie与某些会话ID一起使用。也许这就是为什么Chrome请求未被阻止的原因。是否可以将此Cookie用于通过JSoup发出的请求?

谢谢!

最佳答案

我想到了三件事:


您不是在请求之间保存cookie。您的第一个请求应保存cookie并将其传递给服务器以用于下一个请求(设置Referer标头也不会受到伤害)。有一个示例here
如果Google棘手,他们可能会看到您的第一个请求没有在页面上加载任何css / js / images。这肯定表明您是机器人。
载入Javascript后,它就会在页面中执行某些操作。


我认为第一个是最可能的选择。您应该尝试将Chrome在请求中看到的许多标头从Chrome复制到Java代码中。

08-20 02:52