Python爬虫框架Scrapy中,'YysItem' object is not callable报错如何解决?

请大神帮忙解惑 爬虫主代码

#coding:utf-8

import scrapy,json from yys.items import YysItem from scrapy.selector import Selector #选择器 from .get_urls import get_url

class Yyspider(scrapy.Spider): name=‘yys’ allow_domain=[‘comp-sync.webapp.163.com’] start_urls=get_url()

def parse(self, response):
    items=[]
    item=YysItem()
    jsonresponse = json.loads(response.body_as_unicode())
    # print (jsonresponse)
    try:
        for j in jsonresponse['data']:
            item['id']=j['req_id']
            item['time']=j['get_time']
            item['whi']=j['prop_info']['from']
            item['level']=j['prop_info']['prop_name'].split("式神")[0]
            item['name']=j['prop_info']['prop_name'].split("式神")[-1]
            item['nick']=j['user_info']['nick']
            item['server']=j['user_info']['server']
            item['uid']=j['user_info']['uid']
            yield item
    except Exception as e:
        print (e)

pipelines 程序

# -*- coding: utf-8 -*-

Define your item pipelines here

Don’t forget to add your pipeline to the ITEM_PIPELINES setting

See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html

import pymysql from yys import settings from yys.items import YysItem #数据库结构 class YysPipeline(object): def init(self): self.connect = pymysql.connect( host=settings.MYSQL_HOST, db=settings.MYSQL_DBNAME, user=settings.MYSQL_USER, passwd=settings.MYSQL_PASSWD, port=settings.MYSQL_PORT, charset=‘utf8’, use_unicode=True) self.cursor = self.connect.cursor()

def process_item(self, item, spider):
    if item.__class__ == YysItem:
        try:
            print ('执行 sql')
            # print (item)
            insert_sql= "insert into yys values(%s,%s,%s,%s,%s,%s,%s,%d)"
            print (insert_sql)
            print (item['id'])
            self.cursor.execute(insert_sql,(item['id'],item['time'],item['whi'],item['level'],item['name'],item['nick'],item('server'),item['uid']))
            self.connect.commit()
        except Exception as e:
            print (e)
        return item

item.py

import scrapy

class YysItem(scrapy.Item): id=scrapy.Field() time=scrapy.Field() whi=scrapy.Field() level=scrapy.Field() name=scrapy.Field() nick=scrapy.Field() server=scrapy.Field() uid=scrapy.Field()


Python爬虫框架Scrapy中,'YysItem' object is not callable报错如何解决?

4 回复

item(‘server’)


这个报错通常是因为你在代码里把 YysItem 这个 Item 对象当成函数调用了。

最常见的情况是在 parse 方法里实例化 Item 时写错了括号。比如:

错误写法:

def parse(self, response):
    item = YysItem()  # 这里实例化是对的
    # ... 填充数据 ...
    yield item()  # 错误!这里又加了一对括号

正确写法:

def parse(self, response):
    item = YysItem()  # 创建实例
    item['field1'] = response.css('selector::text').get()
    item['field2'] = response.xpath('//div/text()').get()
    yield item  # 直接 yield 实例对象,不要加括号

另一个可能是在回调函数里错误地传递了 YysItem 而不是 YysItem()

# 错误
yield scrapy.Request(url, callback=self.parse_detail, cb_kwargs={'item': YysItem})

# 正确
yield scrapy.Request(url, callback=self.parse_detail, cb_kwargs={'item': YysItem()})

检查你的代码,找到哪里给 YysItem 对象加了多余的括号或者直接传递了类而不是实例。

总结:检查 yield 或传递 item 的地方,确保没有多余的调用括号。

楼上正解

智障了,丢人,感谢。

回到顶部