利用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中的sort方法使用详解
Jul 25 Python
python使用append合并两个数组的方法
Apr 28 Python
Python中atexit模块的基本使用示例
Jul 08 Python
Python随手笔记之标准类型内建函数
Dec 02 Python
Python数据分析之双色球中蓝红球分析统计示例
Feb 03 Python
python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法
Sep 13 Python
详解Python3 对象组合zip()和回退方式*zip
May 15 Python
django组合搜索实现过程详解(附代码)
Aug 06 Python
Python + Flask 实现简单的验证码系统
Oct 01 Python
python如何通过twisted搭建socket服务
Feb 03 Python
Python基于gevent实现文件字符串查找器
Aug 11 Python
python实现移动木板小游戏
Oct 09 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
安装APACHE
2007/01/15 PHP
FirePHP 推荐一款PHP调试工具
2011/04/23 PHP
php动态实现表格跨行跨列实现代码
2012/11/06 PHP
浅析PKI加密解密 OpenSSL
2013/07/01 PHP
PHP格式化显示时间date()函数代码
2018/10/03 PHP
php简单检测404页面的方法示例
2019/08/23 PHP
一个用javascript写的select支持上下键、首字母筛选以及回车取值的功能
2009/09/09 Javascript
IE6浏览器下resize事件被执行了多次解决方法
2012/12/11 Javascript
获取非最后一列td值并将title设为该值的方法
2013/10/30 Javascript
jQuery+ajax实现动态执行脚本的方法
2015/01/27 Javascript
jQuery+CSS实现滑动的标签分栏切换效果
2015/12/17 Javascript
Vue.js每天必学之构造器与生命周期
2016/09/05 Javascript
详解js静态资源文件请求的处理
2017/08/01 Javascript
多个Vue项目部署到服务器的步骤记录
2020/10/22 Javascript
javascript代码实现简易计算器
2021/01/25 Javascript
Python中的yield浅析
2014/06/16 Python
python字符串的方法与操作大全
2018/01/30 Python
Python龙贝格法求积分实例
2020/02/29 Python
用React加CSS3实现微信拆红包动画效果
2017/03/13 HTML / CSS
CSS3实现的渐变幻灯片效果
2020/12/07 HTML / CSS
使用HTML5捕捉音频与视频信息概述及实例
2018/08/22 HTML / CSS
荷兰网上药店:Drogisterij.net
2019/09/03 全球购物
Farfetch中文官网:奢侈品牌时尚购物平台
2020/03/15 全球购物
Unix如何在一行中运行多个命令
2015/05/29 面试题
电子商务专业自我鉴定
2013/12/18 职场文书
学期自我评价
2014/01/27 职场文书
大学生自我鉴定书
2014/03/24 职场文书
主管竞聘书范文
2014/03/31 职场文书
《冬阳童年骆驼队》教学反思
2014/04/15 职场文书
计算机网络及管理学专业求职信
2014/06/05 职场文书
放飞梦想演讲稿800字
2014/08/26 职场文书
捐款通知怎么写
2015/04/24 职场文书
交通事故被告代理词
2015/05/23 职场文书
干部考核工作总结
2015/08/12 职场文书
田径运动会广播稿
2015/08/19 职场文书
SQL解决未能删除约束问题drop constraint
2022/05/30 SQL Server