2017-08-20 107 views
0

我试图用python scrapy创建一个解析器,它应该从网页中提取一些字段。我在这里面临的问题是,我无法以正确的方式将参数传递给蜘蛛类中的“target_page”方法。我知道我将“标题”和“值”字段从“parse”方法传递给“target_page”的方式并不是pythonic。但是,我做到了,因为我真的不知道如何以正确的方式在“target_page”方法中传递上述字段。我该怎么做?提前致谢。无法将某些字段从一种方法传递到另一种方法

import scrapy 

class BrokerSpider(scrapy.Spider): 

    name = "brokersp" 
    start_urls = ["https://www.mql5.com/en/signals/mt4/page{0}".format(page_num) for page_num in range(1,10)] 

    def parse(self, response): 
     for links in response.css("div#signals-table div.signal"): 
      caption = links.css('span.name::text').extract_first() 
      value = links.css('div.col-price::text').extract_first() 
      link = links.css('a.signal-avatar::attr(href)').extract_first() 
      yield scrapy.Request(caption, value, url = link, callback = self.target_page) 

    def target_page(self, title, price, response): 
     jobber = response.css('div.header span a::text').extract_first() 
     profit = response.css('div.cell.total a.blue::text').extract_first() 
     yield {'title':title,'price':price,'jobber':jobber,'profit':profit} 

回答

3

可以使用要求(documentation)的meta属性:

def parse(self, response): 
    for links in response.css("div#signals-table div.signal"): 
     caption = links.css('span.name::text').extract_first() 
     value = links.css('div.col-price::text').extract_first() 
     link = links.css('a.signal-avatar::attr(href)').extract_first() 
     request = scrapy.Request(url = link, callback = self.target_page) 
     request.meta['caption'] = caption 
     request.meta['value'] = value 
     yield request 

def target_page(self, response): 
    caption = response.meta['caption'] 
    value = response.meta['value'] 
    jobber = response.css('div.header span a::text').extract_first() 
    profit = response.css('div.cell.total a.blue::text').extract_first() 
    yield {'title':caption,'price':value,'jobber':jobber,'profit':profit} 
+0

感谢PRMoureu照顾的解决方案。我从我的手机发送这个文本。只要我在我的电脑附近,我会给你反馈。再次感谢。 – SIM

+0

@Shahin,你还没有测试好东西,我只是修正了一些东西 – PRMoureu

+0

你是救命PRMoureu。非常感谢给我这个想法。目前我无法运行这个特定的脚本,因为我的服务器上该站点的“403”状态。但是,如果稍后执行代码时遇到任何问题,我会通知您。再次感谢。 – SIM

相关问题