当前位置: 首页 > news >正文

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 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, 这个系列才刚开始,各位读者先收藏一波,多谢。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 华为 HCIP-Datacom H12-821 题库 (4)
  • dubbo是什么?,能做什么?以及其工作流程
  • vue3.5新特性整理
  • pytest实战演练
  • 集成电路学习:什么是RTC实时时钟
  • 利用AI大语言模型和Langchain开发智能车算法训练知识库(上篇)
  • UE引擎工具链
  • SealSuite 一站式 IT 管理与办公安全解决方案,助力出海企业夯实数字化底座
  • 【生日视频制作】海上绿色摩托艇汽车艇车身AE模板修改文字软件生成器教程特效素材【AE模板】
  • OpenCV颜色空间转换(1)颜色空间转换函数cvtColor()的使用
  • 单元测试 Mock不Mock?
  • P7072 [CSP-J2020] 直播获奖
  • 解决Metasploit调用Nessus报错问题
  • Kafka【十三】消费者消费消息的偏移量
  • 使用LLaMA-Factory快速训练自己的专用大模型
  • [PHP内核探索]PHP中的哈希表
  • CSS居中完全指南——构建CSS居中决策树
  • java8-模拟hadoop
  • MySQL数据库运维之数据恢复
  • Promise面试题,控制异步流程
  • vue:响应原理
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • Vue2.0 实现互斥
  • 不上全站https的网站你们就等着被恶心死吧
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 测试开发系类之接口自动化测试
  • 观察者模式实现非直接耦合
  • 利用jquery编写加法运算验证码
  • 前端面试总结(at, md)
  • 前嗅ForeSpider采集配置界面介绍
  • 如何设计一个比特币钱包服务
  • 算法系列——算法入门之递归分而治之思想的实现
  • 用Visual Studio开发以太坊智能合约
  • puppet连载22:define用法
  • 从如何停掉 Promise 链说起
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • # 达梦数据库知识点
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • ${factoryList }后面有空格不影响
  • (1)Android开发优化---------UI优化
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (编译到47%失败)to be deleted
  • (回溯) LeetCode 131. 分割回文串
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (十二)Flink Table API
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)socket Aio demo
  • (状压dp)uva 10817 Headmaster's Headache
  • *Django中的Ajax 纯js的书写样式1
  • .NET CORE Aws S3 使用
  • .Net Core 生成管理员权限的应用程序
  • .NET Core中的去虚
  • .net refrector