Несколько страниц на элемент - с помощью скребущих ссылок - PullRequest
0 голосов
/ 16 мая 2018

Мой паук выглядит следующим образом /;

class ScrapeMovies(scrapy.Spider):

    start_urls = [
        'https://www.trekearth.com/members/page1.htm?sort_by=md'
    ]

    def parse(self, response):
        for row in response.xpath('//table[@class="member-table"]//tr[position() > 1]'):

            item = loopitem()
            website = row.xpath('./td[2]//a/@href/text()').extract_first()
            item['name'] = row.xpath('./td[2]//a/text()').extract_first()

            yield item
   # This part is responsible for scraping all of the pages on a start url commented out for convinience    
#       next_page=response.xpath('//div[@class="page-nav-btm"]/ul/li[last()]/a/@href').extract_first()
#       if next_page is not None:
#            next_page=response.urljoin(next_page)
#            yield scrapy.Request(next_page, callback=self.parse)

Что он делает, так как знает, что очищает таблицу (см. Начальный URL).Я хочу, чтобы он затем перешел по ссылке (столбец имени участника) и затем извлек некоторую информацию из этой ссылки (ссылка, например, https://www.trekearth.com/members/monareng/) и вернула ее как элемент.

Как мне подойти к этому?

Если что-то неясно, пожалуйста, не стесняйтесь просить разъяснения.

РЕДАКТИРОВАТЬ: Теперь мой код выглядит следующим образом (однако все еще не работает):

class ScrapeMovies(scrapy.Spider):
    name='final'

    start_urls = [
        'https://www.trekearth.com/members/page1.htm?sort_by=md'
    ]

    def parse(self, response):
        for row in response.xpath('//table[@class="member-table"]//tr[position() > 1]'):

            item = FinalItem()    
            website = row.xpath('./td[2]//a/@href/text()').extract_first()
            item['name'] = row.xpath('./td[2]//a/text()').extract_first()

            request = scrapy.Request(website,
            callback=self.parse_page2)
            request.meta['item'] = item
            return request

    def parse_page2(self, response): 
        item = response.meta['item']
        item['other_url'] = response.url
        item['groups'] = response.xpath('//div[@class="groups-btm"]/ul/li/text()').extract_first()
        return item

1 Ответ

0 голосов
/ 16 мая 2018

Используйте поле meta , чтобы переместить элемент к следующему обратному вызову

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

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

UPD: для обработки всех строк используйте yield в цикле

    for row in response.xpath('//table[@class="member-table"]//tr[position() > 1]'):

        item = FinalItem()    
        website = row.xpath('./td[2]//a/@href/text()').extract_first()
        item['name'] = row.xpath('./td[2]//a/text()').extract_first()

        request = scrapy.Request(website,
        callback=self.parse_page2)
        request.meta['item'] = item
        yield request
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...