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

news2024/9/21 0:42:20

本项目属于个人学习记录,爬取的数据会于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, 这个系列才刚开始,各位读者先收藏一波,多谢。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

逆向工程核心原理 Chapter 21 | Windows消息钩取

开始DLL注入章节的学习。 知识点学习 消息钩子 这里主要是要弄明白Windows GUI程序的工作模式/流程。 GUI以事件驱动方式工作。核心概念:message queue 最具代表性的:MS提供的spy SetWindowsHookEX() SetWindowsHookExA 函数 (winuser.h) - Win32 a…

基于图片识别的摄影作品展示平台

一、项目概述 Hi,大家好,今天分享的项目是《基于图片识别的摄影作品展示平台》。 摄影作品展示平台为用户提供了一个实践和应用所学摄影知识的机会,通过这个平台,用户可以上传摄影作品,平台能根据用户上传的图片自动…

【初出江湖】分布式之什么是分布式存储?

目录标题 分布式存储分布式存储系统特点分布式存储原理分布式存储的应用场景分布式存储和集中式存储的区别 分布式存储 分布式存储是一种将数据分散存储在多个节点上的存储方式。与传统的集中式存储相比,分布式存储将数据分布在多个节点上,每个节点都可…

我司总经理张戈参加第十届中国车联网大会暨智慧交通博览会

我司总经理张戈参加第十届中国车联网大会暨智慧交通博览会 第十届中国(大湾区)车联网大会暨智慧交通博览会于8月23日隆重举行,此次大会聚焦于前沿技术、行业热点、产业生态以及企业创新等多个方面。会议深入探讨了“车路云一体化”、5G技术、…

使用docker容器部署考试系统

8.30 回顾 1、使用harbor仓库 python --version yum -y update yum -y install python2-pip 部署考试系统 使用docker部署project-exam-system 1、在一台主机内,实现容器的编排看,发布考试系统 2、环境准备 docker docker-compose docker脚本 …

华为云征文|遥遥领先的华为云Flexus云服务器X它来了~~~~

文章目录 ❀前言❀概述❀优点❀黑科技❀购买❀注册账号❀选配 ❀服务器连接 ❀前言 随着云计算时代的进一步深入,越来越多的中小企业企业与开发者需要一款简单易用、高能高效的云计算基础设施产品来支撑自身业务。云服务器相较于于实体服务器,操作更简单…

多目标应用:基于双存档模型的多模态多目标进化算法(MMOHEA)的移动机器人路径规划研究(提供MATLAB代码)

一、机器人路径规划介绍 移动机器人(Mobile robot,MR)的路径规划是 移动机器人研究的重要分支之,是对其进行控制的基础。根据环境信息的已知程度不同,路径规划分为基于环境信息已知的全局路径规划和基于环境信息未知或…

DPDK简介及相关资料整理

DPDK全称为Date planedevelopment kit,是一个用来进行包数据处理加速的软件库。与传统的数据包处理相比,DPDK具有以下特点: 1) 轮询:在包处理时避免中断上下文切换的开销, 2) 用户态驱动:规避不必要的内存…

如何定义核心场景用例?

​首先我们解决两个问题: 1.什么是场景测试? 2.什么是核心场景? 1、什么是场景测试? 🎯 1.1:什么是场景 事件触发时的情景形成了场景。场景必不可少的几个要素:环境、人、时间、行为。简而…

3.7 移位指令

🎓 微机原理考点专栏(通篇免费) 欢迎来到我的微机原理专栏!我将帮助你在最短时间内掌握微机原理的核心内容,为你的考研或期末考试保驾护航。 为什么选择我的视频? 全程考点讲解:每一节视频都…

JAVA进阶学习14

文章目录 常用工具包commons-ioHutool工具包一、多线程1.1 多线程的实现方法1.2 多线程常见的成员方法1.3 线程的安全问题1.4 同步方法1.5 lock锁1.6 线程的死锁1.7 生产者消费者问题(等待唤醒机制)1.8 阻塞队列——同样解决生产和消费的问题1.9 线程的状…

【5G PHY】5G循环前缀(CP)设计思路简述

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G技术研究。 博客内容主要围绕…

苹果手机升级iOS 18时一直显示“正在检测更新”怎么办?

随着科技的不断发展,苹果手机的iOS系统也在不断迭代更新,为用户带来更加优质的使用体验。然而,在升级iOS 18的过程中,一些用户可能会遇到手机一直显示“正在检测更新”的问题,导致无法顺利完成系统升级。 这种情况不仅…

线性代数 第五讲:线性方程组_齐次线性方程组_非齐次线性方程组_公共解同解方程组_详解

线性方程组 文章目录 线性方程组1.齐次线性方程组的求解1.1 核心要义1.2 基础解系与线性无关的解向量的个数1.3 计算使用举例 2. 非齐次线性方程的求解2.1 非齐次线性方程解的判定2.2 非齐次线性方程解的结构2.3 计算使用举例 3.公共解与同解3.1 两个方程组的公共解3.2 同解方程…

标准库标头 <charconv>(c++17)学习

此头文件是strings library. std::to_chars_result 是 std::to_chars 的返回类型。它没有基类,并且只有以下成员。 数据成员 成员名字定义 ptr char* 类型的指针 (公开成员对象) ec std::errc 类型的错误码 (公开成员对象) std::from_chars_result 是 std::from…

CSS瀑布流实现

文章目录 前言前置知识 React 中实现代码实现 Vue 中实现代码实现 前言 瀑布流是一种CSS布局技术,它允许不同高度的元素在页面上以美观的方式排列,同时保持行与列间的间距一致。 前置知识 使用 multi-column 实现多列布局 column-count: 设置布局显示…

深度学习实战4--GAN进阶与优化

GAN 的问题主要有两点:Loss 等于0的梯度消失问题和梯度不稳定以及多样性受损。 前者是因为选择的分布函数使用JS 距离,这个距离不能衡量两个不相交的分布的距离;后者是因为Loss 函数要求KL 距离最小,JS 距离最大,所以…

趣味算法------回文数

目录 ​编辑 前言 什么是回文数 题目描述 解题思路 具体代码 C语言代码 python代码 总结 ps 前言 什么是回文数 回文数(Palindrome Number)是一种特殊的数字,它正读和反读都是一样的。例如,121,12321&#xf…

统计学第4天

学前知识点 方差:反映一组数据离散程度,除n是为了缩小数据量对结果的影响。 标准差: 多个统计量推断 使用z统计量和t统计量可对两个总体参数进行推断,如果需要对更多的参数进行推断需要研究多个变量之间的关系,需要…

vscode安装rest client插件,提示XHR failed

vscode安装rest client插件,提示XHR failed: 本地搜索rest client插件,然后下载,放到容器对应位置,参考: