2016-03-15 130 views
0

我以前使用过scrapy,但是只能从一个站点获取信息。我想使用scrapy从不同网站上的目录中获取信息。在这些网站的每一个上,信息都存储在一个简单的html表格中,标题相同。我如何校准scrapy以从每个html表中获取数据,即使表类可能因网站而异?在更大的范围内,我问的是如何使用scrapy,当我想击中不同格式的不同网站时。我将在下面列出几个网站的html源代码和xpaths的图片。如何对scrapy进行编码以获取不同格式的html表格

表的字段,或多或少相同为每个站点目录1]

为位点1中的XPath的名称列2]

中的XPath站点2的名称列3]

网站1

一般的HTML格式,用电话号码模糊了网站2的4]

一般的HTML格式

的第三个网站,比第2,但仍然有4列6]

回答

1

是的 - 为每个站点编写一个蜘蛛都有点​​痛苦,特别是如果有100个和所有这些蜘蛛都是相同的。

如果它适合您的需要,您可能希望将每个站点的XPath存储在一个文件中,例如一个csv file。如果你需要你的蜘蛛释放到例如

def start_requests(self): 
    with open(getattr(self, "file", "todo.csv"), "rU") as f: 
     reader = csv.DictReader(f) 
     for line in reader: 
      request = Request(line.pop('url')) 
      request.meta['fields'] = line 
      yield request 

def parse(self, response): 

    xpath = response.meta['fields']['tablexpath'] 
    ... use xpath it to extract your table 

:然后你就可以从CSV获取URL和表达,并在您的蜘蛛使用它们(改编自here) scrapyd或scrapinghub,您需要将您的.csv文件与您的代码一起打包。要做到这一点,你将不得不修改setup.pyshub deployscrapyd-client产生并添加:

setup(
... 
    package_data={'myproject': ['my_csv.csv']} 
) 

而且在你的蜘蛛,而不是直接与open打开你的文件,你应该使用这样的:

from pkg_resources import resource_stream 
f = resource_stream('myproject', 'my_csv.csv') 

这是example。如果你不部署你的蜘蛛,只要忽略上述。如果你这样做会为你节省几个小时的调试时间。

1

表不同的通用格式我这样做,通过创建与每个站点一个蜘蛛scrapy项目,并使用同一项目所有不同的蜘蛛类。

相关问题