Scrapy爬虫数据存数据库

这里的爬虫代码是基于第一个爬虫程序【重写第一个爬虫程序】,由于是python3.6.4,所以不能使用mysqldb,那就采用pymysql。

一、安装并测试pymysql

pip install pymysql

在python cli下测试是否安装成功

>>> import pymysql
>>>

测试与本地mysql数据库连接情况

>>> conn =pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root',db='scrapy')
>>>

执行一个简单查询

>>> cursor = conn.cursor()
>>> cursor.execute('select * from images')
38    #有38条记录
>>>

说明pymysql安装成功

二、代码实现

1 在settings.py中增加数据库连接配置

#mysql数据库配置
DB_CONFIG = {
	'MYSQL_HOST':'localhost',
	'MYSQL_DBNAME': 'scrapy',
	'MYSQL_USER': 'root',
	'MYSQL_PASSWD': 'root',
	'MYSQL_PORT': 3306,
    'MYSQL_CHARSET': 'utf8'
}

2 image下创建db/dbhelper.py目录文件

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

import pymysql
from image.settings import DB_CONFIG

class DBHelper():
    '''
    读取settings中的配置,实现数据库操作
    '''
    def __init__(self):
        self.connect = pymysql.connect(
            host=DB_CONFIG['MYSQL_HOST'],
            db=DB_CONFIG['MYSQL_DBNAME'],
            user=DB_CONFIG['MYSQL_USER'],
            passwd=DB_CONFIG['MYSQL_PASSWD'],
            charset=DB_CONFIG['MYSQL_CHARSET'],
            port=DB_CONFIG['MYSQL_PORT']
        )

        self.cursor = self.connect.cursor()

    #插入数据库
    def insert(self, item):
        try:
            cursor = self.cursor
            sql = "insert into images(title,img_url) values(%s,%s)"
            #调用插入的方法
            cursor.execute(sql, (
                item["title"], item['url']
                )
            )
            self.db.commit()

        except Exception as e:
            print('insert error', e)
            self.db.rollback()
        finally:
            self.db.close()

        return item

3 修改pipeline.py文件
注释原来的保存文件代码,实现保存mysql

import json
from image.db.dbhelper import DBHelper

class ImagePipeline(object):
	def __init__(self):
		#self.file = open('data.json', 'wb')
		self.db = DBHelper()

	def process_item(self, item, spider):
		#存文件
		#line = json.dumps(dict(item)) + "\n"
		#self.file.write(line.encode())

		#存数据库试试
		self.db.insert(item)
		return item


4 其他

表创建

mysql> show create table images;
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table  | Create Table                                                                                                                                                                                                                                                                      |
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| images | CREATE TABLE `images` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `title` varchar(64) DEFAULT '' COMMENT '标题',
  `img_url` varchar(100) DEFAULT '' COMMENT '图片url',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

本文主要是将item数据持久化到mysql数据库,后续文章会考虑写一些python web开发,安全等方面的内容。欢迎留言交流学习。

你可能感兴趣的:(Mysql,数据库操作,数据库,python,网络爬虫,MYSQL技术分享,Python与网络爬虫)