Scrapy: как использовать очищенный элемент в качестве переменной для динамического URL - PullRequest
0 голосов
/ 24 апреля 2019

Я хотел бы начать соскоб с последнего номера нумерации страниц.От наивысшей страницы к наименьшей

https://teslamotorsclub.com/tmc/threads/tesla-tsla-the-investment-world-the-2019-investors-roundtable.139047/page-

page-2267 является динамическим, поэтому мне нужно сначала очистить элемент, прежде чем я определю номер последней страницы, а затем разбиение на страницы URL должно выглядеть следующим образомэта страница-2267, страница-2266 ...

вот что я сделал

class TeslamotorsclubSpider(scrapy.Spider):
    name = 'teslamotorsclub'
    allowed_domains = ['teslamotorsclub.com']
    start_urls = ['https://teslamotorsclub.com/tmc/threads/tesla-tsla-the-investment-world-the-2019-investors-roundtable.139047/']

    def parse(self, response):
        last_page = response.xpath('//div[@class = "PageNav"]/@data-last').extract_first()
        for item in response.css("[id^='fc-post-']"):
            last_page = response.xpath('//div[@class = "PageNav"]/@data-last').extract_first()
            datime = item.css("a.datePermalink span::attr(title)").get()
            message = item.css('div.messageContent blockquote').extract()
            datime = parser.parse(datime)
            yield {"last_page":last_page,"message":message,"datatime":datime}

        next_page = 'https://teslamotorsclub.com/tmc/threads/tesla-tsla-the-investment-world-the-2019-investors-roundtable.139047/page-' + str(TeslamotorsclubSpider.last_page)
        print(next_page)
        TeslamotorsclubSpider.last_page = int(TeslamotorsclubSpider.last_page)
        TeslamotorsclubSpider.last_page -= 1
        yield response.follow(next_page, callback=self.parse)   

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

Ответы [ 3 ]

1 голос
/ 24 апреля 2019

У вас есть очень хороший элемент на вашей странице link[rel=next]. Таким образом, вы можете реорганизовать свой код следующим образом: проанализировать страницу, позвонить дальше, проанализировать страницу, позвонить дальше и т. Д.

def parse(self, response):
    for item in response.css("[id^='fc-post-']"):
        datime = item.css("a.datePermalink span::attr(title)").get()
        message = item.css('div.messageContent blockquote').extract()
        datime = parser.parse(datime)
        yield {"message":message,"datatime":datime}

    next_page = response.css('link[rel=next]::attr(href)').get()
    if next_page:
        yield response.follow(next_page, self.parse)   

UPD: вот код, который очищает данные с последней страницы на первую:

class TeslamotorsclubSpider(scrapy.Spider):
    name = 'teslamotorsclub'
    allowed_domains = ['teslamotorsclub.com']
    start_urls = ['https://teslamotorsclub.com/tmc/threads/tesla-tsla-the-investment-world-the-2019-investors-roundtable.139047/']
    next_page = 'https://teslamotorsclub.com/tmc/threads/tesla-tsla-the-investment-world-the-2019-investors-roundtable.139047/page-{}'

    def parse(self, response):
        last_page = response.xpath('//div[@class = "PageNav"]/@data-last').get()
        if last_page and int(last_page):
            # iterate from last page down to first
            for i in range(int(last_page), 0, -1):
                url = self.next_page.format(i)
                yield scrapy.Request(url, self.parse_page)

    def parse_page(self, response):
        # parse data on page
        for item in response.css("[id^='fc-post-']"):
            last_page = response.xpath('//div[@class = "PageNav"]/@data-last').get()
            datime = item.css("a.datePermalink span::attr(title)").get()
            message = item.css('div.messageContent blockquote').extract()
            datime = parser.parse(datime)
            yield {"last_page":last_page,"message":message,"datatime":datime}
0 голосов
/ 24 апреля 2019

В случае с последней страницы на первую страницу, попробуйте следующее:

class TeslamotorsclubSpider(scrapy.Spider):
    name = 'teslamotorsclub'
    start_urls = ['https://teslamotorsclub.com/tmc/threads/tesla-tsla-the-investment-world-the-2019-investors-roundtable.139047/']
    page_start = 'https://teslamotorsclub.com/tmc/threads/tesla-tsla-the-investment-world-the-2019-investors-roundtable.139047/page-{}'
    cbool = False

    def parse(self, response):
        if not self.cbool:
            last_page = response.xpath('//div[@class = "PageNav"]/@data-last').extract_first()
            self.cbool = True
            yield response.follow(self.page_start.format(int(last_page)), callback=self.parse)

        else:
            for item in response.css("[id^='fc-post-']"):
                message = item.css('div.messageContent blockquote::text').extract()
                yield {"message":message} 

            prev_page = response.css("[class='PageNav'] a:contains('Prev')::attr('href')").get()
            yield {"prev_page":prev_page} #Check it whether it is working
            if prev_page:
                yield response.follow(prev_page, callback=self.parse)
0 голосов
/ 24 апреля 2019

Я использую следующий алгоритм для его решения:

Начать с первой страницы.

url = url_page1

xpath_next_page = "//div[@class='pageNavLinkGroup']//a[@class='text' and contains(text(), 'Next')]"

Загрузите первую страницу, делайте ваши вещи, в конце проверьте, присутствует ли этот XPATH в HTML и страница + = 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...