Google Scholar заблокировал меня от использования search_pubs

#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.