Skip to main content
 首页 » 编程设计

python之使用 scrapy 收集和存储数据

2025年05月04日10zhoujg

我对开发很陌生,对 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不正确,例如:我需要产品页面的链接提取器吗?我没有关注那里的链接,但是如果没有它,我如何定位它们进行解析?)

理论上,它应该只会获得两种类型的页面,带有链接列表的猫/子猫页面 ("//ul[@id='products_ul']/li")要遵循的和需要解析的产品页面(这些唯一的一致标识符是 <body class="mainpage version2 **item**"> 与 <body class="mainpage version2 **category**"> )

2) 如何将输出保存到 csv(或任何其他与此相关的简单文本格式)?

这方面的文档让我感到困惑,(虽然我确信这是由于我缺乏理解而不是糟糕的文档,因为总的来说它非常好)它似乎让你转了一圈,并给出了没有例子的例子说明示例应该写入哪个文件。

我目前将此蜘蛛程序作为独立文件与 $ scrapy runspider filename.py 一起使用为了便于测试,但我很乐意将其设置为一个完整的 scrapy 蜘蛛,如果这样可以使事情变得更容易的话。

请您参考如下方法:

好吧,如果它匹配规则,你没有定义它应该去哪里,所以默认情况下它会调用parse_product,如果你不想进入 parse_product 你可以提到任何 callback 它会去那里像 callback='parse_other' 它会进入 parse_other 而不是 解析产品

现在你没有设置任何你必须使用的 scrapy 项目 python csv module

提示您可以在 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 会为你做。希望对你有帮助