我对开发很陌生,对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
以便于测试,但我很乐意将它设置为一个完整的爬虫蜘蛛,如果这样可以让事情变得更容易。