JRazor
@JRazor
Senior StarkOverFlow Programmer

Scrapy: как передать ссылку в функцию, чтобы она ее, в свою очередь, отослала в Selector?

Здраствуйте, уважаемые тостеровцы.

При построении паука наткнулся на одну интересную вещь - нужно передать ссылку в функцию, чтобы она ее, в свою очередь, отослала в Selector. Перепробовал уже все доступные Response и Request методы Scrapy, но данные не приходят.

Кусочек кода для понимания:

start_urls = [
        "http://www.site.ru/"
    ]

    # Парсим start_urls и получаем список ссылок на каталоги
    def parse(self, response):  
        sel = Selector(response)
        self.links = sel.xpath('//*[@id="col-01"]/div/div/ul/li/a/@href').extract()

    # Парсим каждый каталог и получаем список ссылок на элементы каталога
    def parse_catalog(self, response): 
        sel = Selector(response)
        elements = sel.xpath('//*[@id="col-01"]/div[1]/ul[1]/
                                        li[4]/div[2]/strong/text()').extract()[0]
        links_auto = sel.xpath('//div[@class="car-detail-list"]/a/@href').extract()

        # Отправляем ссылку на парсинг страницы
        for link in links_auto:
            self.parse_page(link)

    def parse_page(self, link):
        response = <b>???</b>(link) # Обрабатываем ссылку, но чем?
        self.sel = Selector(response)
  • Вопрос задан
  • 2956 просмотров
Решения вопроса 1
@WalterWhite
Не нужно вызывать никакие методы у Request. Scrapy сам вызовет всё что нужно, и когда нужно.
Паук от страницы может получить данные(Item) или путь(Request) или и то и другое одновременно. Вам нужно возвращать из методов последовательности из Request и/или Item.
def parse(self. response):
    sel = Selector(response)
    # из стартовой страницы выдёргиваем список категорий (носки, трусы, рубашки...)
    for catalog_link in sel.xpath('// . . . . /@href'):
        # указываем что нужно будет запросить страницу по ссылке, 
        # а результат(Response) обработать в методе
        yield Request(url=catalog_link, callback=self.parse_catalog)

def parse_catalog(self, response):
    # ответы сервера будут сыпаться сюда
    sel = Selector(response)
    
    # если сама категория представляет интерес то описываем её
    category = MyCategoryItem()
    category['name'] = sel.xpath( . . .                     # как называется
    category['count'] =  . . .                              # сколько товаров
    . . .
    # и выбрасываем из метода
    yield category
    
    # получаем список ссылок на конкретные рубашки
    for page_link in sel.xpath('//. . . ./@href'):
        # выбрасываем из метода
        yield Response(url=page_link, callback=self.parse_page)

def parse_page(self, response):
     . . .
     item = MyGoodsItem()
     . . .
     yield item

Но проще будет прочитать документацию.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы