2012-09-18 58 views
2

我对开发非常陌生,对scrapy非常陌生,迄今为止我已经获得了文档,但是我碰到了一堵似乎无法通过的墙。下面是我拥有的基本蜘蛛(为了保护无辜,更改了网址)。使用scrapy收集和存储数据

开始网址包含产品类别列表,这些产品类别列表链接到包含链接到我想要解析的产品页面的子类别列表的页面。

我的蜘蛛目前运行没有错误,似乎取得我想要的所有页面,但不想拨打parse_product()。下面的代码:

# coding=utf-8 
from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.selector import HtmlXPathSelector 
from scrapy.item import Item, Field 

class MySpider(CrawlSpider): 
    name = "MySpider" 
    allowed_domains = ["www.mysite.com"] 
    start_urls = ["http://www.mysite.com/start_page/",] 

    rules = (
    Rule(SgmlLinkExtractor(restrict_xpaths='//body[@class="item"] '),  # Product page 
            callback='parse_product'), 
    Rule(SgmlLinkExtractor(restrict_xpaths="//ul[@id='products_ul']/li"), # First 2 pages - same xpath to follow. 
            ) 
    ) 

    def parse_product(self, response): 
     print " parsing product" # Print statement added for testing purposes - test failed. 
     hxs = HtmlXPathSelector(response) 
     item = MySpiderItem() 
     item['name'] = hxs.select('/xpath/to/name') 
     item['description'] = hxs.select('/xpath/to/description') 
     item['image'] = hxs.select('/xpath/to/image') 
     print item # Print statement added for testing purposes - test failed. 
     return item 


class MySpiderItem(Item): 
    name = Field() 
    description = Field() 
    image = Field() 

问题:

1)如果这个做我想做的事情?

好的,很明显,不,不,这就是为什么我在这里!但我不确定是否这是坏xpaths,或者如果我错误地调用parse_product,例如:我是否需要该产品页面的链接提取器?我没有跟随从那里的链接,但如何我将它们作为目标来解析没有它?)

理论上,它应该只能获得2种类型的页面,猫/子网页与链接列表("//ul[@id='products_ul']/li")是其次和需要的产品页面被解析(仅适用于这些洽标识符<body class="mainpage version2 **item**"> VS <body class="mainpage version2 **category**">

2)如何保存输出到一个CSV(或与此有关的任何其他简单的文本格式)?

这个文档让我感到困惑,(虽然我确信这是由于我缺乏理解而不是穷人的文档,因为总体上它非常出色),它似乎将您发送给您,并给出示例不用说应该写入哪个文件。

我目前正在使用这个蜘蛛作为一个独立的文件与$ scrapy runspider filename.py为了便于测试,但我很乐意将它设置为一个完整的scrapy蜘蛛,如果这使得事情更容易。

+0

你可以在这里找到一个很好的例子:https://gist.github。com/dreamcc/10566630 – davidcondrey

回答

0

确定你没有定义:如果将比赛规则,因此通过defualt它调用parse_product,如果您希望不要在parse_product去应该去你可以提任何回调它会去那里像回调=“parse_other”将在parse_other志不遂parse_product

现在你不设置你必须使用的任何scrapy项目

提示是,你可以在初始化方法创建文件和作家的对象,并在文件中虽然parse_product

如果你想建立sc​​rapy项目

,scrapy自带默认的出口写的每个项目,你只需要提这些设置在settings.py

FEED_EXPORTERS = { 
    'csv': 'scrapy.contrib.exporter.CsvItemExporter', 
} # enabling Csv Exporter 
FEED_FORMAT = 'csv' # output formate 
FEED_URI = "output.csv" # file name and path 

休息scrapy builten出口商会为你做。希望它有帮助

+0

非常感谢,我认为这照顾了我的第二个问题,尽管我仍然对第一个问题感到困惑。你说“如果它匹配规则,你没有定义它应该去的地方”,但是我认为我有?我故意没有给第二条规则添加回调,因为我只是想跟随它捕获的链接,而不需要解析任何东西,然后我想解析这些链接导致的页面,而我虽然在做第一条规则:规则(SgmlLinkExtractor(restrict_xpaths ='// body [@ class =“item”]'), callback ='parse_product'),' 这是不是这种情况? – user1680738