上篇博客使用scrapy框架爬取豆瓣电影top250信息将各种信息通过json存在文件中,不过对数据的进一步使用显然放在数据库中更加方便,这里将数据存入mysql数据库以便以后利用。
运行环境:

 1. win7-64bit2. python 3.5.33. mysql 5.7.17

安装mysql数据库模块

打开命令行输入python后,通过import MySQLdb检查是否支持mysql数据库

出现错误
ImportError: No module named MySQLdb
那么就要手动安装,查找发现mysqldb只支持到python3.4,这里选择使用pymysql,通过这里下载后解压,切换到PyMySQL3-0.5目录,通过shift+鼠标右键选择在此处打开命令窗口,输入命令python setup.py install安装

安装结束后,测试是否可以使用

安装成功!

创建数据库和表

由于上篇博客中爬取的数据属性就是对应的MovieItem属性

class MovieItem(scrapy.Item):# 电影名字name = scrapy.Field()# 电影信息info = scrapy.Field()# 评分rating = scrapy.Field()# 评论人数num = scrapy.Field()# 经典语句quote = scrapy.Field()# 电影图片img_url = scrapy.Field()

据此创建数据库表,创建数据库的时候加上DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci,以防出现乱码

create database douban DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
use douban;
CREATE TABLE doubanmovie (name VARCHAR(100) NOT NULL, # 电影名字info VARCHAR(150), # 电影信息rating VARCHAR(10), # 评分num VARCHAR(10), # 评论人数quote VARCHAR(100), # 经典语句img_url VARCHAR(100), # 电影图片
) 

存储数据

首先在项目settings文件中添加与数据库连接相关的变量

MYSQL_HOST = 'localhost'
MYSQL_DBNAME = 'douban'
MYSQL_USER = 'root'
MYSQL_PASSWD = '123456'

在MoviePipelines.py文件中创建类DBPipeline,在其中进行对数据库的操作。
首先连接数据库,获取cursor以便之后对数据就行增删查改

    def __init__(self):# 连接数据库self.connect = pymysql.connect(host=settings.MYSQL_HOST,db=settings.MYSQL_DBNAME,user=settings.MYSQL_USER,passwd=settings.MYSQL_PASSWD,charset='utf8',use_unicode=True)# 通过cursor执行增删查改self.cursor = self.connect.cursor();

注意这里charset属性为 ‘utf8’,中间没有-,在调试过程中因为这个-搞了半天

之后重载方法process_item(self, item, spider),在其中执行数据的增删查改,通过cursor编写sql语句,然后使用self.connect.commit()提交sql语句

    def process_item(self, item, spider):try:# 插入数据self.cursor.execute("""insert into doubanmovie(name, info, rating, num ,quote, img_url)value (%s, %s, %s, %s, %s, %s)""",(item['name'],item['info'],item['rating'],item['num'],item['quote'],item['img_url']))# 提交sql语句self.connect.commit()except Exception as error:# 出现错误时打印错误日志log(error)return item

最后在settings文件中注册DBPipeline

ITEM_PIPELINES = {'doubanmovie.MoviePipelines.MoviePipeline': 1,'doubanmovie.ImgPipelines.ImgPipeline': 100,'doubanmovie.MoviePipelines.DBPipeline': 10,
}

大功告成后,尝试运行,然而爬取的数据是250条,在数据库存储中只有239条


查看出错日志,发现有以下错误

pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '), 'https://img3.doubanio.com/view/movie_poster_cover/ipst/public/p2255040492.jp' at line 2")
TypeError: 'module' object is not callable

又是半天折腾,忽然想起来电影的quote属性可能不存在,查看MySpider.py文件,发现果然如此

quote = movie.xpath('.//span[@class="inq"]/text()').extract()
if quote:quote = quote[0].strip()
item['quote'] = quote

如果网页中quote属性不存在,那么将item插入数据库时就会出错,增加一条else语句

if quote:quote = quote[0].strip()
else:quote = ' '
item['quote'] = quote

再次运行爬虫后,查看数据库,没错,果然这次多了250条数据,数据总数由239变成489

数据查重处理

不过每次执行,重复数据都会多存一次,而我们想要的是多次执行,重复数据只存一遍就好了,那么就要增加查重处理。
这里使用self.cursor.fetchone()方法来判断有没有重复数据,在每次插入数据前,先判断插入item是否已在表中。通过属性img_url查找该item在表中是否存在,如果存在,执行定义的操作,简单起见,这里直接丢掉了,不过可以执行update语句对数据进行更新。

# 查重处理
self.cursor.execute("""select * from doubanmovie where img_url = %s""",item['img_url'])
# 是否有重复数据
repetition = self.cursor.fetchone()# 重复
if repetition:pass

增加处理后,多次运行爬虫,数据库中不再有重复数据。

最后整个DBPipeline类代码如下

# 用于数据库存储
class DBPipeline(object):def __init__(self):# 连接数据库self.connect = pymysql.connect(host=settings.MYSQL_HOST,port=3306,db=settings.MYSQL_DBNAME,user=settings.MYSQL_USER,passwd=settings.MYSQL_PASSWD,charset='utf8',use_unicode=True)# 通过cursor执行增删查改self.cursor = self.connect.cursor();def process_item(self, item, spider):try:# 查重处理self.cursor.execute("""select * from doubanmovie where img_url = %s""",item['img_url'])# 是否有重复数据repetition = self.cursor.fetchone()# 重复if repetition:passelse:# 插入数据self.cursor.execute("""insert into doubanmovie(name, info, rating, num ,quote, img_url)value (%s, %s, %s, %s, %s, %s)""",(item['name'],item['info'],item['rating'],item['num'],item['quote'],item['img_url']))# 提交sql语句self.connect.commit()except Exception as error:# 出现错误时打印错误日志log(error)return item

基本的数据库存储功能算是实现了,虽然足够简单,不过在写的过程中也遇到很多坑,还是要不断百度google来处理遇到的问题。实现数据库存储之后,就可以多爬一些其他数据,然后合理运用一下,搞一些自己的小项目来玩一下

scrapy爬虫数据存入mysql数据库相关推荐

  1. scrapy mysql数据库_Python3学习系列(十三):Scrapy将数据存入Mysql数据库

    前言: 下面给大家介绍将下载的数据存入到Mysql数据库的用法,数据来源是Mooc的课程. 代码实现: items.py from scrapy import Item,Field class Moo ...

  2. 如何将数据存入mysql_怎样将数据存入mysql数据库

    怎样将数据存入mysql数据库 mip版  关注:231  答案:2  悬赏:80 解决时间 2021-01-18 14:57 已解决 2021-01-17 20:37 怎样将数据存入mysql数据库 ...

  3. Python 爬虫基础: 如何将数据存入Mysql数据库

    使用爬虫爬数据,总要涉及到数据持久化,也就是数据存储的问题. 我们可以根据具体情况把数据保存在本地 txt 文件里,excel 里,csv 里等等,当然也可以存储在数据库里. 本篇博客主要记录如何通过 ...

  4. Python爬取股票数据存入mysql数据库,获取股票(最新、最高、今开、成交量、成交额、量比、换手率、涨幅等)支持多线程+数据库连接池

    项目简介 (Python)爬虫 + MySQL + Redis项目. 爬取下来的数据可用于后续的数据分析(我计划将其用于我的毕业设计). 未来会将数据分析的可视化部署到服务器上, 并添加股票降价通知的 ...

  5. python将数据存入数据库_python3 两种方法将数据存入mysql数据库

    原博文 2017-09-22 18:25 − 方法一:(数据量小的时候推荐使用这种) 第一步:pip install mysqlclient 这里我没有报错 也许你可能会报错Read timed ou ...

  6. 爬虫数据传入mysql_nodejs爬虫数据存入mysql

    node爬虫主要用的是三个插件 request cheerio mysql 废话不多说直接上代码 const request=require("request") const ch ...

  7. web项目数据存入mysql数据库中文乱码问题

    刚开始怀疑是项目中编码设置问题,发现在web.xml中已经有过设置:后来dubug显示数据在传输的过程中一切正常,怀疑是数据库编码问题,然后查看mysql编码: show variables like ...

  8. python将数据存入mysql数据库中_python3 两种方法将数据存入mysql数据库

    方法一:(数据量小的时候推荐使用这种) 第一步:pip install mysqlclient 这里我没有报错 也许你可能会报错Read timed out   此时不要慌,这是因为你的网络问题,你使 ...

  9. 把iphonebenchmark获取的数据存入MySQL数据库

     Iphone_PassMarkRating.py #coding=utf-8 #--------------------------------------- # 程序:iphonebenchm ...

最新文章

  1. 极客新闻——06、刘润:给年轻人的10条工作建议
  2. pandas dataframe 过滤——apply最灵活!!!
  3. SDNU 1194.传纸条(DP) 1032.机器人
  4. Java 使用 zip4j 进行基本的压缩、解压、设置密码操作(version zip4j-2.6.4)
  5. Github图片加速心得
  6. 【英语学习】【WOTD】adversary 释义/词源/示例
  7. Ubuntu中开启MySQL远程访问功能,并将另一个数据库服务器中的数据迁移到新的服务器中...
  8. python全栈开发 * 04 * 180604
  9. oracle x kglob,x$kglob x$kgllk x$kglpn
  10. Android TextureView简易教程
  11. hdu 3926 hands in hands
  12. 重学前端学习笔记(四十一)--CSS的颜色
  13. 阿里巴巴Java开发手册(泰山版)
  14. 拼多多打印订单有哪些软件?哪个软件好用呢?
  15. mysql数据库的基本操作
  16. arcgis的炸开多边形功能
  17. EChart配置--基准线(坐标轴指示器axisPointer)的配置
  18. 查看matlab当前路径,Matlab 如何查找当前路径下文件夹
  19. macvlan源码分析
  20. 如何针对数据中心进行安全疏散和消防应急管理

热门文章

  1. java计算机毕业设计ssm+vue心理咨询网站
  2. 新手入门人工智能领域的历程 --干货
  3. 关于苹果公证(Apple Notarizition)机制的一些总结
  4. windows10许可证即将过期怎么办_Windows 7 时代即将终结!
  5. 算法学习----红黑树
  6. 电容笔和触控笔的区别是什么?好用的电容笔测评
  7. 聚观早报 | 货拉拉入局跑腿业务;苹果任命首位首席人力资源官
  8. 推荐基于深度学习实时同步生成2D动画口型算法
  9. Python怎么读?
  10. 百家号运营技巧:如何发布图集获得高收益呢?