1. 程式人生 > 資料庫 >利用scrapy將爬到的資料儲存到mysql(防止重複)

利用scrapy將爬到的資料儲存到mysql(防止重複)

前言

本文主要給大家介紹了關於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`);

弄好以後是這樣的。

2.2 先看下整個爬蟲專案的結構


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

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對我們的支援。