2012-11-02 10 views
11

Chciałbym użyć Pythona do zeskanowania wyników wyszukiwania Google Scholar. Znalazłem dwa różne scenariusze, jeden to gscholar.py, a drugi to scholar.py (czy można go użyć jako biblioteki Pythona?).Wyodrębnij wyniki Google Scholar za pomocą Pythona (lub R)

Teraz powinienem powiedzieć, że jestem zupełnie nowy dla Pythona, więc przepraszam, jeśli tęsknię za oczywistością!

Problemem jest to, kiedy używam gscholar.py jak wyjaśniono w pliku README, otrzymuję w wyniku

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

Nawet kiedy podać kolejny argument (np gscholar.query("my query", allresults=True), mam

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

To mnie zastanawia Próbowałem też określić trzeci możliwy argument (outformat=4; który to format BibTeX), ale ten daje mi listę błędów funkcji.Ale kolega poradził mi, aby zaimportować BeautifulSoup i this przed uruchomieniem kwerendy, ale także to nie zmienia problemu.Każdy sugestie, jak rozwiązać problem?

Znalazłem kod dla R (patrz link) jako rozwiązanie, ale szybko został zablokowany przez google. Może ktoś mógłby zasugerować, jak poprawić ten kod, aby uniknąć blokowania? Każda pomoc będzie doceniona! Dzięki!

+0

Zaktualizowałem moją odpowiedź, jak obejść blokowanie dostępu przez Google ... – Sheena

Odpowiedz

12

Sugeruję, aby nie używać specyficznych bibliotek do przeszukiwania konkretnych witryn internetowych, ale używać bibliotek HTML ogólnego przeznaczenia, które są dobrze przetestowane i mają dobrze uformowaną dokumentację, taką jak BeautifulSoup.

dostępu do stron internetowych z informacjami przeglądarki, można użyć klasy url otwieracz ze środkiem zwyczaj użytkownika:

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 

a następnie pobrać żądany adres URL w następujący sposób:

openurl(url).read() 

do pobierania wyniki badań wystarczy użyć adresu URL http://scholar.google.se/scholar?hl=en&q=${query}.

Aby wyodrębnić fragmenty informacji z pobierany plik HTML, można wykorzystać ten kawałek kodu:

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

Ten fragment kodu wydobywa konkretne div element, który zawiera liczbę wyników przedstawionych w wyszukiwarce Google Scholar strona wyników.

+1

W jaki sposób uzupełniłeś ciąg wersji? –

+0

Gdzie mogę podać ścieżkę do certyfikatu w tym kodzie? – AlwaysLearning

5

Google zablokuje Cię ... ponieważ stanie się jasne, że nie jesteś przeglądarką. Mianowicie, będą wykrywać ten sam wniosek podpis występujące zbyt często dla działalności człowieka ....

można zrobić:

+0

Próbuję uzyskać jedną stronę: 'requests.get (" https://scholar.google.com/scholar?q=compressed+ różnicowy + heurystyczny ")' i nadal otrzymuję '' – AlwaysLearning

+0

@AlwaysLearning, Dziękuję za poparcie mojego pierwszego wniosku. – 0x90

1

tu jest podpis wywołanie zapytania() ...

def query(searchstr, outformat, allresults=False) 

więc trzeba określić searchstr i outformat co najmniej, a allresults to opcjonalne flagi/argumentem.

+0

co wydaje się być sprzeczne z ich dokumentacją, nie wiem, co powiedzieć na ten temat. –

+0

Dziękuję za odpowiedź, ale próbowałem już tego (przepraszam za brak jasności), np. kiedy przejdę do zapytania ("moje zapytanie", 4, allresults = False) - 4 powinno być BibTex, jeśli rozumiem poprawnie - wtedy otrzymuję następujące polecenie: zapytanie funkcji w gscholar.py w linii 66 response = urllib2.urlopen (request) funkcja urlopen w urllib2.py w linii 126 return _opener.open (url, data, timeout) funkcja otwarta w urllib2.py w linii 400 odpowiedź = met (req, odpowiedź) funkcja http_response w urllib2.py w linii 513 "http", żądanie, odpowiedź, kod, msg, hdrs), itp. – Flow

+0

hmmm, brzmi, jakbyś miał wtedy dwa oddzielne problemy. Jednym z nich jest poprawne podpisanie połączenia (pamiętaj, że formatowanie NIE jest argumentem opcjonalnym, MUSISZ go określić). Po drugie, wydaje się, że urllib2 (standardowa biblioteka Pythona do otwierania adresów URL) ma problemy z adresem URL, który mu podałeś. –

2

COPython wygląda poprawnie, ale tutaj jest trochę wyjaśnienie na przykładzie ...

Rozważmy f:

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

f oczekuje wartości a i b nie wiem co. Możesz zostawić c puste.

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) 

Fakt, że jesteś blokowany przez Google, prawdopodobnie wynika z ustawień Twojego klienta w nagłówku ...Jestem zaznajomiony z R ale mogę ci dać ogólny algorytm ustalania to:

  1. użyć zwykłej przeglądarki (Firefox lub cokolwiek), aby uzyskać dostęp do adresu URL podczas monitorowania ruchu HTTP (lubię Wireshark)
  2. biorą pod uwagę wszystkich nagłówków wysyłanych w odpowiednim żądanie http
  3. spróbuj uruchomić skrypt, a także zwrócić uwagę nagłówki
  4. spot różnica
  5. ustawić skrypt R wykorzystać nagłówki obejrzałeś badając ruch przeglądarki
3

Wygląda jak skrobanie w Pythonie, a R napotyka problem, w którym Google Scholar widzi Twoją prośbę jako zapytanie robotowe z powodu braku klienta użytkownika w żądaniu. Podobne pytanie pojawia się w StackExchange na temat downloading all pdfs linked from a web page, a odpowiedź prowadzi użytkownika do wget w Uniksie i pakiecie BeautifulSoup w Pythonie.

Curl również wydaje się być bardziej obiecującym kierunkiem.

0

Do wykonania tego zadania może być konieczne użycie Greasemonkey. Zaletą jest to, że Google nie wykryje Cię jako bota, jeśli dodatkowo ograniczysz częstotliwość żądań. Możesz również obejrzeć skrypt działający w oknie przeglądarki.

Możesz nauczyć się kodu samodzielnie lub użyć skryptu ze źródła these.

Powiązane problemy