web-dev-qa-db-fra.com

Scrapy: Suivez le lien pour obtenir des données supplémentaires sur les articles?

Je n'ai pas de problème de code spécifique, je ne sais pas comment aborder le problème suivant de manière logistique avec le cadre Scrapy:

La structure des données que je souhaite gratter est généralement une ligne de tableau pour chaque élément. Assez simple, non?

En fin de compte, je veux gratter les Titre, Date d'échéance et Détails pour chaque ligne. Titre et Date d'échéance sont immédiatement disponibles sur la page ...

MAIS les Détails eux-mêmes ne sont pas dans le tableau - mais plutôt, un lien vers la page contenant les détails (si cela n'a pas de sens, voici un tableau):

|-------------------------------------------------|
|             Title              |    Due Date    |
|-------------------------------------------------|
| Job Title (Clickable Link)     |    1/1/2012    |
| Other Job (Link)               |    3/2/2012    |
|--------------------------------|----------------|

Je crains de ne toujours pas savoir comment transmettre l'article avec des rappels et des demandes, même après avoir lu la section CrawlSpider de Scrapy Documentation.

33
dru

S'il vous plaît, lisez d'abord le docs pour comprendre ce que je dis.

La réponse:

Pour supprimer des champs supplémentaires qui se trouvent sur d'autres pages, dans une méthode d'analyse, extrayez l'URL de la page avec des informations supplémentaires, créez et renvoyez à partir de cette méthode d'analyse un objet Request avec cette URL et transmettez les données déjà extraites via son paramètre meta .

comment fusionner les résultats de la page cible à la page actuelle en un clin d'œil?

27
warvariuc

Un exemple tiré de documentation approximative :

def parse_page1(self, response):
    item = MyItem()
    item['main_url'] = response.url
    request = scrapy.Request("http://www.example.com/some_page.html",
                             callback=self.parse_page2)
    request.meta['item'] = item
    yield request

def parse_page2(self, response):
    item = response.meta['item']
    item['other_url'] = response.url
    yield item
19
Chitrasen

Vous pouvez également utiliser Python functools.partial pour passer un item ou toute autre donnée sérialisable via des arguments supplémentaires au prochain rappel Scrapy.

Quelque chose comme:

import functools

# Inside your Spider class:

def parse(self, response):
  # ...
  # Process the first response here, populate item and next_url.
  # ...
  callback = functools.partial(self.parse_next, item, someotherarg)
  return Request(next_url, callback=callback)

def parse_next(self, item, someotherarg, response):
  # ...
  # Process the second response here.
  # ...
  return item
3
Jan Wrobel