利用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 相关文章推荐
Python3 能振兴 Python的原因分析
Nov 28 Python
python利用matplotlib库绘制饼图的方法示例
Dec 18 Python
详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别
Jun 23 Python
python微信跳一跳系列之棋子定位颜色识别
Feb 26 Python
Scrapy-Redis结合POST请求获取数据的方法示例
May 07 Python
基于Numpy.convolve使用Python实现滑动平均滤波的思路详解
May 16 Python
Kali Linux安装ipython2 和 ipython3的方法
Jul 11 Python
Python 静态方法和类方法实例分析
Nov 21 Python
Django 路由层URLconf的实现
Dec 30 Python
Django更新models数据库结构步骤
Apr 01 Python
浅谈Keras中shuffle和validation_split的顺序
Jun 19 Python
python实现图书馆抢座(自动预约)功能的示例代码
Sep 29 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
php中数据的批量导入(csv文件)
2006/10/09 PHP
PHP输出数组中重名的元素的几种处理方法
2012/09/05 PHP
PHP数据库操作之基于Mysqli的数据库操作类库
2014/04/19 PHP
主流PHP框架的优缺点对比分析
2014/12/25 PHP
微信公众平台开发教程③ PHP实现微信公众号支付功能图文详解
2019/04/10 PHP
网络图片延迟加载实现代码 超越jquery控件
2010/03/27 Javascript
JavaScript下通过的XMLHttpRequest发送请求的代码
2011/06/28 Javascript
javascript实现文本域写入字符时限定字数
2014/02/12 Javascript
js中把JSON字符串转换成JSON对象最好的方法
2014/03/21 Javascript
JS+CSS实现可拖动的弹出提示框
2015/02/16 Javascript
JavaScript模拟实现继承的方法
2015/03/30 Javascript
jQuery的几个我们必须了解的特点
2015/05/03 Javascript
js禁止页面刷新与后退的方法
2015/06/08 Javascript
vue实现可增删查改的成绩单
2016/10/27 Javascript
vue.js开发环境安装教程
2017/03/17 Javascript
js实现颜色阶梯渐变效果(Gradient算法)
2017/03/21 Javascript
jQuery实现鼠标点击处心形漂浮的炫酷效果示例
2018/04/12 jQuery
微信小程序用户位置权限的获取方法(拒绝后提醒)
2018/11/15 Javascript
[34:44]Liquid vs TNC Supermajor 胜者组 BO3 第二场 6.4
2018/06/05 DOTA
Python多线程编程(二):启动线程的两种方法
2015/04/05 Python
列举Python中吸引人的一些特性
2015/04/09 Python
matplotlib作图添加表格实例代码
2018/01/23 Python
idea创建springMVC框架和配置小文件的教程图解
2018/09/18 Python
使用Python实现微信提醒备忘录功能
2018/12/04 Python
python3对接mysql数据库实例详解
2019/04/30 Python
Win下PyInstaller 安装和使用教程
2019/12/25 Python
浅谈对pytroch中torch.autograd.backward的思考
2019/12/27 Python
python 插入日期数据到Oracle实例
2020/03/02 Python
Python批量安装卸载1000个apk的方法
2020/04/10 Python
Python叠加矩形框图层2种方法及效果
2020/06/18 Python
自荐书封面下载
2013/11/29 职场文书
庆国庆活动总结
2014/08/28 职场文书
机关干部四风问题自查报告及整改措施
2014/10/26 职场文书
2016中秋节广告语
2016/01/28 职场文书
MySQL 数据表操作
2022/05/04 MySQL
win10截图快捷键win+shift+s没有反应无法截图怎么解决?
2022/08/14 数码科技