scrapy 爬取微博(一)【最新超详细解析】:创建微博爬取工程

本项目属于个人学习记录,爬取的数据会于12小时内销毁,且不可用于商用。

1 初始化环境

首先我们需要有python环境,先安装一下python,然后配置环境变量,这边给出windows的配置:
在这里插入图片描述

我这边的安装目录是D:\python38,然后配置上面框出来的2个路径就可以了,然后我们只需要在命令行里面输入 python ,和pip -V ,就可以检查环境是否配置正确了。

在这里插入图片描述

接下来的操作我们都是用系统python解释器的,没有用虚拟环境。

下一步要先安装scrapy

pip install scrapy

安装好之后,我们在命令行里就可以全局使用scrapy命令了,否则是不可以执行scrapy的。

2 创建scrapy 工程

我们在我们想要的目录下调出命令行,然后执行以下命令。

scrapy startproject weiboScrapy

然后进入到weiboScrpay目录执行

# 生成爬虫
scrapy genspider weibo weibo.com

scrapy 基本框架就自动创建好了。

然后使用pychram(或者其他IDE)打开这个工程就可以继续开发了。

3 分析【微博热门榜单页面和hottimeline接口】

我们先来分析微博的页面,只有把它的页面分析清楚之后我们才能很快速的写出爬虫程序。

首先访问到热门榜单这个页面,地址是

https://weibo.com/newlogin?tabtype=weibo&gid=102803&openLoginLayer=0&url=https%3A%2F%2Fwww.weibo.com%2F

这个页面是没有分页的,每次向下滚动一部分,就会刷新一些内容,这个内容的刷新是通过页面触发js来实现的:

在这里插入图片描述

用开发者模式看下获取数据的接口

https://weibo.com/ajax/feed/hottimeline?since_id=0&group_id=1028039999&containerid=102803_ctg1_9999_-_ctg1_9999_home&extparam=discover|new_feed&max_id=0&count=10

可以直接在浏览器里访问这个地址:
在这里插入图片描述

这个接口的参数max_id 从0~10,我们可以访问11次,到11的时候就不返回数据了。

这一期,下面我们先尝试爬取下这个接口,编写weibo.py

import json
import scrapy

class WeiboSpider(scrapy.Spider):
    name = "weibo"
    allowed_domains = ["weibo.com"]
    # 设置初始的 max_id 列表
    max_ids = list(range(11))  # 从 0 到 10

    def __init__(self, *args, **kwargs):
        super(WeiboSpider, self).__init__(*args, **kwargs)
        self.total_status_count = 0  # 初始化总状态数量

    # # 定义要添加的 Cookie
    # cookies = {
    #     'SUB': '_2AkMRj066f8NxqwFRmf0TzGrkbI5yzA_EieKn079hJRMxHRl-yT9yqnEOtRB6Og9gVYRlK8MjyNQS8SoFk1YpK2-AQy9y',
    #     'SUBP': '0033WrSXqPxfM72-Ws9jqgMF55529P9D9WFgPmLBUsy6MwsMC5xnJgRR',
    #     'XSRF-TOKEN': 'izuNFQukjrNwDKLkHMPEzOzg',
    #     'WBPSESS': 'Av_uyMf5J_yRg2sn7ncLQTeiuJdSBhgltfM3mRx0MxWwamUSH7h4GvtzB0GGitRMjUKnTWeiDcCehmYUuP91JYDPKmR5nREclKR8dN5CqqPRIVVOrSM8MeotWgLhMj4ZKpRmWZp_c0ZUOq1_89nkTf6YXHjfXOTV1W07ZchOugw='
    # }

    def start_requests(self):
        # 从文件中读取 Cookie
        cookies = self.load_cookies('cookies.txt')

        # 循环生成请求
        for max_id in self.max_ids:
            url = f'https://weibo.com/ajax/feed/hottimeline?refresh=2&group_id=1028039999&containerid=102803_ctg1_9999_-_ctg1_9999_home&extparam=discover%7Cnew_feed&max_id={max_id}&count=10'
            yield scrapy.Request(url=url, callback=self.parse, cookies=cookies)

    def load_cookies(self, file_path):
        """从指定文件加载 Cookies"""
        cookies = {}
        with open(file_path, 'r', encoding='utf-8') as f:
            # 读取整行并按分号分割
            cookie_line = f.read().strip()
            for cookie in cookie_line.split(';'):
                key, value = cookie.strip().split('=', 1)  # 分割键和值
                cookies[key] = value
        return cookies

    def parse(self, response):
        # 解析 JSON 数据
        data = json.loads(response.text)
        # 检查 'statuses' 是否存在
        if 'statuses' in data:
            statuses = data['statuses']

            for status in statuses:
                mid = status.get('mid')  # 获取 mid 值
                if mid:  # 如果 mid 不为空
                    self.log(mid)  # 打印 mid 值
                screen_name = status.get('user').get('screen_name')
                if screen_name:
                    self.log(screen_name)

            status_count = len(statuses)  # 当前请求中的状态数量
            self.total_status_count += status_count  # 累加总状态数量
            self.log(f'总共爬取: {self.total_status_count}')  # 记录当前请求的状态数量

        else:
            self.log("No statuses found in the response.")

在与scrapy.cfg同级目录新增一个cookies.txt,把浏览器里面的cookies直接粘贴进去(并不需要登录微博):

SUB=_2AkMRj066f8NxqwFRmf0TzGrkbI5yzA_EieKn079hJRMxHRl-yT9yqnEOtRB6Og9gVYRlK8MjyNQS8SoFk1YpK2-AQy9y; SUBP=0033WrSXqPxfM72-Ws9jqgMF55529P9D9WFgPmLBUsy6MwsMC5xnJgRR; XSRF-TOKEN=izuNFQukjrNwDKLkHMPEzOzg; WBPSESS=Av_uyMf5J_yRg2sn7ncLQTeiuJdSBhgltfM3mRx0MxWwamUSH7h4GvtzB0GGitRMjUKnTWeiDcCehmYUuP91JYDPKmR5nREclKR8dN5CqqPRIVVOrSM8MeotWgLhMj4ZKpRmWZp_c0ZUOq1_89nkTf6YXHjfXOTV1W07ZchOugw=

测试了一下,总共可以爬取220条数据
在这里插入图片描述

4 小结

4.1 cookies

读取这个接口必须cookies,本文系统cookies可以从浏览器里获取,然后粘贴到cookies.txt里,爬虫会读取这个文件内容加到scrapy.Request中。

4.2 能否爬取能多?

是可以的,登录微博后再取的cookies可以爬取更多,不过测试下来,后面页数会有重复数据出现,具体的机制还不清楚。

anyway, 这个系列才刚开始,各位读者先收藏一波,多谢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/872762.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PHP轻量级高性能HTTP服务框架 - webman

摘要 webman 是一款基于 workerman 开发的高性能 HTTP 服务框架。webman 用于替代传统的 php-fpm 架构,提供超高性能可扩展的 HTTP 服务。你可以用 webman 开发网站,也可以开发 HTTP 接口或者微服务。 除此之外,webman 还支持自定义进程&am…

Django发送邮件

【图书介绍】《Django 5企业级Web应用开发实战(视频教学版)》_django 5企业级web应用开发实战(视频教学版)-CSDN博客 Django 5框架Web应用开发_夏天又到了的博客-CSDN博客 本文学习怎么使用Django发送邮件。 尽管使用Python的smtplib模块发送电子邮件…

vant 动态查询下拉菜单(可用)

动态查询item项 <van-form submit"onSubmit" ref"formRef"><Title title"企业信息" title-line title-size"19" class"ml-[18px] mb-[18px]"></Title><van-cell-group inset class"py-[18px]&quo…

【JavaSE基础】Java 基础知识

Java 转义字符 Java 常用的转义字符 在控制台&#xff0c;输入 tab 键&#xff0c;可以实现命令补全 转义字符含义作用\t制表符一个制表位&#xff0c;实现对齐的功能\n &#xff1a;换行符\n换行符一个换行符\r回车符一个回车键 System.out.println(“韩顺平教育\r 北京”);&…

pod基础和镜像拉取策略

目录 pod概念 pod的分类 1.基础容器 pause 2.初始化容器 init 实验&#xff1a;定义初始化容器 init容器的作用 实验&#xff1a;如何在容器内部进行挂载 镜像拉取策略 pod概念 pod是k8s里面的最小单位&#xff0c;pod也是最小化运行容器的资源对象。容器是基于pod在k…

黑马点评10——用户签到-BitMap数据结构

文章目录 BitMap用法签到功能签到统计 BitMap用法 其实数据库完全可以实现签到功能 但签到数据比较大&#xff0c;借鉴签到卡的思想 布隆过滤器也是使用BitMap实现的. 签到功能 因为是当前用户的当天&#xff0c;所以保存需要的年月日不需要参数&#xff0c;可以直接获取。…

matter中的Fabric(网络结构)

什么是Fabric&#xff1f; Fabric可以被理解为一组相互信任的设备和控制器&#xff0c;它们共享一个共同的信任域。这意味着在同一个Fabric中的设备和控制器之间可以进行安全的通信&#xff0c;而无需额外的身份验证或安全检查。每个Fabric有一个唯一的标识&#xff0c;确保Fab…

Android调整第三方库PickerView宽高--回忆录

一、效果 // 时间选择implementation com.contrarywind:Android-PickerView:4.1.9 多年前&#xff0c;使用到事件选择器&#xff0c;但是PickerView默认宽度使满屏的&#xff0c;不太符合业务需求&#xff0c;当时为此花了许多时间&#xff0c;最终找到了解决方案&#xff0c;…

使用 Milvus 和 Streamlit 搭建多模态产品推荐系统

我们可以使用 Milvus 搭建多模态 RAG 应用&#xff0c;用于产品推荐系统。用户只需简单上传一张图片并输入文字描述&#xff0c;Google 的 MagicLens 多模态 Embedding 模型就会将图像和文本编码成一个多模态向量。然后&#xff0c;使用这个向量从 Milvus 向量数据库中找到最相…

JVM——Java虚拟机内存初识(面经篇之JVM内存)

网上说的太详细了,真不利于我的初识和记忆&#xff0c; 例如&#xff1a;堆区的young&#xff0c; old&#xff0c;讲了一大堆&#xff0c;结果&#xff0c;我连这些区域是干什么的都不知道&#xff0c;存储什么的都不知道&#xff0c; 害得是我自己总结&#xff1a; 堆&#x…

JavaWeb【day08】--(MySQL-Mybatis入门)

数据库开发-MySQL 1. 多表查询 1.1 概述 1.1.1 数据准备 SQL脚本&#xff1a; #建议&#xff1a;创建新的数据库 create database db04; use db04; ​ -- 部门表 create table tb_dept (id int unsigned primary key auto_increment comment 主键ID,name v…

各类AI工具编程能力测试对比

各类AI工具编程能力对比 现在各类AI工具火爆&#xff0c;擅长各类问题解决&#xff0c;闲来无事&#xff0c;验证下各类AI工具的编程能力如何。问题&#xff1a;c 实现杨辉三角&#xff0c;并main函数测试 kimi 对话窗口输入问题&#xff0c;得到了c的完整程序&#xff1a; …

通过redis-operator 来部署 Redis Cluster 集群

安装 Redis Operator 首先&#xff0c;需要安装 redis-operator。可以通过 Helm 或直接应用 YAML 文件来安装。 使用 Helm 安装&#xff1a; helm repo add ot-helm https://ot-container-kit.github.io/helm-charts/ helm install redis-operator ot-helm/redis-operator --…

B树和B+树

B树和B树是两种用于数据库和文件系统中的自平衡树数据结构&#xff0c;它们可以保持数据有序&#xff0c;同时支持快速的查找、插入和删除操作。下面是它们的基本介绍&#xff1a; B树&#xff08;B-Tree&#xff09; 定义&#xff1a;B树是一种平衡的多路搜索树&#xff0c;…

数据分析新星,DuckDB与Pandas处理大数据速度对比

大家好&#xff0c;Pandas库众所周知&#xff0c;适合数据分析新手入门&#xff0c;但在大数据面前却显得处理缓慢。相比之下&#xff0c;开源的DuckDB以其卓越的列式存储性能&#xff0c;在大数据处理上速度惊人&#xff0c;速度远超Pandas。而且&#xff0c;DuckDB配备了Pyth…

JS设计模式之“语言之魂” - 原型模式

前言 当我们学习JavaScript的时候&#xff0c;经常会听到原型&#xff08;prototype)、原型链&#xff08;prototype chain&#xff09;和原型模式&#xff08;prototype pattern&#xff09;这些概念&#xff0c;它们之间有什么关联呢&#xff1f;怎么样才能使用好原型模式呢…

基于yolov8的西红柿检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的西红柿检测系统是一种利用深度学习技术的创新应用&#xff0c;旨在通过自动化和智能化手段提高西红柿成熟度检测的准确性和效率。该系统采用YOLOv8算法&#xff0c;该算法是深度学习领域中的先进目标检测模型&#xff0c;具备实时检测和多目标识别的…

OpenGL Texture C++ 预览Camera视频

OpenGL是一个图形API&#xff0c;并不是一个独立的平台。包含了一系列可以操作图形、图像的函数。基于Texture纹理强大的功能&#xff0c;本篇文章实现Android OpenGL Texture C 预览Camera视频流的功能。 项目github地址&#xff1a;https://github.com/wangyongyao1989/WyFFm…

第T10周:数据增强

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊](https://mtyjkh.blog.csdn.net/)** 在本教程中&#xff0c;你将学会如何进行数…

iOS——APP启动流程

APP启动 APP启动主要分为两个阶段&#xff1a;pre-main和main之后&#xff0c;而APP的启动优化也主要是在这两个阶段进行的。 main之后的优化&#xff1a;1. 减少不必要的任务&#xff0c;2.必要的任务延迟执行&#xff0c;例如放在控制器界面等等。 APP启动的大致过程&#…