2017-04-21 30 views
-1

我想从多个URL中刮取信息。我使用下面的代码,但它不起作用。请有人指出我出错的地方?使用scrapy中的for循环从多个URL中刮取信息

import scrapy 

class spider1(scrapy.Spider): 
    name = "spider1" 
    domain = "http://www.amazon.com/dp/" 
    ASIN = ['B01LA6171I', 'B00OUKHTLO','B00B7LUVZK'] 

    def start_request(self): 
     for i in ASIN: 
      yield scrapy.Request(url=domain+i,callback = self.parse) 

    def parse(self, response): 
     title =response.css("span#productTitle::text").extract_first().strip() 
     ASIN_ext = response.xpath("//input[@name='ASIN']/@value").extract_first() 
     data = {"ASIN":ASIN_ext,"title":title,} 
     yield data 
+1

请解释你会得到什么错误? –

+0

日志没有显示任何错误。但只是说,0页被抓取。 – user45857

回答

4

你只需要一个“s”添加到第一个功能

def start_requests(self): 

细微的差别,但Scrapy查找特定功能,所以它必须完全匹配。

+0

谢谢!如果我将“域”和“ASIN”变量移动到start_requests()块中,它将起作用。我是Python和scrapy的新手。我可以如何让这两个变量可以访问类中定义的所有函数? – user45857

+0

就你而言,只需在引用它们时用类名称加前缀即可。您定义它们的方式很好,但是当您参考时,它将是spider1.domain和spider1.ASIN。请看这里了解更多关于类和对象变量的区别:https://www.ibiblio.org/g2swap/byteofpython/read/class-and-object-vars.html –

+0

@ user45857,可以使用类属性在类方法中作为第一个参数传递的'self'对象,例如'def start_request(self): for self in.ASIN:' –