используя xpath, перейти на следующую страницу с помощью scrapy

Я создаю паука для сбора данных с веб-сайта. Это было нормально, пока я не добавил сканера с правилом, чтобы он продолжал переходить на следующие страницы. Я предполагаю, что мой xpath в Правиле неверен. Не могли бы вы помочь мне это исправить? Ps: я использую python3

Это мой паук:

import scrapy
from scrapy.contrib.spiders import Rule
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import Spider, CrawlSpider, Rule
from scrapy.selector import Selector
from task11.items import Digi

class tutorial(CrawlSpider):
    name = "task11"
    allowed_domains = ["meetings.intherooms.com"]
    start_urls = ["https://meetings.intherooms.com/meetings/aa/al"]

    rules = (Rule(LinkExtractor(allow=(), restrict_xpaths=('(//a[@class="prevNext" and contains(text(),"Next")])[1]')),callback="parse_page", follow=True),)

    def parse_page(self, response):
        sel = Selector(response)
        sites = sel.xpath('//*[@class="all-meetings"]/tr')
        items = []

        for site in sites[1:]:
            item = Digi()
            item['meeting_title'] = site.xpath('td/text()').extract()
            items.append(item)
        return items

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

2018-08-30 08:59:57 [scrapy.core.scraper] DEBUG: Scraped from <200 https://meetings.intherooms.com/meetings/aa/al>
{'meeting_title': ['Alabama Avenue & Lauderdale Street',
                   'SELMA,  ',
                   'TUESDAY',
                   '7:00 PM',
                   'Alcoholics Anonymous']}
2018-08-30 08:59:57 [scrapy.core.scraper] DEBUG: Scraped from <200 https://meetings.intherooms.com/meetings/aa/al>
{'meeting_title': ['Alabama Avenue & Lauderdale Street',
                   'SELMA,  ',
                   'THURSDAY',
                   '7:00 PM',
                   'Alcoholics Anonymous']}
2018-08-30 08:59:57 [scrapy.core.scraper] DEBUG: Scraped from <200 https://meetings.intherooms.com/meetings/aa/al>
{'meeting_title': ['Alabama Avenue & Lauderdale Street',
                   'SELMA,  ',
                   'SUNDAY',
                   '7:00 PM',
                   'Alcoholics Anonymous']}
2018-08-30 08:59:57 [scrapy.core.scraper] DEBUG: Scraped from <200 https://meetings.intherooms.com/meetings/aa/al>
{'meeting_title': ['210 Lauderdale Street',
                   'SELMA,  36703',
                   'MONDAY',
                   '6:00 PM',
                   'Alcoholics Anonymous']}

person Chi Pham    schedule 29.08.2018    source источник
comment
Не должно быть @href вместо text () ??   -  person Andrés Pérez-Albela H.    schedule 29.08.2018
comment
@ Андрес Перес-Альбела Х.: Я пытался перейти на @href, но это все равно не сработало :(   -  person Chi Pham    schedule 29.08.2018


Ответы (2)


Вам нужно использовать это для restrict_xpaths (не для текста ссылки или href, а для самого узла ссылки):

restrict_xpaths='(//a[@class="prevNext" and contains(text(),"Next")])[1]'
person gangabass    schedule 30.08.2018
comment
Спасибо!!!! теперь он работает отлично. У меня также было 2 другие ошибки: установить follow как False in Rule; и (очень глупая ошибка) написал Spider вместо CrawlSpider. Я уже сейчас обновлю финальную версию в моем Questio. Еще раз огромное спасибо за помощь !!!!!! Извините, у меня недостаточно репутации, чтобы проголосовать за ваш ответ :( - person Chi Pham; 30.08.2018

Я бы использовал класс кнопки «Следующая страница»:

response.xpath('//a[@class="prevNext"]/@href')

В результате получается 2 результата. Один для верхней части и один для стрелки кнопки. Но когда вы открываете первую следующую страницу (2-ю страницу), предыдущая страница также получает ссылку с классом prevNext. Это не большая проблема, потому что scrapy отфильтрует большую часть дополнительных запросов. Но можно ограничить ссылки текстовым фильтром:

response.xpath('//a[contains(text(),"Next")]/@href')

Или, если вы сомневаетесь, что Next есть и в других ссылках, вы можете объединить их:

response.xpath('//a[@class="prevNext" and contains(text(),"Next")]/@href')
person Thomas Strub    schedule 29.08.2018
comment
Спасибо, Томас; но, к сожалению, я не работаю со мной. Позвольте мне показать вам 1 строку в моем результате, которую я уже скопировал с первой страницы (и пытаюсь продолжить со следующих страниц: meeting.intherooms.com/meetings/aa/al› {'meeting_title': ['Alabama Avenue & Lauderdale Street', 'SELMA,', 'TUESDAY', '19:00 PM', ' Анонимные Алкоголики ']} - person Chi Pham; 30.08.2018
comment
Вы спросили, верен ли xpath для следующей страницы или нет, и это было неверно. Включить его в цикл, чтобы он работал правильно, можно сделать самостоятельно ... возможно, проверьте digitalocean.com/community/tutorials/ - person Thomas Strub; 30.08.2018