利用scrapy将爬到的数据保存到mysql(防止重复)


Posted in Python onMarch 31, 2018

前言

本文主要给大家介绍了关于scrapy爬到的数据保存到mysql(防止重复)的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

1.环境建立

     1.使用xmapp安装php, mysql ,phpmyadmin

     2.安装python3,pip

     3.安装pymysql

     3.(windows 略)我这边是mac,安装brew,用brew 安装scrapy

2.整个流程

     1. 创建数据库和数据库表,准备保存

     2.写入爬虫目标URL,进行网络请求

     3.对爬返回数据进行处理,得到具体数据

     4.对于具体数据保存到数据库中

2.1.创建数据库

首先创建一个数据库叫scrapy,然后创建一个表article,我们这里给body加了唯一索引,防止重复插入数据

--
-- Database: `scrapy`
--
 
-- --------------------------------------------------------
 
--
-- 表的结构 `article`
--
 
CREATE TABLE `article` (
 `id` int(11) NOT NULL,
 `body` varchar(200) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
 `author` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
 `createDate` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
 
--
-- Indexes for table `article`
--
ALTER TABLE `article`
 ADD PRIMARY KEY (`id`),
 ADD UNIQUE KEY `uk_body` (`body`);

利用scrapy将爬到的数据保存到mysql(防止重复)

弄好以后是这样的。

2.2 先看下整个爬虫项目的结构

利用scrapy将爬到的数据保存到mysql(防止重复)

quotes_spider.py是核心,负责对网络请求和对内容进行处理,然后对整理好的内容抛给pipelines进行具体处理,保存到数据库中,这样不会影响速度。

其他的看 图说明

2.2 写入爬虫目标URL,进行网络请求

import scrapy
from tutorial.items import TutorialItem
class QuotesSpider(scrapy.Spider):
 name = "quotes"
 def start_requests(self):
  url = 'http://quotes.toscrape.com/tag/humor/'
  yield scrapy.Request(url)
 def parse(self, response):
  item = TutorialItem()
  for quote in response.css('div.quote'):
   item['body'] = quote.css('span.text::text').extract_first()
   item['author'] = quote.css('small.author::text').extract_first()
   yield item
  next_page = response.css('li.next a::attr("href")').extract_first()
  if next_page is not None:
   yield response.follow(next_page, self.parse)

start_requests 就是要写入具体要爬的URL

parse就是核心的对返回的数据进行处理的地方,然后以item的形式抛出,接下来定义好下一个要爬的内容 

2.3  items

# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html
import scrapy
class TutorialItem(scrapy.Item):
 body = scrapy.Field()
 author = scrapy.Field()
 pass

2.4 pipelines

# -*- coding: utf-8 -*-
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
import pymysql
import datetime
from tutorial import settings
import logging
class TutorialPipeline(object):
 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
  )
  self.cursor = self.connect.cursor(); 
 def process_item(self, item, spider):
  try:
   self.cursor.execute(
    "insert into article (body, author, createDate) value(%s, %s, %s) on duplicate key update author=(author)",
    (item['body'],
     item['author'],
     datetime.datetime.now()
     ))
   self.connect.commit()
  except Exception as error:
   logging.log(error)
  return item
 def close_spider(self, spider):
  self.connect.close();

2.5 配置

ITEM_PIPELINES = {
 'tutorial.pipelines.TutorialPipeline':300
}
MYSQL_HOST = 'localhost'
MYSQL_DBNAME = 'scrapy'
MYSQL_USER = 'root'
MYSQL_PASSWD = '123456'
MYSQL_PORT = 3306

3.启动爬虫

scrapy crawl quotes

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
零基础写python爬虫之使用urllib2组件抓取网页内容
Nov 04 Python
Python实现控制台输入密码的方法
May 29 Python
python批量制作雷达图的实现方法
Jul 26 Python
Python3 中文文件读写方法
Jan 23 Python
TensorFlow深度学习之卷积神经网络CNN
Mar 09 Python
Python登录注册验证功能实现
Jun 18 Python
Python 实现两个列表里元素对应相乘的方法
Nov 14 Python
使用python实现画AR模型时序图
Nov 20 Python
python下载的库包存放路径
Jul 27 Python
python boto和boto3操作bucket的示例
Oct 30 Python
pandas时间序列之pd.to_datetime()的实现
Jun 16 Python
利用Python脚本写端口扫描器socket,python-nmap
Jul 23 Python
python 通过xml获取测试节点和属性的实例
Mar 31 #Python
Python Xml文件添加字节属性的方法
Mar 31 #Python
Python简单生成随机数的方法示例
Mar 31 #Python
用python 批量更改图像尺寸到统一大小的方法
Mar 31 #Python
使用Python读取安卓手机的屏幕分辨率方法
Mar 31 #Python
python获取网页中所有图片并筛选指定分辨率的方法
Mar 31 #Python
python如何将图片转换为字符图片
Aug 19 #Python
You might like
dedecms 制作模板中使用的全局标记图文教程
2007/03/11 PHP
深入php多态的实现详解
2013/06/09 PHP
php二维数组排序详解
2013/11/06 PHP
php实现文本数据导入SQL SERVER
2015/05/17 PHP
微信小程序 消息推送php服务器验证实例详解
2017/03/30 PHP
PHP+Redis事务解决高并发下商品超卖问题(推荐)
2020/08/03 PHP
DOM下的节点属性和操作小结
2009/05/14 Javascript
FireFox JavaScript全局Event对象
2009/06/14 Javascript
JQuery 选择器 xpath 语法应用
2010/05/13 Javascript
Firebug入门指南(Firefox浏览器)
2010/08/21 Javascript
最常用的12种设计模式小结
2011/08/09 Javascript
在浏览器窗口上添加遮罩层的方法
2012/11/12 Javascript
微信小程序 欢迎界面开发的实例详解
2016/11/30 Javascript
原生Javascript插件开发实践
2017/01/09 Javascript
javascript判断回文数详解及实现代码
2017/02/03 Javascript
详解webpack分离css单独打包
2017/06/21 Javascript
微信小程序 开发MAP(地图)实例详解
2017/06/27 Javascript
Vue.js实现实例搜索应用功能详细代码
2017/08/24 Javascript
javascript少儿编程关于返回值的函数内容
2018/05/27 Javascript
js实现input密码框显示/隐藏功能
2020/09/10 Javascript
vue-dplayer 视频播放器实例代码
2019/11/08 Javascript
jquery实现烟花效果(面向对象)
2020/03/10 jQuery
分享8个JavaScript库可更好地处理本地存储
2020/10/12 Javascript
Python如何发布程序的详细教程
2018/10/09 Python
PyCharm 创建指定版本的 Django(超详图解教程)
2019/06/18 Python
用python生成(动态彩色)二维码的方法(使用myqr库实现)
2019/06/24 Python
详解CSS3 用border写 空心三角箭头 (两种写法)
2017/09/29 HTML / CSS
是什么让J2EE适合用来开发多层的分布式的应用
2015/01/16 面试题
实习生个人找工作的自我评价
2013/10/30 职场文书
求职信模板标准格式范文
2014/02/23 职场文书
邀请函格式范文
2015/02/02 职场文书
python如何在word中存储本地图片
2021/04/07 Python
在python中实现导入一个需要传参的模块
2021/05/12 Python
nginx中proxy_pass各种用法详解
2021/11/07 Servers
剑指Offer之Java算法习题精讲二叉树的构造和遍历
2022/03/21 Java/Android
python数字图像处理:图像的绘制
2022/06/28 Python