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

news/2024/9/17 3:25:14/ 标签: scrapy, 爬虫, 微博

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

1 初始化环境

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

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

在这里插入图片描述

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

下一步要先安装scrapy

pip install scrapy

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

scrapy__22">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 scrapyclass WeiboSpider(scrapy.Spider):name = "weibo"allowed_domains = ["weibo.com"]# 设置初始的 max_id 列表max_ids = list(range(11))  # 从 0 到 10def __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):# 从文件中读取 Cookiecookies = 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] = valuereturn cookiesdef 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.ppmy.cn/news/1521896.html

相关文章

ClickHouse 二进制特征值怎么转化为字符串

要将二进制特征值转化为字符串,可以使用以下方法: 1. 使用 base64 编码 base64 是一种将二进制数据编码为 ASCII 字符串的方法。在 ClickHouse 中,可以使用函数 base64Encode() 来将二进制特征值转化为 base64 编码的字符串。例如&#xff…

idea问题解决:java: -source 7 中不支持 方法引用 (请使用 -source 8 或更高版本以启用 方法引用)

以下是AI生成 :鱼聪明AI - 做您强大的AI助手 这个错误信息表明你尝试使用了Java 8中引入的方法引用特性,但是你的编译器设置使用的源代码版本是Java 7。方法引用是Java 8中引入的一个新特性,允许你以更简洁的方式调用方法。 要解决这个问题…

基于opencv实现双目立体匹配点云距离

双目相机或两个单目相机。 一、相机标定 MATLAB软件,打开双目标定app。 点击add images,弹出加载图像的窗口,分别导入左图和右图,设置黑白格长度(标定板的长度一般为20)。 点击确定,弹出加载…

pdf转word怎么转换?2024快速进行文件格式转换的几款软件

pdf转word怎么转换?2024快速进行文件格式转换的几款软件 将PDF文件转换为Word文档是日常工作中常见的需求,尤其是当你需要编辑或重新利用PDF中的内容时。市面上有许多软件可以帮助你轻松完成PDF转Word的任务,以下是五款值得推荐的软件&#…

ArcGIS Pro SDK (十二)布局 11 报告

ArcGIS Pro SDK (十二)布局 11 报告 文章目录 ArcGIS Pro SDK (十二)布局 11 报告1 报告项目项1.1 获取当前项目中的所有报告1.2 获取特定报告1.3 在新视图中打开报告项目项1.4 激活已打开的报告视图1.5 引用活动报告视图1.5 刷新报告视图1.7 缩放到整个页面1.8 缩放到报告…

计算机网络10——数据库语法1

目录 1、sql语句执行顺序 2、多表查询 3、写sql的步骤 4、去重 5、视图 6、自定义函数:function 7、调用函数 1、sql语句执行顺序 一般情况下:1、from 2、where 3、select 如果有分组和having:from 分组 having最后执行 2、多表查询 内联:select * from 表1 inne…

EI会议推荐-第二届大数据与数据挖掘国际会议(BDDM 2024)

第二届大数据与数据挖掘国际会议(BDDM 2024) 1、基本信息 大会官网:http://www.icbddm.org/ 官方邮箱:icbddm163.com 主办方:武汉纺织大学 会议时间:2024年12月13日-12月15日 会议地点:湖…

全面掌握PythonJava分层自动化测试:从单元测试到安全检测的完整指南

分层自动化(Layered Automation)是一种软件测试策略,通过将自动化测试分为不同层次或阶段,针对不同类型的测试需求,确保测试覆盖的全面性以及提高测试效率。这种方法通过分解复杂的测试任务,将其分配到适当的层级,从而降低测试的维护成本并提高自动化测试的稳定性和复用…

装饰器模式decorator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/decorator 将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为 调用过程 当你调用 encoded.writeData(salaryRecords); 时,控制流首先进入 CompressionDecorator 的 writeData …

3、C++常用宏

这是C的一些常用宏,常用于调试和错误信息的输出。 __FILE__ // 当前源文件的文件名。 __LINE__ // 当前源文件中的行号 __DATE__ // 编译当前源文件的日期(格式:MMM DD YYYY) __TIME__ // 编译当前源文件的时…

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

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

Facebook的AI进化:如何用智能技术提升内容推荐

在数字时代,社交媒体平台不仅是信息传播的重要渠道,也是个人和品牌互动的关键平台。Facebook作为全球领先的社交媒体网络,其内容推荐系统的优化在很大程度上提升了用户体验。本文将探讨Facebook如何通过人工智能(AI)技…

使用Fign进行客户端远程调用和SpringFormEncoder的使用

1、引入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> 2、启动类加上注解 EnableFeignClients SpringBootApplication public class FeignTe…

Ansible 自动化运维项目

在现代 IT 运维中&#xff0c;自动化正在成为提升效率和可靠性的关键工具。Ansible 作为一种流行的自动化工具&#xff0c;因其简单易用和强大的功能&#xff0c;被广泛应用于配置管理、部署、持续集成等领域。本文将通过一个实际的 Ansible 项目案例&#xff0c;来介绍如何使用…

Flask中实现上下文管理

在Flask中&#xff0c;上下文管理是通过Flask框架内部机制自动管理的&#xff0c;但你也可以通过Flask提供的API来显式地操作上下文。Flask使用_request_ctx_stack和_app_ctx_stack这两个本地栈&#xff08;local stacks&#xff09;来分别管理请求上下文和应用上下文的入栈&am…

P1166 打保龄球

共可以投 1 局 一局10轮 在一局中&#xff0c;一共有十个柱&#xff0c;会出现很多种情况。 第1次把10个 打倒全部 >> 分数10后2次得分 --若是第10轮则还需另加两次滚球&#xff1b; 没全部打倒 >> 第2次把剩下的 打倒 >&g…

MFC生成dll的区别

主要分三种&#xff1a; A. 动态链接库(dll) B.具有导出项的(dll)动态链接库 C.MFC动态链接库 对比项目&#xff1a;可以根据需要选择哪种dll方便 添加自定义导出功能Demo 1. 添加导出实现接口&#xff1a; A. 导出需要具有&#xff1a;__declspec(dllexport) B. 按照C语言…

Unity6 + UE5.4 PSO缓存实践记录

题图&#xff08;取自COD冷战的着色器编译提示&#xff09; PSO&#xff08;管线状态对象 Pipeline State Object&#xff09;是伴随现代图形API&#xff08;DirectX12、Vulkan、Metal&#xff09;而出现的概念&#xff0c;它本质上是单次绘制时渲染管线所处的状态信息的集合&…

Java实用类——操作日期和时间

Date类&#xff1a; Date 位于java.util.Date类&#xff1a;表示日期和时间SimpleDateFormat 位于java.text.SimpleDateFormat类&#xff1a;格式化日期类parse方法&#xff1a;将字符串转为日期类型 public static void main(String[] args) throws ParseException {//获得当…

Unity Adressables 使用说明(五)在运行时使用 Addressables(Use Addressables at Runtime)

一旦你将 Addressable assets 组织到 groups 并构建到 AssetBundles 中&#xff0c;就需要在运行时加载、实例化和释放它们。 Addressables 使用引用计数系统来确保 assets 只在需要时保留在内存中。 Addressables 初始化 Addressables 系统在运行时第一次加载 Addressable …