利用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实现dict版图遍历示例
Feb 19 Python
Python中dictionary items()系列函数的用法实例
Aug 21 Python
python进阶教程之动态类型详解
Aug 30 Python
python 爬虫出现403禁止访问错误详解
Mar 11 Python
Python使用post及get方式提交数据的实例
Jan 24 Python
python itchat给指定联系人发消息的方法
Jun 11 Python
解决python文件双击运行秒退的问题
Jun 24 Python
使用Python自动生成HTML的方法示例
Aug 06 Python
在pycharm中显示python画的图方法
Aug 31 Python
Python二元赋值实用技巧解析
Oct 25 Python
python安装后的目录在哪里
Jun 21 Python
Python Pandas list列表数据列拆分成多行的方法实现
Dec 14 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分割合并两个字符串的函数实例
2015/06/19 PHP
js 弹出框 替代浏览器的弹出框
2010/10/29 Javascript
Js与下拉列表处理问题解决
2014/02/13 Javascript
javascript 控制input只允许输入的各种指定内容
2014/06/19 Javascript
Javascript中的关键字和保留字整理
2014/10/16 Javascript
如何实现JavaScript动态加载CSS和JS文件
2020/12/28 Javascript
jQuery属性选择器用法示例
2016/09/09 Javascript
JavaScript 中 avalon绑定属性总结
2016/10/19 Javascript
Node.js与Sails redis组件的使用教程
2017/02/14 Javascript
jQuery事件详解
2017/02/23 Javascript
深入理解 JavaScript 中的 JSON
2017/04/06 Javascript
Vue组件通信的四种方式汇总
2018/02/08 Javascript
基于nodejs res.end和res.send的区别
2018/05/14 NodeJs
webpack 静态资源集中输出的方法示例
2018/11/09 Javascript
微信小程序用户授权、位置授权及获取微信绑定手机号
2019/07/18 Javascript
angularjs模态框的使用代码实例
2019/12/20 Javascript
jquery实现简单拖拽效果
2020/07/20 jQuery
Python与Java间Socket通信实例代码
2017/03/06 Python
Python下实现的RSA加密/解密及签名/验证功能示例
2017/07/17 Python
Python3多进程 multiprocessing 模块实例详解
2018/06/11 Python
Python反射和内置方法重写操作详解
2018/08/27 Python
在Python中调用Ping命令,批量IP的方法
2019/01/26 Python
Python PyQt5模块实现窗口GUI界面代码实例
2020/05/12 Python
jupyter notebook运行命令显示[*](解决办法)
2020/05/18 Python
Python如何将字符串转换为日期
2020/07/31 Python
eVitamins日本:在线购买折扣维生素、补品和草药
2019/04/04 全球购物
成人继续教育实施方案
2014/03/01 职场文书
职员竞岗演讲稿
2014/05/14 职场文书
关于孝道的演讲稿
2014/05/21 职场文书
2014年领导班子专项整治整改方案
2014/09/28 职场文书
党的群众路线教育实践活动整改落实情况报告
2014/10/28 职场文书
2014年高数考试作弊检讨书
2014/12/14 职场文书
安全伴我行主题班会
2015/08/13 职场文书
导游词之太湖
2019/10/08 职场文书
Golang生成Excel文档的方法步骤
2021/06/09 Golang
详解如何使用Nginx解决跨域问题
2022/05/06 Servers