Невозможно перейти по ссылкам в Scrapy

Сейчас я начинаю со Scrapy, и я понял, как брать нужный мне контент со спортивной страницы (имя и команда футболиста), но мне нужно следовать ссылкам в поисках других команд, на каждой странице команды есть ссылка на страницу игроков, структура ссылки на сайт:

страница команды: http://esporte.uol.com.br/futebol/clubes/vitoria/ страница игрока: http://esporte.uol.com.br/futebol/clubes/vitoria/jogadores/

Я прочитал несколько руководств по Scrapy и думаю, что на страницах команд я должен переходить по ссылкам и ничего не анализировать, а на странице игроков я должен не следовать и анализировать игроков, я не знаю, Я прав с этой идеей и не прав с синтаксисом, если моя идея следования неверна, любая помощь приветствуется.

вот мой код:

class MoneyballSpider(BaseSpider):
    name = "moneyball"
    allowed_domains = ["esporte.uol.com.br", "click.uol.com.br", "uol.com.br"]
    start_urls = ["http://esporte.uol.com.br/futebol/clubes/vitoria/jogadores/"]

    rules = (
        Rule(SgmlLinkExtractor(allow=(r'.*futebol/clubes/.*/', ), deny=(r'.*futebol/clubes/.*/jogadores/', )), follow = True),
        Rule(SgmlLinkExtractor(allow=(r'.*futebol/clubes/.*/jogadores/', )), callback='parse', follow = True),
        )

    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        jogadores = hxs.select('//div[@id="jogadores"]/div/ul/li')
        items = []
        for jogador in jogadores:
            item = JogadorItem()
            item['nome'] = jogador.select('h5/a/text()').extract()
            item['time'] = hxs.select('//div[@class="header clube"]/h1/a/text()').extract()
            items.append(item)
            print item['nome'], item['time']
        return items

person Conrado Costa    schedule 19.09.2013    source источник
comment
Ну работает или нет?   -  person Ofir Israel    schedule 19.09.2013


Ответы (1)


Во-первых, поскольку вам нужно переходить по ссылкам на выдержки, вам нужен CrawlSpider вместо BaseSpider. Затем вам нужно определить два правила: одно для игроков с обратным вызовом и одно для команд без него. Кроме того, вы должны начать с URL-адреса со списком команд, например http://esporte.uol.com.br/futebol. Вот полный паук, который возвращает игроков из разных команд:

from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import Rule, CrawlSpider
from scrapy.item import Item, Field
from scrapy.selector import HtmlXPathSelector


class JogadorItem(Item):
    nome = Field()
    time = Field()


class MoneyballSpider(CrawlSpider):
    name = "moneyball"
    allowed_domains = ["esporte.uol.com.br", "click.uol.com.br", "uol.com.br"]
    start_urls = ["http://esporte.uol.com.br/futebol"]

    rules = (Rule(SgmlLinkExtractor(allow=(r'.*futebol/clubes/.*?/jogadores/', )), callback='parse_players', follow=True),
             Rule(SgmlLinkExtractor(allow=(r'.*futebol/clubes/.*', )), follow=True),)

    def parse_players(self, response):
        hxs = HtmlXPathSelector(response)
        jogadores = hxs.select('//div[@id="jogadores"]/div/ul/li')
        items = []
        for jogador in jogadores:
            item = JogadorItem()
            item['nome'] = jogador.select('h5/a/text()').extract()
            item['time'] = hxs.select('//div[@class="header clube"]/h1/a/text()').extract()
            items.append(item)
            print item['nome'], item['time']
        return items

Цитата из вывода:

...
[u'Silva'] [u'Vila Nova-GO']
[u'Luizinho'] [u'Vila Nova-GO']
...
[u'Michel'] [u'Guarani']
[u'Wellyson'] [u'Guarani']
...

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

Надеюсь, это поможет.

person alecxe    schedule 19.09.2013