sdfsadfasdas 2024-07-04 11:52 采纳率: 50%
浏览 6
已结题

scrapy将数据存入到mysql数据库时报错object has no attribute

通过scrapy爬取某网站数据在写入数据库时一直报:

AttributeError: 'MysqlPipeline' object has no attribute 'cursor'

本人跟着B站视频学习爬虫,以下代码跟着视频敲的,仔细核对后确认无误,但运行就是一直报上述错误,还望各位友友们能够帮助看一下。
1、项目结构如下:

img

2、以下为spiders目录下read.py文件源码:

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy_readbook_practice.items import ScrapyReadbookPracticeItem

class ReadSpider(CrawlSpider):
    name = "read"
    allowed_domains = ["www.dushu.com"]
    start_urls = ["https://www.dushu.com/book/1188_1.html"]

    rules = (
        Rule(LinkExtractor(allow=r"/book/1188_\d+\.html"),
                           callback="parse_item",
                           follow=False),
    )

    def parse_item(self, response):
        img_list = response.xpath('//div[@class="bookslist"]//li')
        for img in img_list:
            name = img.xpath('./div//a/img/@alt').extract_first()
            src = img.xpath('./div//a/img/@data-original').extract_first()
            book = ScrapyReadbookPracticeItem(name=name,src=src)
            yield book

3、以下为pipelines.py文件源码:

from scrapy.utils.project import get_project_settings
import pymysql

class ScrapyReadbookPracticePipeline:
    def open_spider(self,spider):
        self.fp = open('book.json','w',encoding='utf-8')

    def process_item(self, item, spider):
        self.fp.write(str(item))
        return item

    def close_spider(self,spider):
        self.fp.close()

class MysqlPipeline:
    def open_spier(self,spider):
        settings = get_project_settings()
        self.host = settings['DB_HOST']
        self.port = settings['DB_PORT']
        self.user = settings['DB_USER']
        self.password = settings['DB_PASSWORD']
        self.database = settings['DB_DATABASE']
        self.charset = settings['DB_CHARSET']

        self.connect()

    def connect(self):
        self.conn = pymysql.connect(
            host=self.host,
            port=self.port,
            user=self.user,
            password=self.password,
            db=self.database,
            charset=self.charset
        )
        # 创建游标
        self.cursor = self.conn.cursor()

    def process_item(self,item,spider):
        sql = 'insert into book(name,src) values("{}","{}")'.format(item['name'],item['src'])
        # 执行sql语句
        self.cursor.execute(sql)
        # 提交
        self.conn.commit()

        return item

    def close_spider(self,spider):
        self.cursor.close()
        self.conn.close()

4、以下为settings.py文件源码:

DB_HOST = 'localhost'
DB_PORT = 3306
DB_USER = 'root'
DB_PASSWORD = 'dyj177035'
DB_DATABASE = 'scrapy_read_book'
DB_CHARSET = 'utf8'

ITEM_PIPELINES = {
   "scrapy_readbook_practice.pipelines.ScrapyReadbookPracticePipeline": 300,
   "scrapy_readbook_practice.pipelines.MysqlPipeline":301
}

5、以下为items.py文件源码:

import scrapy
class ScrapyReadbookPracticeItem(scrapy.Item):
    name = scrapy.Field()
    src = scrapy.Field()
  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-07-04 11:52
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    根据你提供的信息,错误提示 AttributeError: 'MysqlPipeline' object has no attribute 'cursor' 表示在 MysqlPipeline 类的实例中没有找到 cursor 属性。这通常是因为 cursor 属性没有在类的初始化方法中正确创建或引用。

    首先,确保你的 MysqlPipeline 类正确地实现了 open_spiderclose_spider 方法,这两个方法是 Scrapy 调用来初始化和关闭 spider 的时候调用的。在你的 pipelines.py 文件中,open_spider 方法中已经创建了 cursor,但在 process_item 方法中使用 cursor 之前,需要确保 open_spider 方法已经被调用。

    这里有几个可能的解决方案:

    1. 确保 open_spider 方法被调用open_spider 方法应该在 spider 开始时被调用。如果 open_spider 没有被正确调用,cursor 就不会被创建。通常这是自动处理的,但有时可能需要检查 ITEM_PIPELINES 设置是否正确。

    2. 检查 ITEM_PIPELINES 设置:在 settings.py 文件中,确保 MysqlPipeline 的类路径是正确的。看起来你的类路径可能有误。根据你的项目结构,类路径应该类似于 scrapy_readbook_practice.pipelines.MysqlPipeline,而不是 ScrapyReadbookPracticePipeline

    3. 检查 process_item 方法:确保 process_item 方法在 open_spider 之后被调用。如果 open_spider 没有执行,cursor 就不会被初始化。

    4. 使用 self 引用:在 process_item 方法中,确保使用 self.cursor 来引用游标,而不是直接使用 cursor

    5. 检查数据库连接:确保数据库连接信息是正确的,并且 Scrapy 能够连接到 MySQL 数据库。

    6. 检查错误处理:在 connect 方法中添加错误处理,以便在连接失败时能够提供有用的反馈。

    下面是一些修改后的代码示例:

    # 在 pipelines.py 中
    class MysqlPipeline:
        # ... 省略其他部分 ...
    
        def open_spider(self, spider):
            # ... 省略其他部分 ...
            self.connect()
            # 确保 cursor 在这里被创建
    
        def close_spider(self, spider):
            # ... 省略其他部分 ...
    
        def process_item(self, item, spider):
            # 使用 self 来引用 cursor
            self.cursor.execute(sql)
            self.conn.commit()
            return item
    

    确保你的 settings.py 中的 ITEM_PIPELINES 设置正确:

    # 在 settings.py 中
    ITEM_PIPELINES = {
        'scrapy_readbook_practice.pipelines.MysqlPipeline': 300,
    }
    

    如果问题仍然存在,请检查你的 Scrapy 项目是否正确设置,以及是否有其他代码或配置问题导致 open_spider 方法没有被调用。希望这些建议能帮助你解决问题。如果需要进一步的帮助,可以提供更多的信息。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 7月12日
  • 已采纳回答 7月4日
  • 修改了问题 7月4日
  • 创建了问题 7月4日

悬赏问题

  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?
  • ¥15 关于#vue.js#的问题:修改用户信息功能图片无法回显,数据库中只存了一张图片(相关搜索:字符串)
  • ¥15 texstudio的问题,
  • ¥15 spaceclaim模型变灰色
  • ¥15 求一份华为esight平台V300R009C00SPC200这个型号的api接口文档
  • ¥15 就很莫名其妙,本来正常的Excel,突然变成了这种一格一页
  • ¥15 字符串比较代码的漏洞
  • ¥15 欧拉系统opt目录空间使用100%
  • ¥15 ul做导航栏格式不对怎么改?