java - JSOUP / HTTP 错误获取 URL。状态=503
问题描述
我正在使用 JSOUB 来抓取所有网页,如下所示:
public static final String GOOGLE_SEARCH_URL = "https://www.google.com/search";
String searchURL = GOOGLE_SEARCH_URL + "?q="+searchTerm+"&num="+num +
"&start=" + start;
Document doc = Jsoup.connect(searchURL)
.userAgent("Mozilla/5.0 Chrome/26.0.1410.64 Safari/537.31")
// .ignoreHttpErrors(true)
.maxBodySize(1024*1024*3)
.followRedirects(true)
.timeout(100000)
.ignoreContentType(true)
.get();
Elements results = doc.select("h3.r > a");
for (Element result : results) {
String linkHref = result.attr("href");
}
但我的问题是在代码开始时运行良好。
过了一会儿,它会停止并总是给我“HTTP error fetching URL. Status=503 error”。
当我添加 .ignoreHttpErrors(true) 时,它可以正常工作,但不会抓取网页。
*search term 是我要搜索的任何关键字,num 是我需要检索的页数。
有人可以帮忙吗?这是否意味着谷歌阻止了我的 IP 抓取?如果是的话,请问有什么解决方案或我如何浏览谷歌搜索结果吗?
我需要帮助。谢谢,
解决方案
503 错误通常意味着您尝试废弃的网站会阻止您,因为他们不希望非人类用户浏览他们的网站。尤其是谷歌。
不过,您可以做一些事情。如
- 使用代理旋转器
- 使用 chromedriver
- 在每个页面之后为您的应用程序添加一些延迟
基本上,您需要尽可能人性化,以防止网站阻止您。
编辑:
我需要警告您,抓取 Google 搜索结果违反了他们的服务条款,并且可能是非法的,这取决于您所在的位置。
你可以做什么
您可以使用代理轮换服务来屏蔽您的请求,以便谷歌将其视为来自多个区域的请求。proxy rotator service
如果您有兴趣,请谷歌。它可能很昂贵,具体取决于您对数据的处理方式。
然后编写一些模块来更改User-Agent
每个请求,以使 Google 对您的请求不那么怀疑。
抓取每一页后添加随机延迟。我建议大约 1-5 秒。随机延迟使您的请求对 Google 来说更人性化
最后,如果一切都失败了,您可能想要查看 Google 搜索 API 并使用他们的 API 而不是抓取他们的网站。
推荐阅读
- java - 使用 Roundingparam 设置CornerRadius,视图不会抗锯齿
- ruby - 运行同步作业时拒绝访问 S3 存储桶
- postgresql - 获取索引列总大小
- python - 如何使用特定的标准偏差 python 列表理解对列表中的值进行分组
- linux - Bash:重定向来自 2 个来源的输入?
- python - Python Dash在过滤时隐藏html表格
- amazon-web-services - 开发 REST API 时处理“AWS 堆栈资源限制”的正确方法是什么?
- android - 是否可以检测三连击?
- parallel-processing - 有一组复数,如何在Fortran中做并行数值积分?
- c# - 如何从用户给出的列表中获取 n 个随机名称?