Skip to main content
 首页 » 编程设计

python之如何在 Scrapy Spider 中使用 Request 函数

2025年05月04日12tuyile006

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)