scrapy 我可以把从网页上得到的价值合并到一个项目上吗?

e4eetjau  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(162)

我正在建设蜘蛛的斗志。我定义的项目如下:

class MyItem(scrapy.Item):
    # define the fields for your item here like:
    title = scrapy.Field()
    usage=scrapy.Field()
    storage=scrapy.Field()

title来自第一页,usage来自第二页,storage来自第三页。
否,我尝试从如下网页中获取值

def parse_item(self, response):
    links=response.xpath('somepath')
    for link in links:
        name=link.xpath('text()').get()
        href= 'mydomain'+link.xpath('@href').get()
        yield scrapy.Request(href,callback=self.parse_info,meta={"title":name})

def parse_info(self,response):
    item=MyItem()
    item["title"]=response.request.meta['title']

    # usage
    item['usage']=response.xpath("sompath").get().strip()

    # storage
    storagelink = response.xpath("somepath/@href").get()
    item['usage'] = scrapy.Request(storagelink ,callback=self.parse_storage,meta={"title":name})
    print(item)
    return item

def parse_storage(self,response):
    return response.xpath("somepath/text()").get().strip()

但我无法获取使用值,则控制台始终输出:
'使用':〈获取https://网址〉,
为什么?我如何将这些数据合并到项目中?谢谢!

pxq42qpu

pxq42qpu1#

您将item['usage']设置为请求,即使它是正确的,但Scrapy是异步的,因此它不会正常工作。
在for循环中声明项,通过方法传递它,并且只在最后一个方法中产生它。你也可以使用cb_kwargs),因为它更方便。

def parse_item(self, response):
    links = response.xpath('somepath')
    for link in links:
        item = MyItem()
        item['title'] = link.xpath('text()').get()
        href = 'mydomain' + link.xpath('@href').get()
        yield scrapy.Request(href, callback=self.parse_info, cb_kwargs={'item': item})

def parse_info(self, response, item):
    # usage
    item['usage'] = response.xpath("sompath").get().strip()

    # storage
    storagelink = response.xpath("somepath/@href").get()
    scrapy.Request(storagelink, callback=self.parse_storage, cb_kwargs={'item': item})

def parse_storage(self, response, item):
    item['storage'] = response.xpath("somepath/text()").get().strip()
    print(item)
    yield item

相关问题