2016-05-12 12 views
0

process_links関数からレスポンス(条件としてのURL)にアクセスしようとしていますので、URLを書き換えることができます。これを行う方法はありますか?現在、私はエラーを取得:process_links()あなたは、あなたの関数で応答を受け取ることを期待Scrapでprocess_links関数から応答URLを取得する方法はありますか?

def process_links(self, links): 

に(与えられた2)

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): 

正確に3つの引数を取りますしかし、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 

更新:

はい、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)からそれを検出しようとしています。治療法がprocess_linksへの応答を渡す方法はないようです。私は運がないかもしれない。 – user2980769

+0

LinkExtractorのように見えますが、このシナリオでは機能しませんが、コンセプトは理にかなっています。 'AttributeError: 'LxmlLinkExtractor'オブジェクトに 'extract''12属性がありません。 – user2980769

+0

申し訳ありませんが、私のせいです。 'extract_links'でなければなりません。 – Djunzu

関連する問題