使用scrapy收集和存储数据

时间:2012-09-18 16:44:54

标签: python xpath scrapy

我对开发很陌生,对scrapy很新,我到目前为止已经开始使用docs了,但是我遇到了一条似乎无法通过的墙。下面是我的基本蜘蛛(改变网址以保护无辜者)。

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

我的蜘蛛目前正常运行,似乎抓取了我想要的所有页面,但不想调用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种类型的页面,cat / subcat页面,其中包含要跟踪的链接("//ul[@id='products_ul']/li")列表和需要解析的产品页面(这些页面只有一致的标识符{{1 }} vs <body class="mainpage version2 **item**">

2)如何将输出保存为csv(或任何其他简单的文本格式)?

这方面的文件令我感到困惑,(虽然我确定这归结于我缺乏理解而不是糟糕的文档,因为整体而言它非常出色)它似乎向你发送了圆圈,并给出了示例说出应该写入哪些文件的文件。

我目前正在使用此蜘蛛作为<body class="mainpage version2 **category**">的独立文件,以便于测试,但我很乐意将其设置为完整的scrapy蜘蛛,如果这样可以让事情变得更容易。

1 个答案:

答案 0 :(得分:0)

好的 确定匹配规则时应该去哪里,所以如果你不希望它通过defualt调用 parse_product 进入 parse_product 你可以提及任何回调它会像 callback ='parse_other'那样去那里它会进入parse_other而不是 parse_product

现在您没有设置任何必须使用的python csv module

的scrapy项目

提示您可以在 init 方法中创建文件和编写器对象,并通过parse_product将每个项目写入文件

如果您想设置scrapy项目,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

rest scrapy builten exporter将为您效劳。希望它有所帮助