2

我对开发很陌生,对scrapy也很陌生,到目前为止,我已经了解了文档,但我遇到了我似乎无法通过的墙。以下是我拥有的基本蜘蛛(更改了网址以保护无辜者)。

起始 url 包含一个产品类别列表,这些链接指向带有子类别列表的页面,这些子类别链接到我要解析的产品页面。

我的蜘蛛当前运行没有错误,似乎获取了我想要的所有页面,但不想调用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)这应该做我想做的吗?

好的,显然,不,这就是我在这里的原因!但我不确定这是否归因于错误的 xpath 或者我是否调用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以便于测试,但我很乐意将它设置为一个完整的爬虫蜘蛛,如果这样可以让事情变得更容易。

4

1 回答 1

0

好的,如果它匹配规则,你没有定义它应该去哪里,所以默认它正在调用parse_product,如果你不想进入parse_product你可以提到任何 回调它会像callback='parse_other'它会去 parse_other而不是parse_product

现在你没有设置任何你必须使用python csv 模块的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 会为你做的。希望能帮助到你

于 2012-09-19T07:00:08.333 回答