从0搭建区块链资讯网站(6-4)pipelines并入库
上一节已经将爬虫,items编写完成, 本节我们将完成pipelines的编写,以及入库的操作,如下是详细步骤:
1. 首先新建一个mysqlpipelines的包,然后新建两个文件,一个是我们的pipelines,一个是sql的模块,如下
新建模块2. 在setting 文件里面,编写我们的pipilines的引用:
settings3. Settigns 编写mysql的基本配置
mysql4. 完成后,我们来编写SQL中的两个方法,一个是插入数据库的方法,一个是查看数据库中是否已经有这条记录的方法
# -*- coding: utf-8 -*-
import pymysql.cursors
import traceback
from ArticleSpider import settings
MYSQL_HOSTS = settings.MYSQL_HOSTS
MYSQL_USER = settings.MYSQL_USER
MYSQL_PASSWORD = settings.MYSQL_PASSWORD
MYSQL_ROOT = settings.MYSQL_ROOT
MYSQL_DB = settings.MYSQL_DB
#数据库连接
cnx = pymysql.Connect(user=MYSQL_USER, password = MYSQL_PASSWORD, host = MYSQL_HOSTS, database = MYSQL_DB, charset='utf8')
cur = cnx.cursor()
class Sql:
#插入数据库
@classmethod
def insert_artical(cls,xs_title,xs_a_url, xs_image, xs_publish_time,xs_content, xs_desc,xs_source):
sql = "INSERT INTO articals (title,url,image,publish_time,content,describ,source) values (%s,%s,%s,%s,%s,%s,%s)"
value =(xs_title,xs_a_url, xs_image, xs_publish_time,xs_content, xs_desc,xs_source)
try:
cur.execute(sql , value)
cnx.commit()
except Exception as e:
cnx.rollback()
print('事务处理失败', e)
traceback.print_exc()
#查看是否已经有这条记录的方法
@classmethod
def checkin_url(cls, xs_a_url):
sql = "select url from articals where url = (%s)"
cur.execute(sql, xs_a_url)
results = cur.fetchall()
cnx.commit()
return results
5. 然后在pipelines中,调用这个方法,将items中的数据插入数据库
'''
Created on 2018年7月16日
@author: wenye.sun
'''
from ArticleSpider.items import ScrapyArticleItem
from .sql import Sql
class BitPipline(object):
def process_item(self,item,spider):
if spider.name == 'jianwen':
if isinstance(item, ScrapyArticleItem):
xs_title = item['title'],
xs_a_url = item['a_url'],
xs_image = item['image'],
xs_publish_time = item['publish_time'],
xs_content = item['content'],
xs_desc = item['desc'],
xs_source = item['source'],
#查看是否已经存在了
check_result = Sql.checkin_url(xs_a_url)
lens = len(check_result)
if(lens != 0):
print('已经存在')
else:
#不存在则插入到库中
Sql.insert_artical(xs_title,xs_a_url, xs_image, xs_publish_time,xs_content, xs_desc,xs_source)
print('插入成功')
6. 接下来就是创建数据库的操作了,如下是创建数据库表的操作:
首先用root用户登录数据库: mysql -u root -p
登录后,创建一个用户,并指定密码:CREATE USER 'username'@'%' IDENTIFIED BY 'password'; 把username和password这里替换为你自己的用户名和密码即可
然后将所有权限赋予这个用户:
GRANT ALL ON *.* TO 'username'@'%';
flush privileges;
然后创建一个新的数据库:CREATE DATABASE wechat;
这时候用show databases; 就可以看到我们刚刚创建的数据库了
使用 use wechat; 切换到我们新创建的数据库中
然后使用下面语句创建我们的数据库表格
create table articals( id int(255) NOT NULL AUTO_INCREMENT , title VARCHAR(255), url VARCHAR(255) ,
image VARCHAR(255),
publish_time VARCHAR(255),
content BLOB(0),
source VARCHAR(255),
describ VARCHAR(255),
visable INT(255),
PRIMARY KEY ( id ));
创建数据库成功以后,使用show tables; 可以查看刚刚创建的数据库。
最后我们写一个测试的入口函数,来调用对应的爬虫,entry.py:
'''
Created on 2018年7月19日
@author: wenye.sun
'''
# -*- coding: utf-8 -*-
import os
os.system('scrapy crawl jianwen')
执行后,我们将看到执行的结果如下:
插入成功同时数据库中也有了我们抓取来的20条数据
数据结果我们从新抓取一遍,也可以看到数据库并未重复抓取
已存在如下是我们整个项目的目录结构:
目录后续可以在spiders里面去扩展我们想要抓取的网址,并优化spider文件。
接下来就是将我们整个项目打包放到服务器上去,在服务器上需要做的事情如下:
1. 同样的操作创建数据库
2. 将代码放在服务器上运行抓取入库
3. 至此我们的数据准备工作已经完成
接下来将要做网站部分的内容,当然目前爬虫的第一版本非常粗糙,还有很多要改进的点,包括:
1. Linux上的每日自动执行
2. 爬虫内容去重
3. 图片本地保存
4. 更多的字段填充
以上内容将在后续慢慢优化更新。