Выявление проблемы при получении href из Google Scholar

Возникли проблемы с извлечением ссылок и названий статей из Google Scholar. Я не уверен, связана ли проблема с моим кодом или xpath, который я использую для извлечения данных, или, возможно, с обоими?

Я уже провел последние несколько часов, пытаясь отладить/проконсультироваться с другими запросами stackoverflow, но безуспешно.

import scrapy
from scrapyproj.items import ScrapyProjItem

class scholarScrape(scrapy.Spider):

    name = "scholarScraper"
    allowed_domains = "scholar.google.com"
    start_urls=["https://scholar.google.com/scholar?hl=en&oe=ASCII&as_sdt=0%2C44&q=rare+disease+discovery&btnG = "]

    def parse(self,response):
        item = ScrapyProjItem()
        item['hyperlink'] = item.xpath("//h3[class=gs_rt]/a/@href").extract()
        item['name'] = item.xpath("//div[@class='gs_rt']/h3").extract()
        yield item

В сообщениях об ошибках, которые я получаю, говорится: «AttributeError: xpath», поэтому я считаю, что проблема связана с путем, который я использую для получения данных, но я также могу ошибаться?

Проблема с объектами scrapyproj.items.ScrapyProjItem: у них нет атрибута xpath. Это официальный курс по скраппингу? Я думаю, вы хотели вызвать xpath на response.

Mathias Müller 03.07.2019 21:36

Спасибо за «ответ» — вы были правы, проблема была решена после того, как я попытался вызвать xpath на response. Спасибо!

ewan 03.07.2019 23:57
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
156
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Добавление моего комментария в качестве ответа, поскольку он решил проблему:

Проблема с объектами scrapyproj.items.ScrapyProjItem: у них нет атрибута xpath. Это официальный курс по скраппингу? Я думаю, вы хотели вызвать xpath на response:

item['hyperlink'] = response.xpath("//h3[class=gs_rt]/a/@href").extract()
item['name'] = response.xpath("//div[@class='gs_rt']/h3").extract()

Кроме того, для первого выражения пути может потребоваться набор кавычек вокруг значения атрибута «gs_rt»:

item['hyperlink'] = response.xpath("//h3[class='gs_rt']/a/@href").extract()

Кроме того, выражения XPath в порядке.

Альтернативное решение с использованием bs4:

from bs4 import BeautifulSoup
import requests, lxml, os

headers = {
    'User-agent':
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
}

html = requests.get('https://scholar.google.com/citations?hl=en&user=m8dFEawAAAAJ', headers=headers).text
soup = BeautifulSoup(html, 'lxml')

# Container where all articles located
for article_info in soup.select('#gsc_a_b .gsc_a_t'):
  # title CSS selector
  title = article_info.select_one('.gsc_a_at').text
  # Same title CSS selector, except we're trying to get "data-href" attribute
  # Note, it will be relative link, so you need to join it with absolute link after extracting.
  title_link = article_info.select_one('.gsc_a_at')['data-href']
  print(f'Title: {title}\nTitle link: https://scholar.google.com{title_link}\n')

# Part of the output:
'''
Title: Automating Gödel's Ontological Proof of God's Existence with Higher-order Automated Theorem Provers.
Title link: https://scholar.google.com/citations?view_op=view_citation&hl=en&user=m8dFEawAAAAJ&citation_for_view=m8dFEawAAAAJ:-f6ydRqryjwC
'''

В качестве альтернативы вы можете сделать то же самое с API авторских статей Google Scholar из SerpApi.

Главное отличие в том, что вам не нужно думать о поиске хороших прокси, пытаясь решить CAPTCHA, даже если вы используете selenium. Это платный API с бесплатным планом.

Код для интеграции:

from serpapi import GoogleSearch
import os

params = {
  "api_key": os.getenv("API_KEY"),
  "engine": "google_scholar_author",
  "author_id": "9PepYk8AAAAJ",
}

search = GoogleSearch(params)
results = search.get_dict()

for article in results['articles']:
  article_title = article['title']
  article_link = article['link']

# Part of the output:
'''
Title: p-GaN gate HEMTs with tungsten gate metal for high threshold voltage and low gate current
Link: https://scholar.google.com/citations?view_op=view_citation&hl=en&user=9PepYk8AAAAJ&citation_for_view=9PepYk8AAAAJ:bUkhZ_yRbTwC
'''

Disclaimer, I work for SerpApi.

Другие вопросы по теме