如何使用java从twitter上抓取推文

问题描述 投票:0回答:2

我需要抓取名人的推文。可以这样做吗?我能够使用 JSoup 从维基百科抓取数据。我在 Twitter 上尝试了同样的方法,但最终出现以下错误。我想我没有这样做的权限。是否有我可以使用的不同 API?我是网络抓取新手。请帮忙。

Exception in thread "main" javax.net.ssl.SSLHandshakeException:   
sun.security.validator.ValidatorException: PKIX path building failed: 
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid
certification path to requested target
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source)
at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
java eclipse twitter web-scraping
2个回答
0
投票

查看微博代理服务器的 Java 源代码,这是一个解析来自 Twitter 的消息和图像的 Web 服务。它使用 twitter4j 作为私人 Twitter。对于公共 Twitter,它使用 Jsoup 进行网络抓取。


0
投票

客户端代码(换句话说,HTML。并且,从那里,该 html 通过例如 head 标签包含的 CSS 和 JS)本身就是 twitter API 的用户。 HTML 不包含推文的原因是 HTML 是静态的 - 向每个人提供相同的 HTML(以及 js 和 css)。 js 调用 twitter.com。当然,您可以检查它是如何执行此操作并尝试“模仿”它 - 如果浏览器可以加载它,则任何应用程序都可以加载它。但请注意,这是对 API 的“滥用”,今天有效的方法明天可能就无效了。您不能使用 JSoup,因为 JSoup 不是浏览器。它允许您通过 CSS 选择器访问它提供的 HTML。提供的 HTML 不包含推文内容,因此 JSoup 无法帮助您。

如果你想追究这一点(因此,故意注册必须每隔一天重写或至少调整你的代码;twitter 将与其 HTML/CSS/JS 同步更改其 API,当然不会告诉你他们正在这样做,并且会积极尝试将你拒之门外。抓取所有 Twitter 具有很大的经济价值,因此,Twitter 在团队上花费了数百万美元来阻止你做你想做的事。最后,“你赢了” (如果浏览器可以做到这一点,你也可以),但是需要相当多的技巧才能做到这一点):

成为浏览器

我建议您使用浏览器开发工具来查看网络流量。您将找到推文内容(可能已加密,但是浏览器必须具有解密密钥,因此这不是真正的加密,只是混淆)。无论 twitter.com/link/to/tweet 发送的 HTML+CSS+JS 调用顺序是什么,您都会执行相同的顺序,瞧。然而,Twitter 正在积极使用技巧来试图将您拒之门外(您可能必须将这些调用伪造为每个标头中的确切措辞,毫无疑问将涉及一堆令牌,您需要弄清楚如何获取这些以及在哪里重复它们),但最终,如果浏览器可以做到这一点,那么您也可以。

使用浏览器

这些工具的“上下文”是

前端测试,而不是网页抓取。然而,像 selenium 这样的工具是存在的:它们可以让你“机器人化”浏览器。一个真正完整的浏览器将被启动,但它不是由键盘和鼠标控制,而是由 selenium 控制。您编写一个程序,使用 selenium 告诉真实的浏览器(因此,这意味着该应用程序将使用一些重要的资源;浏览器不是轻量级工具)加载 URL 并运行所有 javascript 并应用所有 CSS。然后,您向浏览器询问其 DOM 中的某些元素。您可以使用它让浏览器完成执行所有 javascript 的艰巨工作,从而进行所有这些 API 调用。 毫无疑问,Twitter 团队也在试图阻止这种情况,因此,您将花费无数的时间来哄骗浏览器通过 Selenium 选项,使其像人类一样行事,足以伪造 twitter.com 所采取的任何缓解措施反对这一点。即使你今天可以让它工作,明天也可能无法工作 - 这些解决方案通常非常依赖于页面的外观,所以如果 Twitter 稍微改变了它的“外观”,你很可能需要调整你的相应的代码。

...或者长大

API 的存在是有原因的。它们被“设计”为“好”——稳定且有正确的文档记录。通常我会告诉你长大后弄清楚:与这些数据的供应商做出安排,而不是试图违背他们的意愿将其挤出,并与他们进行无休止的军备竞赛,试图阻止你和你的工作围绕他们的尝试。

但是,这是两方之间的交易。现在 Twitter 最近在 API 方面的行为强烈表明他们不会在这方面成长,因此,上述激烈的竞争可能是你唯一的选择。 NB:请注意,理论上您在这里面临一些法律风险。您故意躲避安全措施。可能的安全措施与在前门贴一张纸条相同,上面写着:“嘿,小偷!请不要开门!” - 但仍然是一种安全措施。 DMCA 等法律可能适用。不要接受 Stack Overflow 的法律建议。我不是律师。我当然不是你的律师。

© www.soinside.com 2019 - 2024. All rights reserved.