Очистка «следующей» страницы после завершения в основной с использованием правил - PullRequest
2 голосов
/ 06 июня 2019

Я пытаюсь сделать паука, который счищает товары со страницы и, когда закончит, очищает следующую страницу в каталоге и следующую после этого и т. Д.

Я получил все продукты со страницы (я соскребаю амазонку) с

rules = {

        Rule(LinkExtractor(allow =(), restrict_xpaths = ('//a[contains(@class, "a-link-normal") and contains(@class,"a-text-normal")]') ), 
                                callback = 'parse_item', follow = False)

    }

И это прекрасно работает. Проблема в том, что я должен перейти на следующую страницу и продолжить чистку.

То, что я пытался сделать, это правило, подобное этому

rules = {

        #Next Button
        Rule(LinkExtractor(allow =(), restrict_xpaths = ('(//li[@class="a-normal"]/a/@href)[2]') )),

}

Проблема в том, что xPath возвращает (например, с этой страницы: https://www.amazon.com/s?k=mac+makeup&lo=grid&page=2&crid=2JQQNTWC87ZPV&qid=1559841911&sprefix=MAC+mak%2Caps%2C312&ref=sr_pg_2)

/s?k=mac+makeup&lo=grid&page=3&crid=2JQQNTWC87ZPV&qid=1559841947&sprefix=MAC+mak%2Caps%2C312&ref=sr_pg_3

Какой будет URL для следующей страницы, но без www.amazon.com.

Я думаю, что мой код не работает, потому что я пропускаю www.amazon.com перед указанным выше URL.

Есть идеи, как заставить это работать? Может быть, то, как я поступил, не совсем правильно.

1 Ответ

2 голосов
/ 06 июня 2019

Попробуйте использовать urljoin.

link = "/s?k=mac+makeup&lo=grid&page=3&crid=2JQQNTWC87ZPV&qid=1559841947&sprefix=MAC+mak%2Caps%2C312&ref=sr_pg_3"


new_link = response.urljoin(link)

Следующий паук - возможное решение, основные идеи которого - использовать функцию parse_links для получения ссылок на отдельную страницу, которая дает ответ на функцию parse, ивы также можете выдавать ответ на следующей странице той же функции, пока не просканировали все страницы.


class AmazonSpider(scrapy.spider):

    start_urls = ['https://www.amazon.com/s?k=mac+makeup&lo=grid&crid=2JQQNTWC87ZPV&qid=1559870748&sprefix=MAC+mak%2Caps%2C312&ref=sr_pg_1'
    wrapper_xpath = '//*[@id="search"]/div[1]/div[2]/div/span[3]/div[1]/div' # Product wrapper
    link_xpath = './//div/div/div/div[2]/div[2]/div/div[1]/h2/a/@href' # Link xpath
    np_xpath = '(//li[@class="a-normal"]/a/@href)[2]' # Next page xpath


    def parse_links(self, response):
        for li in response.xpath(self.wrapper_xpath):
            link = li.xpath(self.link_xpath).extract_first()
            link = response.urljoin(link)
            yield scrapy.Request(link, callback = self.parse)

        next_page = response.xpath(self.np_xpath).extract_first()

        if next_page is not None:
            next_page_link = response.urljoin(next_page)
            yield scrapy.Request(url=next_page_link, callback=self.parse_links)
        else:
            print("next_page is none")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...