Scrapy - analyser une page afin d'extraire les éléments - ensuite, suivre et stocker de l'élément de contenu de l'url
J'ai une question sur la façon de faire cette chose en scrapy. J'ai une araignée qui rampe pour les pages de liste d'éléments.
Chaque fois qu'une page de la liste est trouvé, avec des articles, il y a le parse_item() de callback qui est appelée pour l'extraction des éléments de données, et de donner des éléments. C'est très bien, tout fonctionne très bien.
Mais chaque élément, parmi d'autres données, une url, avec plus de détails sur ce point. Je veux suivre cette url et de les stocker dans un autre champ d'élément (url_contents) extraites contenu de l'élément de l'url.
Et je ne suis pas sûr de savoir comment organiser le code de réaliser que, depuis les deux liens (listes de lien, et en particulier d'un élément de liaison) sont suivies de manière différente, avec des rappels appelé à des moments différents, mais j'ai de les corréler dans le même élément de traitement.
Mon code ressemble tellement loin de cela:
class MySpider(CrawlSpider):
name = "example.com"
allowed_domains = ["example.com"]
start_urls = [
"http://www.example.com/?q=example",
]
rules = (
Rule(SgmlLinkExtractor(allow=('example\.com', 'start='), deny=('sort='), restrict_xpaths = '//div[@class="pagination"]'), callback='parse_item'),
Rule(SgmlLinkExtractor(allow=('item\/detail', )), follow = False),
)
def parse_item(self, response):
main_selector = HtmlXPathSelector(response)
xpath = '//h2[@class="title"]'
sub_selectors = main_selector.select(xpath)
for sel in sub_selectors:
item = ExampleItem()
l = ExampleLoader(item = item, selector = sel)
l.add_xpath('title', 'a[@title]/@title')
......
yield l.load_item()
Vous devez vous connecter pour publier un commentaire.
Après quelques tests et de la pensée, j'ai trouvé cette solution qui fonctionne pour moi.
L'idée est d'utiliser uniquement la première règle, qui vous donne des listes d'éléments, et également, très important, ajoutez suivre=True à la règle.
Et dans parse_item() vous avez pour obtenir une demande à la place d'un article, mais une fois que vous chargez de l'élément. La demande est le point de détail de l'url. Et vous devez envoyer le chargé d'élément pour que la demande de rappel. Vous faites votre travail avec la réponse, et il est l'endroit où vous le rendement de l'élément.
Donc l'arrivée de parse_item() ressemble à ceci:
Et puis parse_url_contents() ressemble à ceci:
Si quelqu'un a une autre (mieux) approche, laissez-nous savoir.
Stefan
Je suis assis avec exactement le même problème, et le fait que personne n'a répondu à votre question, pour 2 jours, j'en déduis que la seule solution est de suivre l'URL manuellement, à partir de l'intérieur de votre
parse_item
fonction.Je suis nouveau sur Scrapy, je ne voudrais pas essayer avec ça (bien que je suis sûr que c'est possible), mais ma solution sera d'utiliser
urllib
et BeatifulSoup pour charger la deuxième page manuellement, extraire cette information moi-même, et l'enregistrer en tant que partie de l'Élément. Oui, beaucoup plus de mal que de Scrapy fait normal de l'analyse, mais il devrait faire le travail avec le moins de tracas.