利用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常用正则表达式符号浅析
Aug 13 Python
解决Python 遍历字典时删除元素报异常的问题
Sep 11 Python
Python使用SQLite和Excel操作进行数据分析
Jan 20 Python
matplotlib subplots 调整子图间矩的实例
May 25 Python
Python数据报表之Excel操作模块用法分析
Mar 11 Python
Python对接六大主流数据库(只需三步)
Jul 31 Python
Python 求数组局部最大值的实例
Nov 26 Python
Python numpy.zero() 初始化矩阵实例
Nov 27 Python
基于Python中isfile函数和isdir函数使用详解
Nov 29 Python
tensorflow实现tensor中满足某一条件的数值取出组成新的tensor
Jan 04 Python
Python with语句用法原理详解
Jul 03 Python
Python之matplotlib绘制饼图
Apr 13 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
西德产收音机
2021/03/01 无线电
用PHP和ACCESS写聊天室(八)
2006/10/09 PHP
PHP+MySQL投票系统的设计和实现分享
2012/09/23 PHP
PHP获取和操作配置文件php.ini的几个函数介绍
2013/06/24 PHP
PHP中trim()函数简单使用指南
2015/04/16 PHP
学习php设计模式 php实现建造者模式
2015/12/07 PHP
yii2缓存Caching基本用法示例
2016/07/18 PHP
利用php做服务器和web前端的界面进行交互
2016/10/31 PHP
yii2.0框架实现上传excel文件后导入到数据库的方法示例
2020/04/13 PHP
JavaScript 事件系统
2010/07/22 Javascript
Highcharts 非常实用的Javascript统计图demo示例
2013/07/03 Javascript
原生javaScript做得动态表格(注释写的很清楚)
2013/12/29 Javascript
js+html5实现canvas绘制椭圆形图案的方法
2016/05/21 Javascript
json的使用小结
2016/06/08 Javascript
使用jquery判断一个元素是否含有一个指定的类(class)实例
2017/02/12 Javascript
JQuery Ajax 异步操作之动态添加节点功能
2017/05/24 jQuery
jQuery实现动态添加节点与遍历节点功能示例
2017/11/09 jQuery
vue element-ui table表格滚动加载方法
2018/03/02 Javascript
vue 巧用过渡效果(小结)
2018/09/22 Javascript
4 种滚动吸顶实现方式的比较
2019/04/09 Javascript
浅谈对于react-thunk中间件的简单理解
2019/05/01 Javascript
javascript读取本地文件和目录方法详解
2020/08/06 Javascript
python中的内置函数getattr()介绍及示例
2014/07/20 Python
Python3中的真除和Floor除法用法分析
2016/03/16 Python
Python中的变量和作用域详解
2016/07/13 Python
Django进阶之CSRF的解决
2018/08/01 Python
python实现嵌套列表平铺的两种方法
2018/11/08 Python
Django框架实现的简单分页功能示例
2018/12/04 Python
在python下读取并展示raw格式的图片实例
2019/01/24 Python
日本亚马逊官方网站:Amazon.co.jp
2020/04/14 全球购物
母亲节感恩寄语
2014/02/21 职场文书
中药专业自荐信范文
2014/03/18 职场文书
2015大学党建带团建工作总结
2015/07/23 职场文书
技术入股协议书
2016/03/22 职场文书
SpringAop日志找不到方法的处理
2021/06/21 Java/Android
CSS3 Tab动画实例之背景切换动态效果
2021/08/23 HTML / CSS