利用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中getaddrinfo()基本用法实例分析
Jun 28 Python
Python 字符串与二进制串的相互转换示例
Jul 23 Python
Python脚本按照当前日期创建多级目录
Mar 01 Python
Python中print和return的作用及区别解析
May 05 Python
对PyQt5中的菜单栏和工具栏实例详解
Jun 20 Python
使用pandas读取文件的实现
Jul 31 Python
python3 enum模块的应用实例详解
Aug 12 Python
python mqtt 客户端的实现代码实例
Sep 25 Python
django执行数据库查询之后实现返回的结果集转json
Mar 31 Python
运行python提示no module named sklearn的解决方法
Nov 29 Python
全网最全python库selenium自动化使用详细教程
Jan 12 Python
使用python向MongoDB插入时间字段的操作
May 18 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 mssql 分页SQL语句优化 持续影响
2009/04/26 PHP
防止用户利用PHP代码DOS造成用光网络带宽
2011/03/01 PHP
解析php dirname()与__FILE__常量的应用
2013/06/24 PHP
验证坐标在某坐标区域内php代码
2016/10/08 PHP
Thinkphp 框架配置操作之配置加载与读取配置实例分析
2020/05/15 PHP
JavaScript中令你抓狂的魔术变量
2006/11/30 Javascript
Jquery实现鼠标移上弹出提示框、移出消失思路及代码
2013/05/19 Javascript
JQuery包裹DOM节点的方法
2015/06/11 Javascript
TypeScript 学习笔记之基本类型
2015/06/19 Javascript
js性能优化技巧
2015/11/29 Javascript
漫谈JS引擎的运行机制 你应该知道什么
2016/06/15 Javascript
关于webpack代码拆分的解析
2017/07/20 Javascript
详解如何用模块化的方式写vuejs
2017/12/16 Javascript
微信小程序中添加客服按钮contact-button功能
2018/04/27 Javascript
vue中axios的封装问题(简易版拦截,get,post)
2018/06/15 Javascript
小程序ios音频播放没声音问题的解决
2018/07/11 Javascript
React中使用UEditor百度富文本的方法
2018/08/22 Javascript
vue实现自定义H5视频播放器的方法步骤
2019/07/01 Javascript
浅析JS中NEW的实现原理及重写
2020/02/20 Javascript
vue3 watch和watchEffect的使用以及有哪些区别
2021/01/26 Vue.js
python编写暴力破解FTP密码小工具
2014/11/19 Python
浅谈python字典多键值及重复键值的使用
2016/11/04 Python
Python中最大最小赋值小技巧(分享)
2017/12/23 Python
python利用微信公众号实现报警功能
2018/06/10 Python
基于python 取余问题(%)详解
2020/06/03 Python
python 读txt文件,按‘,’分割每行数据操作
2020/07/05 Python
Html5 页面适配iPhoneX(就是那么简单)
2019/09/05 HTML / CSS
2014年技术员工作总结
2014/11/18 职场文书
幼儿园教师节感谢信
2015/01/23 职场文书
2014年个人总结范文
2015/03/09 职场文书
2015年全国爱眼日活动方案
2015/05/05 职场文书
商务宴会祝酒词
2015/08/11 职场文书
读《皮囊》有感:理解是对他人的最大的善举
2019/11/14 职场文书
Spring Bean的实例化之属性注入源码剖析过程
2021/06/13 Java/Android
SQLServer权限之只开启创建表权限
2022/04/12 SQL Server
ConditionalOnProperty配置swagger不生效问题及解决
2022/06/14 Java/Android