scrapy 实现去重,存入redis(增量爬取)

官方去重:
scrapy官方文档的去重模块,只能实现对当前抓取数据的去重,下面是官方 API

from scrapy.exceptions import DropItem
class DuplicatesPipeline(object):
    def __init__(self):
        self.ids_seen = set()
    def process_item(self, item, spider):
        if item['id'] in self.ids_seen:
            raise DropItem("Duplicate item found: %s" % item)
        else:
            self.ids_seen.add(item['id'])  ##这里换成你自己的item["#"]
            return item

当有一天需求变了,在你像mysql 数据库保存的时候,发现已经有一部分已经存在,有一部分新的数据,你又需要添加到mysql数据库中,这时候你就需要通过redis来作为中间件,通过url来确保爬过的数据不会再爬,做到增量爬取,

from redis import Redis
import pandas as pd
import pymysql

redis_db = Redis(host='your_setting', port=6379, db=4) #连接redis
redis_data_dict = "k_url"

class FirstScrapyPipeline(object):
    def __init__(self):
        self.connect = pymysql.connect(host='your_seting', port=3306, user=user,password='yourseting',database='yourpassword,'db='dbname',charset=vacher)
        self.cursor = self.connect.cursor()##这里我是先将数据存到mysql数据库,建立游标
      redis_db.flushdb()## 删除redis里面的key

        if redis_db.hlen(redis_data_dict) == 0:
            sql = "SELECT url FROM ts_dobn;
            df = pd.read_sql(sql, self.connect)# 读MySQL数据
            for url in df['url'].get_values():  # 把每一条的值写入key的字段里
                redis_db.hset(redis_data_dict, url, 0)
    def process_item(self, item, spider):
        if  redis_db .hexists (redis_data_dict, item['url']):  # 取item里的url和key里的字段对比,看是否存在,存在就丢掉这个item。不存在返回item给后面的函数处理
        raise DropItem("Duplicate item found: %s" % item)
        values = [item["title"],item['start'],item['desc'],item['url']]
        self.do_insert(values)
        self.connect.commit()
        return item
    def do_insert(self,values):
        sql = 'insert into ts_douban VALUES (0,%s,%s,%s,%s)'
        self.cursor.execute(sql,values)
    def close_spider(self,spider):
        self.connect.close()

因为数据库没内容,所以我先存数据进数据库,若你数据库本来就有数据,那么请忽略最后两个方法,

我连接的 redis 是 centos 的,你们可以自行选择

学习笔记仅供参考

    原文作者:xu一直在路上
    原文地址: https://www.jianshu.com/p/dd9432e18a31
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞