#python #proxy #tor #google-scholar
#python #прокси #tor #google-scholar
Вопрос:
Я использую Pycharm Community Edition 2020.3.2, академическую версию 1.0.2, версию Tor 1.0.0. Я попытался просмотреть 700 статей, чтобы найти их количество цитирований. Google Scholar заблокировал меня от использования search_pubs (функция Scholarly). Однако другая функция Scholarly, которая является search_author, все еще работает хорошо. Вначале функция search_pubs работала правильно. Я попробовал эти коды.
from scholarly import scholarly
scholarly.search_pubs('Large Batch Optimization for Deep Learning: Training BERT in 76 minutes')
После нескольких попыток отображается следующая ошибка.
Traceback (most recent call last):
File "C:Usersbinhdanaconda3envst2libsite-packagesIPythoncoreinteractiveshell.py", line 3343, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-9-3bbcfb742cb5>", line 1, in <module>
scholarly.search_pubs('Large Batch Optimization for Deep Learning: Training BERT in 76 minutes')
File "C:Usersbinhdanaconda3envst2libsite-packagesscholarly_scholarly.py", line 121, in search_pubs
return self.__nav.search_publications(url)
File "C:Usersbinhdanaconda3envst2libsite-packagesscholarly_navigator.py", line 256, in search_publications
return _SearchScholarIterator(self, url)
File "C:Usersbinhdanaconda3envst2libsite-packagesscholarlypublication_parser.py", line 53, in __init__
self._load_url(url)
File "C:Usersbinhdanaconda3envst2libsite-packagesscholarlypublication_parser.py", line 58, in _load_url
self._soup = self._nav._get_soup(url)
File "C:Usersbinhdanaconda3envst2libsite-packagesscholarly_navigator.py", line 200, in _get_soup
html = self._get_page('https://scholar.google.com{0}'.format(url))
File "C:Usersbinhdanaconda3envst2libsite-packagesscholarly_navigator.py", line 152, in _get_page
raise Exception("Cannot fetch the page from Google Scholar.")
Exception: Cannot fetch the page from Google Scholar.
Затем я понял, что причина в том, что мне нужно передать КАПЧУ из Google, чтобы продолжить получать информацию из Google Scholar. Многие люди предполагают, что мне нужно использовать прокси, поскольку мой IP-адрес был заблокирован Google. Я попытался сменить прокси с помощью FreeProxies ()
from scholarly import scholarly, ProxyGenerator
pg = ProxyGenerator()
pg.FreeProxies()
scholarly.use_proxy(pg)
scholarly.search_pubs('Large Batch Optimization for Deep Learning: Training BERT in 76 minutes')
Это не работает, и Pycharm надолго зависает. Затем я установил Tor (pip install Tor) и повторил попытку:
from scholarly import scholarly, ProxyGenerator
pg = ProxyGenerator()
pg.Tor_External(tor_sock_port=9050, tor_control_port=9051, tor_password="scholarly_password")
scholarly.use_proxy(pg)
scholarly.search_pubs('Large Batch Optimization for Deep Learning: Training BERT in 76 minutes')
Это не работает. Затем я попробовал с помощью SingleProxy ()
from scholarly import scholarly, ProxyGenerator
pg = ProxyGenerator()
pg.SingleProxy(https='socks5://127.0.0.1:9050',http='socks5://127.0.0.1:9050')
scholarly.use_proxy(pg)
scholarly.search_pubs('Large Batch Optimization for Deep Learning: Training BERT in 76 minutes')
Это также не работает. Я никогда не пробовал Luminati, так как я с ним не знаком. Если кто-нибудь знает решение, пожалуйста, помогите!
Ответ №1:
В качестве альтернативы scholarly
решению вы можете попробовать использовать Google Scholar Organic Results API из SerpApi.
Это платный API с бесплатным планом, который обрабатывает обход блоков от Google или других поисковых систем на их серверной части, решая CAPTCHA и вращая прокси, так что вам не нужно.
Код и пример в онлайн-среде разработки:
import os, json
from serpapi import GoogleSearch
from urllib.parse import urlsplit, parse_qsl
params = {
# os.getenv(): https://docs.python.org/3/library/os.html#os.getenv
"api_key": os.getenv("API_KEY"), # your Serpapi API key
"engine": "google_scholar", # search engine
"q": "blizzard", # search query
"hl": "en", # language
# "as_ylo": "2017", # from 2017
# "as_yhi": "2021", # to 2021
"start": "0" # first page
}
search = GoogleSearch(params) # where data extraction happens
organic_results_data = []
papers_is_present = True
while papers_is_present:
results = search.get_dict() # JSON -> Python dictionary
for publication in results["organic_results"]:
organic_results_data.append({
"page_number": results.get("serpapi_pagination", {}).get("current"),
"result_type": publication.get("type"),
"title": publication.get("title"),
"link": publication.get("link"),
"result_id": publication.get("result_id"),
"summary": publication.get("publication_info").get("summary"),
"snippet": publication.get("snippet"),
})
# paginates to the next page if the next page is present
if "next" in results.get("serpapi_pagination", {}):
search.params_dict.update(dict(parse_qsl(urlsplit(results["serpapi_pagination"]["next"]).query)))
else:
papers_is_present = False
print(json.dumps(organic_results_data, indent=2, ensure_ascii=False))
Выводит в этом случае до 100-й страницы:
]
{
"page_number": 1,
"result_type": null,
"title": "Base catalyzed ring opening reactions of erythromycin A",
"link": "https://www.sciencedirect.com/science/article/pii/S004040390074754X",
"result_id": "RRGl5nJoIi4J",
"summary": "ST Waddell, TA Blizzard - Tetrahedron letters, 1992 - Elsevier",
"snippet": "While the direct opening of the lactone of erythromycin A by hydroxide to give the seco acid has so far proved elusive, two types of base catalyzed reactions which lead to rupture of the …"
}, ... other results
{
"page_number": 100,
"result_type": null,
"title": "Síndrome de Johanson-Blizzard: importância do diagnóstico diferencial em pediatria",
"link": "https://www.scielo.br/j/jped/a/Mc3X8DGcZSYQVqnL99kTtBH/abstract/?lang=pt",
"result_id": "z_CmhVgEW2oJ",
"summary": "MW Vieira, VLGS Lopes, H Teruya… - Jornal de …, 2002 - SciELO Brasil",
"snippet": "… Description: we describe a Brazilian girl affected by Johanson-blizzard syndrome and review the literature. Comments: Johanson-Blizzard syndrome is an autosomal recessive …"
}
]
Отказ от ответственности, я работаю в SerpApi.