2012-11-02 51 views
11

我想使用python来搜索Google学者搜索结果。我发现了两个不同的脚本来做到这一点,一个是gscholar.py,另一个是scholar.py(可以将它用作Python库吗?)。使用Python(或R)提取Google学术搜索结果

现在,我应该说我对Python完全陌生,所以很抱歉,如果我错过了明显的!

问题是,当我使用gscholar.py自述文件中所解释的,我得到的结果

query() takes at least 2 arguments (1 given)。 。

即使我指定其他参数(如gscholar.query("my query", allresults=True),我得到

query() takes at least 2 arguments (2 given)

这让我为难,我也试图指定第三个可能的参数(outformat=4;这是中文提供格式),但这给我一个函数错误列表,一位同事建议我在运行查询前先导入BeautifulSoup和this,但也不会改变这个问题任何建议如何解决这个问题?

我发现代码为R见link)作为解决方案,但迅速被谷歌阻止。也许有人可以建议如何改进该代码以避免被阻止?任何帮助,将不胜感激!谢谢!

+0

我更新了我的答案,以及如何解决Google阻止访问... – Sheena

回答

12

我建议您不要使用特定的库来抓取特定的网站,而是使用通用的HTML库,这些库已经过很好的测试,并且具有格式良好的文档,例如BeautifulSoup。

对于访问网站以浏览器的信息,您可以使用一个URL开启类的自定义用户代理:

from urllib import FancyURLopener 
class MyOpener(FancyURLopener): 
    version = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36' 
openurl = MyOpener().open 

然后下载所需的网址如下:

openurl(url).read() 

对于检索学者的结果只是使用http://scholar.google.se/scholar?hl=en&q=${query}的网址。

从检索到的HTML文件中提取的信息,您可以使用这段代码:

from bs4 import SoupStrainer, BeautifulSoup 
page = BeautifulSoup(openurl(url).read(), parse_only=SoupStrainer('div', id='gs_ab_md')) 

这段代码中提取包含在谷歌学术搜索显示的结果数的具体div元素结果页面。

+1

你是如何组成版本字符串的? –

+0

我在哪里可以指定此代码中证书的路径? – AlwaysLearning

5

谷歌会阻止你......因为它很明显你不是一个浏览器。也就是说,他们将检测中出现的相同的请求签名过于频繁的人类活动....

你可以这样做:

+0

我想要获取单个页面:'requests.get(“https://scholar.google.com/scholar?q=compressed+差异+启发式“),仍然可以得到' – AlwaysLearning

+0

@AlwaysLearning,感谢您支持我最初的说法。 – 0x90

1

这里是查询()的调用签名......

def query(searchstr, outformat, allresults=False) 

因此,你需要指定一个字符串searchstr,并且至少有一个outformat和allresults是一个可选的标记/参数。

+0

这似乎是与他们的文件相悖,不知道该说些什么...... –

+0

感谢您的回答,但我已经尝试过(对不够清楚),例如当我去查询(“我的查询”,4,allresults = False) - 4应该是BibTex,如果我理解正确 - 然后我得到以下:函数查询gscholar.py 66行 response = urllib2.urlopen(request) 函数urlopen在线126 urllib2.py返回_opener。打开(url,数据,超时) 函数在第400行的urllib2.py中打开 response = meth(req,response) 函数http_response在urllib2.py的第513行 'http',request,response,code,msg, hdrs)等。 – Flow

+0

嗯,听起来像你可能有两个单独的问题。一个是正​​确的调用签名(注意,格式不是可选参数,你必须指定它)。其次是看起来urllib2(用于打开URL的标准Python库)与您提供的url有问题。 –

2

COPython看起来是正确的,但这里有一个位的举例说明...

考虑F:

def f(a,b,c=1): 
    pass 

˚F预计值a和b不管。您可以将c留空。

f(1,2)  #executes fine 
f(a=1,b=2) #executes fine 
f(1,c=1) #TypeError: f() takes at least 2 arguments (2 given) 

您被Google阻止的事实可能是由于您的头中的用户代理设置...我不熟悉的有R,但我可以给你的一般算法用于固定的:

  1. 使用普通浏览器(Firefox或其他),同时监控HTTP流量(我喜欢的Wireshark)
  2. 注意一下访问URL在适当的http请求
  3. 尝试运行脚本,并发送的所有头的注意标题
  4. 现货的差异
  5. 设定[R脚本利用头检查你的浏览器通信时看到
3

它看起来像是用Python进行刮取,R遇到Google Scholar将请求视为机器人查询的问题,原因是请求中缺少用户代理。在StackExchange中存在一个类似的问题downloading all pdfs linked from a web page,答案会导致用户在Unix中使用wget,在Python中使用BeautifulSoup包。

Curl也似乎是一个更有希望的方向。

0

您可能需要使用Greasemonkey来执行此任务。优点是,如果您保持请求频率下降,Google将无法将您检测为机器人。您还可以在浏览器窗口中观看脚本。

您可以自己编写代码或使用来自these源之一的脚本。