爬虫笔记15——爬取网页数据并使用redis数据库set类型去重存入,以爬取芒果踢V为例

下载redis数据库

首先需要下载redis数据库,可以直接去Redis官网下载。或者可以看这里下载过程。

pycharm项目文件下载redis库

> pip install redis 

然后在程序中连接redis服务:

from redis import Redis

redisObj = Redis(host='127.0.0.1', port=6379)

这次笔记记录爬取芒果TV的视频信息,通过md5加密并去重存入Redis数据库。
目标地址:https://www.mgtv.com/lib/2?lastp=list_index&lastp=ch_tv&kind=19&area=10&year=all&sort=c2&chargeInfo=a1&fpa=2912&fpos=
爬取视频的名称,简介、演员及上映时间吧,代码示例:


import requests
import redis
import pymongo
import hashlib
import json
import time


class MangGuo:
    url = 'https://pianku.api.mgtv.com/rider/list/pcweb/v3?allowedRC=1&platform=pcweb&channelId=2&pn=3&pc=80&hudong=1&_support=10000000&kind=19&area=10&year=all&chargeInfo=a1&sort=c2&feature=all'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'
    }

    def __init__(self):
        self.redis_obj = redis.Redis(host="localhost", port=6379)
        self.mongo = pymongo.MongoClient()
        self.mongo_connection = self.mongo['py_spider']['movies']

    @classmethod
    def get_tv_list(cls):
        response = requests.get(cls.url, headers=cls.headers).json()
        # print(response["data"]["hitDocs"])
        return response["data"]["hitDocs"]

    def parse_tv_list(self):
        data_lists = self.get_tv_list()
        for data in data_lists:
            deal_data = dict()
            deal_data["name"] = data["title"]
            deal_data["desc"] = data["story"]
            deal_data["stars"] = data["subtitle"]
            deal_data["year"] = data["year"]
            print(deal_data)
            # obj = hashlib.md5()
            # obj.update(json.dumps(data).encode())
            # res = obj.hexdigest()
            hash_obj = hashlib.md5(json.dumps(deal_data).encode()).hexdigest()
            self.insert_redis(deal_data, hash_obj)

    # 插入数据到Redis数据库并进行去重
    def insert_redis(self, data, hash_data):
        result = self.redis_obj.sadd('movies:filter', hash_data)
        # 插入数据成功返回1,失败返回0
        # print(result)
        if result:
            print('数据插入成功')
            # 插入成功说明是没有重复数据的,也就是作去重后多插入一份到MongoDB数据库
            self.insert_mongodb(data)
        else:
            print('重复数据,插入失败')

    def insert_mongodb(self, data):
        self.mongo_connection.insert_one(data)
        # 休眠测试是否同步
        # time.sleep(1.5)

    def main(self):
        self.parse_tv_list()


if __name__ == '__main__':
    manGuo = MangGuo()
    manGuo.main()

结果如下图,以下是数据库的可视化界面软件:
数据进行加密存入Redis数据库:
在这里插入图片描述
数据存入MongoDB:
在这里插入图片描述

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您好,关于将Scrapy-Redis分布式爬虫爬取数据写入MySQL数据库,您可以按照以下步骤操作: 1. 在pip中安装PyMySQL库:pip install pymysql 2. 在Scrapy项目的settings.py文件中添加数据库配置信息: ``` MYSQL_HOST = 'localhost' # 你的mysql地址 MYSQL_DBNAME = 'test' # 数据库名字,请修改 MYSQL_USER = 'root' # 数据库账号,请修改 MYSQL_PASSWORD = '123456' # 数据库密码,请修改 MYSQL_PORT = 3306 # 数据库端口号 ``` 3. 在items.py文件中定义需要存储的字段,例如: ``` import scrapy class NewsItem(scrapy.Item): title = scrapy.Field() url = scrapy.Field() date = scrapy.Field() ``` 4. 在pipelines.py文件中编写MySQL存储Pipeline: ``` import pymysql class MySQLPipeline(object): def __init__(self, mysql_host, mysql_port, mysql_user, mysql_password, mysql_dbname): self.host = mysql_host self.port = mysql_port self.user = mysql_user self.password = mysql_password self.dbname = mysql_dbname @classmethod def from_crawler(cls, crawler): return cls( mysql_host=crawler.settings.get('MYSQL_HOST'), mysql_port=crawler.settings.get('MYSQL_PORT'), mysql_user=crawler.settings.get('MYSQL_USER'), mysql_password=crawler.settings.get('MYSQL_PASSWORD'), mysql_dbname=crawler.settings.get('MYSQL_DBNAME') ) def open_spider(self, spider): self.db = pymysql.connect( host=self.host, port=self.port, user=self.user, password=self.password, db=self.dbname ) self.cursor = self.db.cursor() def close_spider(self, spider): self.db.close() def process_item(self, item, spider): data = dict(item) keys = ', '.join(data.keys()) values = ', '.join(['%s'] * len(data)) table = 'news' # 数据库表名,请修改 sql = f'INSERT INTO {table} ({keys}) VALUES ({values})' self.cursor.execute(sql, tuple(data.values())) self.db.commit() return item ``` 4. 在settings.py文件中启用Pipeline: ``` ITEM_PIPELINES = { 'myproject.pipelines.MySQLPipeline': 300 } ``` 这样,当Scrapy爬取数据时,就会通过MySQLPipeline将数据写入MySQL数据库中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yima_Dangxian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值