zoukankan      html  css  js  c++  java
  • Scrapy基础(十)———同步机制将Item中的数据写在Mysql


      前面讲解到将Item中的所有字段都已经填写完成,那么接下来就是将他们存储到mysql数据库中,
    那就用到了pipeline项目管道了;
      对项目管道的理解:做一个比喻,爬取好比是开采石油,Item装的都是原油,需要通过一系列的管道
    和工艺进行提炼,而这些原油都是通过pipeline进行加工的,才能真正的到我们所能使用的油(数据)
      大致思路:
          1, 安装MySQLdb和连接数据库的驱动mysqlclient,并创建数据库和相应的表,创建和Item的字段
            一样的字段(注意各个字段的类型,长度和默认值);这些操作可通过navicat进行操作
          2,自定义pipeline,引入mysqldb库,将Item中的数据写入数据库
          3,在settings文件中注册这个管道,并给这个管道一个编号(这个管道在哪条工艺之后进行)

    具体代码

     1 #引入操作数据库模块
     2 import MySQLdb
     3 
     4 class MysqlPipeline(object):
     5     '''
     6     同步机制实现mysql写入操作
     7     '''
     8 
     9     #定义初始化函数,当类被使用时自动调用这个函数,我们让他初始化时就连接上数据库
    10     def __init__(self):
    11         #取个变量名,连接数据库,依次是: host,user,password,dbname
    12         self.conn = MySQLdb.connect("127.0.0.1","root","root","artical_spider")
    13         #通过cursor()的方法获取游标
    14         self.cursor = self.conn.cursor()
    15 
    16     #自定义的管道必须有此方法
    17     def process_item(self,item,spider):
    18         #要执行的插入sql语句
    19         insert_sql = """
    20             insert into jobbole_artical(title,creat_date,url,url_object_id,
    21                 front_image_url2,front_image_path,tags,comment_num,
    22                 fav_num,like_num,content
    23                 )
    24             VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)
    25         """
    26         
    27         #执行sql语句,注意后面是元组,将Item中的数据格式化填充到插入语句中
    28         self.cursor.execute(insert_sql,(item["title"],item["creat_date"],item["url"],
    29             item["url_object_id"],item["front_image_url2"],item["front_image_path"],
    30             item["tags"],item["comment_num"],item["fav_num"],item["like_num"],item["content"]))
    31 
    32         #将sql语句提交到数据库执行
    33         self.conn.commint()

    注意:

    一:

    我们从前设置过

    artical_item["front_image_url"] = [front_image_url]

    这个Item是一个列表类型,当你写入数据库时候报错, 

    File "C:UsersAdministratorEnvsartical_spiderlibsite-packagesMySQLdbconverters.py", line 90, in quote_tuple
        return "(%s)" % (','.join(escape_sequence(t, d)))
    TypeError: sequence item 0: expected str instance, bytes found

    当我们改为str时图片的下载路径又不能正常工作,

    所以只能添加一个新的一样的Item,一个设置为列表,供图片下载,一个为写入数据库中做准备

    二:

    对于数据库各个字段的设置,这里可将一些字段设置为不为空,并且设置一些字段的默认值;

    这里讲url_object_id设置成主键,主键不能为空且唯一;在

    在写入数据库时,各个字段要和Item字段的顺序相对应

    三:

    关于python对数据库的操作,本篇参考了这篇博文

    以下是运行结果






































    '''

  • 相关阅读:
    js中箭头函数和普通函数this的区别
    jquery DOM操作(一)
    jquery选择器详细说明
    javascript 中关于function中的prototype
    html5一些容易忽略的细节
    javascript 原生得到document.Element的方法
    关于spring autowrie的5种方式
    关于FileSystemXmlApplicationContext和ClassPathXmlApplicationContext路径问题
    【Unity Shader】(十) ------ UV动画原理及简易实现
    【Unity Shader】(九) ------ 高级纹理之渲染纹理及镜子与玻璃效果的实现
  • 原文地址:https://www.cnblogs.com/ruoniao/p/6900588.html
Copyright © 2011-2022 走看看