2012-11-02 57 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源之一的腳本。