我想使用Python来凑谷歌学术搜索结果。 我发现了两个不同的脚本来做到这一点,一个是gscholar.py ,另一个是scholar.py
(可以是一个被用来作为一个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和这个运行查询之前,也不会改变的问题。 任何建议如何解决这个问题?
我发现的R代码(见链接 )的解决方案,但很快得到了由谷歌封锁。 也许有人会提出如何改进的代码,以避免被封锁? 任何帮助,将不胜感激! 谢谢!
我建议你不要使用特定库抓取特定网站,而是利用是很好的测试,并已形成良好的文档,如BeautifulSoup通用HTML库。
对于访问网站以浏览器的信息,您可以使用一个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
包含在谷歌学术搜索结果页面显示的结果数元素。
谷歌将阻止你......因为很显然你不是一个浏览器。 也就是说,他们将检测出现过于频繁的人类活动相同的请求签名....
你可以做:
- 如何通过Tor的做在Python的urllib2请求?
- 运行该代码在你的大学计算机(可能没有帮助)
- 使用谷歌API的学者可能会花你的钱,而不是让你的全部功能,你可以作为一个humaned普通用户看到。
它看起来像使用Python和R刮跑入其中,谷歌学术看到您的要求作为一个机器人查询由于缺乏在请求的用户代理的问题。 有一个在StackExchange类似的问题关于下载的网页链接的所有PDF和答案引导用户在Unix和在BeautifulSoup包在Python与wget。
卷曲也似乎是一个更有前途的方向。
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)
你被阻止由谷歌的事实可能是由于在头的用户代理设置...我不熟悉的有R,但我可以给你的一般算法用于固定这样的:
- 使用普通浏览器(Firefox或其他)来访问的URL,同时监控HTTP流量(我喜欢的Wireshark)
- 注意在适当的HTTP请求发送的所有头
- 尝试运行脚本,并注意标题
- 指出不同
- 设置你的[R脚本,以使用头文件中看到检查浏览器的流量时
这里是查询的调用签名()...
def query(searchstr, outformat, allresults=False)
因此,你需要指定一个字符串searchstr,并且至少有一个outformat和allresults是一个可选的标记/参数。
您可能需要使用Greasemonkey的完成这个任务。 其优点是,谷歌会失败,如果你除了保持请求频率降低到检测你作为一个机器人。 您还可以观看该脚本在浏览器窗口的工作。
您可以了解自己的代码,或从一个使用脚本这些来源。