Следующие просканированные ссылки - PullRequest
0 голосов
/ 18 мая 2018

Имея следующего паука:

import scrapy
from final.items import FinalItem

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()

            item['name'] = row.xpath('./td[2]//a/text()').extract_first()
            website = row.xpath('./td[2]//a/@href/text()').extract_first()
            request = scrapy.Request(website,
            callback=self.parse_page2)
            yield request

    def parse_page2(self, response):
            request.meta['item'] = item
            item['travelog'] = response.xpath('string(//div[@class="statistics-btm"]/ul//li[position()=4]/a)').extract_first()
            yield item

#       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)

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

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

Код, который я написал, не работает должным образом.У меня ошибка:

TypeError: Request url must be str or unicode, got NoneType:

Как это исправить?Как сделать так, чтобы правильно сканировать все данные?

1 Ответ

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

Вам нужен этот код (ваши выражения XPath неверны):

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

        item = FinalItem()

        item['name'] = row.xpath('./td[2]//a/text()').extract_first()
        profile_url = row.xpath('./td[2]//a/@href').extract_first()
        yield scrapy.Request( url=response.urljoin(profile_url), callback=self.parse_profile, meta={"item": item } )

    next_page_url = response.xpath('//div[@class="page-nav-btm"]//li[last()]/a/@href').extract_first()
    if next_page_url:
        yield scrapy.Request( url=response.urljoin(next_page_url), callback=self.parse )

def parse_profile(self, response):
        item = response.meta['item']
        item['travelog'] = response.xpath('//div[@class="statistics-btm"]/ul//li[ ./span[contains(., "Travelogues")] ]/a/text()').extract_first()
        yield item
...