如何使用HTTParty对GitHub进行身份验证以刮取页面?

时间:2019-05-10 14:04:41

标签: ruby authentication github httparty

我正在尝试抓取此页面:

https://github.com/search?p=1&q=https%3A%2F%2Fsonarcloud.io%2Fdashboard&type=Code

并且我需要使用我的电子邮件和密码进行身份验证。

我尝试这样做:

auth = {:usarname => "username", :password => "password"}

a = HTTParty.get(url, :basic_auth)

但这并没有像预期的那样对我进行身份验证。

为什么这不起作用,我该如何解决?

我想检索该信息,并且在Github API上不可用:

1 个答案:

答案 0 :(得分:0)

不要抓取GitHub。爬网很脆弱,而且对于大量使用JavaScript的网站来说非常尴尬。

改为使用its API

https://api.github.com/search/code?q=https%3A%2F%2Fsonarcloud.io%2Fdashboard

但是,要搜索所有存储库,您仍然需要authenticate。您需要将auth哈希传递到HTTParty.get()中:

auth = {:username => "username", :password => "password"}

a = HTTParty.get(url, :basic_auth => auth)
#                                 ^  Here

习惯上来说,这看起来像

auth = {username: "username", password: "password"}

a = HTTParty.get(url, basic_auth: auth)

您还有一个错字-usarname,而不是username,这是我在版本中已解决的问题。

编辑:如果您要检索特定的匹配文本,文件和行,则仍然不必刮擦其HTML。相反,您可以set your Accept header to application/vnd.github.v3.text-match+json

url = "https://api.github.com/search/code"
query = {q: "https://sonarcloud.io/dashboard"}
auth = {username: "username", password: "password"}
headers = {"Accept" => "application/vnd.github.v3.text-match+json"}

a = HTTParty.get(url, query: query, basic_auth: auth, headers: headers)

现在,响应应提供一个包含哈希的text_matches键,其中fragment s显示匹配的文本以及object_type s(例如"FileContent"),{{1} } s和object_url

在我已经提供的search code链接中也提到了这一点:

  

搜索代码时,当您传递indices媒体类型时,可以获取文件 content 和文件 path 的文本匹配元数据。有关如何接收突出显示的搜索结果的更多详细信息,请参见Text match metadata