Извлечение результатов Google Scholar с использованием Python (или R)
Я бы хотел использовать python для очистки результатов поиска Google. Я нашел два разных script, один из которых - gscholar.py, а другой - scholar.py
(может ли он использоваться как библиотека python?).
Теперь я должен сказать, что я совершенно не знаком с python, так что извините, если я пропущу очевидное!
Проблема заключается в том, что когда я использую gscholar.py
, как описано в файле README, я получаю в результате
query() takes at least 2 arguments (1 given)
.
Даже когда я указываю другой аргумент (например, gscholar.query("my query", allresults=True)
, я получаю
query() takes at least 2 arguments (2 given)
.
Это меня озадачивает. Я также попытался указать третий возможный аргумент (outformat=4
; это формат BibTex), но это дает мне список ошибок функции. Один из моих коллег посоветовал мне импортировать BeautifulSoup и this перед запуском запроса, но также это не изменит проблему. Любые предложения по решению проблемы?
Я нашел код для R (см. ссылка) в качестве решения, но быстро заблокирован Google. Может быть, кто-то может предложить, как улучшить этот код, чтобы избежать блокировки? Любая помощь будет оценена! Спасибо!
Ответы
Ответ 1
Я предлагаю вам не использовать конкретные библиотеки для обхода определенных сайтов, а использовать общедоступные 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
И затем загрузите требуемый URL-адрес следующим образом:
openurl(url).read()
Для получения результатов учебы просто используйте http://scholar.google.se/scholar?hl=en&q=${query}
url.
Чтобы извлечь фрагменты информации из извлеченного HTML файла, вы можете использовать этот фрагмент кода:
from bs4 import SoupStrainer, BeautifulSoup
page = BeautifulSoup(openurl(url).read(), parse_only=SoupStrainer('div', id='gs_ab_md'))
Этот фрагмент кода извлекает конкретный элемент div
, который содержит количество результатов, показанных на странице результатов поиска Google Scholar.
Ответ 2
Google заблокирует вас... поскольку будет очевидно, что вы не браузер. А именно, они будут обнаруживать одну и ту же сигнатуру запроса, которая происходит слишком часто для человеческой деятельности....
Вы можете сделать:
Ответ 3
Похоже, что соскабливание с Python и R сталкивается с проблемой, когда Google Scholar видит ваш запрос в виде роботизированного запроса из-за отсутствия агента-пользователя в запросе. В StackExchange есть аналогичный вопрос о загрузке всех pdf файлов, связанных с веб-страницей, и ответ заставляет пользователя wget в Unix и пакет BeautifulSoup в Python.
Curl также представляется более перспективным направлением.
Ответ 4
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, но могу дать вам общий алгоритм для исправления этого:
- используйте обычный браузер (firefox или что-то еще) для доступа к URL-адресу при мониторинге HTTP-трафика (мне нравится wirehark).
- принять во внимание все заголовки, отправленные в соответствующем запросе http
- попробуйте запустить script, а также отметьте заголовки
- укажите разницу
- установите R script, чтобы использовать заголовки, которые вы видели при просмотре трафика браузера.
Ответ 5
вот сигнатура вызова query()...
def query(searchstr, outformat, allresults=False)
таким образом, вам нужно указать по крайней мере параметр searchstr и outformat, а allresults - необязательный флаг/аргумент.
Ответ 6
Вы можете использовать Greasemonkey для выполнения этой задачи. Преимущество заключается в том, что Google не сможет обнаружить вас как бота, если вы дополнительно сохраните частоту запроса. Вы также можете посмотреть, как script работает в вашем окне браузера.
Вы можете научиться самостоятельно его кодировать или использовать script из одного из этих источников.