系统城装机大师 - 固镇县祥瑞电脑科技销售部宣传站!

当前位置:首页 > 数据库 > Mysql > 详细页面

scrapy数据存储在mysql数据库的两种方式(同步和异步)

时间:2020-02-18来源:系统城作者:电脑系统城

方法一:同步操作

1.pipelines.py文件(处理数据的python文件)


 
  1. import pymysql
  2.  
  3. class LvyouPipeline(object):
  4. def __init__(self):
  5. # connection database
  6. self.connect = pymysql.connect(host='XXX', user='root', passwd='XXX', db='scrapy_test') # 后面三个依次是数据库连接名、数据库密码、数据库名称
  7. # get cursor
  8. self.cursor = self.connect.cursor()
  9. print("连接数据库成功")
  10.  
  11. def process_item(self, item, spider):
  12. # sql语句
  13. insert_sql = """
  14. insert into lvyou(name1, address, grade, score, price) VALUES (%s,%s,%s,%s,%s)
  15. """
  16. # 执行插入数据到数据库操作
  17. self.cursor.execute(insert_sql, (item['Name'], item['Address'], item['Grade'], item['Score'],
  18. item['Price']))
  19. # 提交,不进行提交无法保存到数据库
  20. self.connect.commit()
  21.  
  22. def close_spider(self, spider):
  23. # 关闭游标和连接
  24. self.cursor.close()
  25. self.connect.close()

2.配置文件中

scrapy数据存储在mysql数据库的两种方式(同步和异步)

方式二 异步储存

pipelines.py文件:

通过twisted实现数据库异步插入,twisted模块提供了 twisted.enterprise.adbapi

  1. 导入adbapi

  2. 生成数据库连接池

  3. 执行数据数据库插入操作

  4. 打印错误信息,并排错 


 
  1. import pymysql
  2. from twisted.enterprise import adbapi
  3. # 异步更新操作
  4. class LvyouPipeline(object):
  5. def __init__(self, dbpool):
  6. self.dbpool = dbpool
  7.  
  8. @classmethod
  9. def from_settings(cls, settings): # 函数名固定,会被scrapy调用,直接可用settings的值
  10. """
  11. 数据库建立连接
  12. :param settings: 配置参数
  13. :return: 实例化参数
  14. """
  15. adbparams = dict(
  16. host=settings['MYSQL_HOST'],
  17. db=settings['MYSQL_DBNAME'],
  18. user=settings['MYSQL_USER'],
  19. password=settings['MYSQL_PASSWORD'],
  20. cursorclass=pymysql.cursors.DictCursor # 指定cursor类型
  21. )
  22.  
  23. # 连接数据池ConnectionPool,使用pymysql或者Mysqldb连接
  24. dbpool = adbapi.ConnectionPool('pymysql', **adbparams)
  25. # 返回实例化参数
  26. return cls(dbpool)
  27.  
  28. def process_item(self, item, spider):
  29. """
  30. 使用twisted将MySQL插入变成异步执行。通过连接池执行具体的sql操作,返回一个对象
  31. """
  32. query = self.dbpool.runInteraction(self.do_insert, item) # 指定操作方法和操作数据
  33. # 添加异常处理
  34. query.addCallback(self.handle_error) # 处理异常
  35.  
  36. def do_insert(self, cursor, item):
  37. # 对数据库进行插入操作,并不需要commit,twisted会自动commit
  38. insert_sql = """
  39. insert into lvyou(name1, address, grade, score, price) VALUES (%s,%s,%s,%s,%s)
  40. """
  41. self.cursor.execute(insert_sql, (item['Name'], item['Address'], item['Grade'], item['Score'],
  42. item['Price']))
  43.  
  44. def handle_error(self, failure):
  45. if failure:
  46. # 打印错误信息
  47. print(failure)
  48.  

注意:

1、python 3.x 不再支持MySQLdb,它在py3的替代品是: import pymysql。

2、报错pymysql.err.ProgrammingError: (1064, ……

原因:当item['quotes']里面含有引号时,可能会报上述错误

解决办法:使用pymysql.escape_string()方法

例如:


 
  1. sql = """INSERT INTO video_info(video_id, title) VALUES("%s","%s")""" %(video_info["id"],pymysql.escape_string(video_info["title"]))

3、存在中文的时候,连接需要添加charset='utf8',否则中文显示乱码。

4、每执行一次爬虫,就会将数据追加到数据库中,如果多次的测试爬虫,就会导致相同的数据不断累积,怎么实现增量爬取?

  • scrapy-deltafetch
  • scrapy-crawl-once(与1不同的是存储的数据库不同)
  • scrapy-redis
  • scrapy-redis-bloomfilter(3的增强版,存储更多的url,查询更快)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

分享到:

相关信息

系统教程栏目

栏目热门教程

人气教程排行

站长推荐

热门系统下载