2016-05-12 4 views
0

Я пытаюсь получить доступ к ответу (url как условие) из функции process_links, поэтому я могу переписать URL-адрес. Есть какой-либо способ сделать это? В настоящее время я получаю ошибку: process_links() занимает ровно 3 аргумента (2 приведены)Любой способ получить ответный url от функции process_links с помощью Scrapy?

class Spider(CrawlSpider): 
    name = 'spider_1' 
    allowed_domains = 'domain.com', 
    start_urls = (
     'http://domain.com/new/1.html?content=image', 
     'http://domain.com/new/1.html?content=video', 
    ) 

    rules = [ 
     Rule(LinkExtractor(allow =(), restrict_xpaths=('//div[@class="pagination"]')), callback='parse_page', process_links='process_links', follow=True) 
    ] 

def process_links(self, links, resp): 
    for link in links: 
     if 'content=photo' in resp.url: 
      link.url = "%s?content=photo" % link.url 
     else: 
      link.url = "%s?content=video" % link.url 
    return links 

ответ

1

Изменить

def process_links(self, links, resp): 

в

def process_links(self, links): 

Вы ожидаете получить ответ в вашей функции , но Scrapy дает вам только ссылки.

Может быть что-то подобное, что может быть то, что вы хотите:

rules = [ 
    Rule(LinkExtractor(allow = ('content=photo'), restrict_xpaths=('//div[@class="pagination"]')), callback='parse_page', process_links='process_photo_links', follow=True), 
    Rule(LinkExtractor(allow =(), restrict_xpaths=('//div[@class="pagination"]')), callback='parse_page', process_links='process_video_links', follow=True), 
] 

def process_photo_links(self, links, resp): 
    for link in links: 
     link.url = "%s?content=photo" % link.url 
    return links 

def process_photo_links(self, links, resp): 
    for link in links: 
     link.url = "%s?content=video" % link.url 
    return links 

Update после комментария:

Да, Scrapy ли передать ответ на process_links. Вы можете просто игнорировать правила и генерировать запрос Ваших себя:

def parse_page(self, response): 

    ... 

    links = LinkExtractor(allow =(), restrict_xpaths=('//div[@class="pagination"]')).extract_links(response) 

    for link in links: 
     if 'content=photo' in response.url: 
      link.url = "%s?content=photo" % link.url 
     else: 
      link.url = "%s?content=video" % link.url 

     yield scrapy.Request(link.url, callback=self.parse_page) 
+0

проблемы является, что ни одна из ссылок, выделенных из страницы не содержит 'содержание = *', поэтому я пытаюсь добавить его. Я пытаюсь обнаружить его из URL-адреса ответа (ранее переписанные URL-адреса). Не похоже, что есть какой-либо способ для scrapy передать ответ process_links. Мне может быть не повезло. – user2980769

+0

Похоже, что LinkExtractor не будет работать в этом сценарии, но концепция имеет смысл. 'AttributeError: объект LxmlLinkExtractor 'не имеет атрибута' extract'' – user2980769

+0

Извините, моя ошибка. Это должно быть 'extract_links' – Djunzu