from string import join
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders.crawl import Rule, CrawlSpider
from scrapy.http.request import Request
from scrapy.selector import HtmlXPathSelector
from Gfire.items import GfireItem
class GuideSpider(CrawlSpider):
name = "Gfire"
allowed_domains = ['www.example.com']
start_urls = [
"http://www.example.com/gfire/guides"
]
rules = (
Rule(SgmlLinkExtractor(allow=("gfire/guides.*page=")), callback='parse_item', follow=True),
)
def parse_item(self, response):
hxs = HtmlXPathSelector(response)
items = []
sites = hxs.select('//div[@class="title"]')
for site in sites:
item = GFireItem()
item['title'] = site.select('./a/text()').extract()
item['guide_url'] = site.select('./a/@href').extract()
item['guide_url'] = "http://www.example.com" + join(item['guide_url'])
items.append(item)
return Request(items[1], callback=self.parse_item2)
def parse_item2(self, response):
hxs = HtmlXPathSelector(response)
hero = hxs.select("//h3/a/text()").extract()
return hero
无法让这个蜘蛛工作。请求函数包含 items[1] 应该是 item['guide_url'] 但它告诉我参数必须是 str 或 unicode。 我该如何纠正这个错误?我怎样才能将项目列表传递给回调函数?通过 request.meta?
请您参考如下方法:
您的 item[1] 实际上是 GFireItem 的一个实例。
我不确定您为什么要创建这些,因为您只使用了一个(网站列表中的第二个网站),而丢弃了列表的其余部分。
除此之外,您需要在创建Request 时提取items[1]['guide_url'] url:
return Request(items[1]['guide_url'], callback=self.parse_item2)
