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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

麦麦大数据

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

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

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

打赏作者

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

抵扣说明:

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

余额充值