【爬虫实战】2024微博·批量博主已发布的微博、自动翻页、多线程

大家好,应同学们私信要求,出一篇关于微博博主已发布的内容脚本可视化的案例,于是整理了一下,仅供学习参考。

项目功能简介:

1.可视化式配置;

2.批量任意博主;

3.自动翻页;

4.支持指定最大翻页页码;

5.数据保存到csv文件;

6.程序支持打包成exe文件;

7.项目操作说明文档;

8.多线程并发(根据系统内核数、输入的线程数、博主id数量,计算出最合理的最终线程数);

9.支持爬虫暂停;

10.预留数据库配置,方便二次开发;

11.界面逻辑与获取数据逻辑已拆分(支持无界面运行);

一.最终效果

参数校验:

运行过程:

保存数据到csv:

二.项目代码

2.1 编写界面

该脚本的界面使用PyQt5库开发,经过测试这个库的运行时性能要优于Tkinter,特别是实在多数据数据表单滑动,Tkinter卡顿太严重,因此我们使用性能出色的PyQt5来实现,界面编写过程大致如下:

class MyForm(QWidget):
    update_table_signal = pyqtSignal(dict)

    def __init__(self):
        super().__init__()
        ...
        self.initUI()

    def initUI(self):

        # 设置窗口属性
        self.setGeometry(100, 100, 1000, 600)
        self.setWindowTitle('微博·任意博主已发布的所有微博·可视化爬虫')
        self.center_on_screen()

        # 在垂直布局中添加第一排和第二排的水平布局
        self.layout = QVBoxLayout()

        self.fileButton = QPushButton('选择用户ID文件(.csv)', self)
        self.fileButton.clicked.connect(self.openFileDialog)
        self.layout.addWidget(self.fileButton)

        self.directoryLabel = QLabel(self)  # 添加一个标签来显示用户选择的目录路径
        self.layout.addWidget(self.directoryLabel)

        # 第二排
        self.layout_row2 = QHBoxLayout()
        self.btn_start = QPushButton('开始采集')
        self.btn_stop = QPushButton('停止采集')
        self.btn_stop.setEnabled(False)
        self.label_delay = QLabel('延时')
        ...

三.批量保存数据

数据保存继续使用pandas库,安装: pip install pandas,使用pandas批量保存,用法如下:

import pandas as pd
list = [
  {
  "uid":"",
  ...
  "mblogid":"",
  },{
  "nickname":"",
  ...
  "like":"",
  }
]
df = pd.DataFrame(list)
df.to_csv('result.csv', index=False, columns=["uid", 'mblogid', "nickname", "publish_time", "device_info", "weibo_content", "forward", "comment", "like"])

四.运行日志

多线程日志:

开始请求16441146541...
开始请求14080780731...
开始解析第1页数据...
数据保存中...
共有48271条:
开始解析第1页数据...
数据保存中...
共有163331条:
开始请求14080780732...
开始请求16441146542...
开始解析第2页数据...
数据保存中...
开始解析第2页数据...
数据保存中...
开始请求14080780733...
开始请求16441146543...
开始解析第3页数据...
数据保存中...
触发调试配置的最大页码数3,已停止当前用户ID的爬取!
开始解析第3页数据...
数据保存中...
触发调试配置的最大页码数3,已停止当前用户ID的爬取!
开始请求17115309111...
开始解析第1页数据...
数据保存中...
共有126988条:
开始请求17115309112...
开始解析第2页数据...
数据保存中...
开始请求17115309113...
开始解析第3页数据...
数据保存中...
触发调试配置的最大页码数3,已停止当前用户ID的爬取!

上面是在配置文件中配置了最大页码为3,可配置。设置-1时自动获取全部。

五.项目说明文档

项目说明

安装 python3

到官网下载 python 3.8.x 版本安装包,根据提示安装(windows 请勾选添加环境变量复选框)

python 包管理器安装阿里云镜像源加速:

pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/

注意:python 是 3.8.x,不能是 3.9+(否则 pyinstaller 打包时可能报错)

本地运行

pip install pandas PyQt5

python3 main.py

开始打包

pyinstaller -F -w --name '微博·任意博主已发布的所有微博·可视化爬虫' main.py (没有 main.spec 文件用此命令)
或者
pyinstaller main.spec (有 main.spec 文件可用此命令)

六.获取完整源码

爱学习的小伙伴,本次案例的完整源码,已上传微信公众号:一个努力奔跑的snail,后台回复 微博user 即可获取。

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
爬取微博相册的Python爬虫可以通过以下步骤实现: 1. 导入所需的库。 2. 初始化队列,用于存储待下载的图片链接。 3. 循环获取每一页的相册数据。 4. 解析数据,获取每张图片的链接。 5. 将图片链接添加到队列中。 6. 开启多线程,从队列中取出链接并下载对应的图片。 以下是示例代码: ```python import requests import random from queue import Queue from threading import Thread # 初始化队列 data_queue = Queue() # 循环获取每一页的相册数据 for i in range(1, 26): params = { 'uid': '1739046981', 'album_id': '3581934839144367', 'count': '30', 'page': i, 'type': '3', '__rnd': '1609667183074' } response = requests.get(url=url, params=params, headers=headers).json() # 解析数据,获取每张图片的链接 photo_list = response.get('data').get('photo_list') for photo in photo_list: pic_name = photo.get('pic_name') photo_url = 'https://wx4.sinaimg.cn/large/' + pic_name # 将图片链接添加到队列中 data_queue.put({photo_id: photo_url}) # 定义爬取图片的线程类 class SpiderImg(Thread): def __init__(self, data): Thread.__init__(self) self.data = data def run(self): # 当队列不为空的时候下载对应的图片 while not self.data.empty(): # 取队列 a = self.data.get() # 获得id和url数据 i_id = list(a.keys())[0] i_url = list(a.values())[0] # 下载图片 img = requests.get(url=i_url, headers=fake, proxies=random.choice(proxy_pool)).content # 将文件写入指定路径下的文件夹 with open('E:/SpiderImg/李荣浩/{}.jpg'.format(i_id), 'wb') as t: t.write(img) print(i_id + '.jpg' + ' ' * 4 + '下载完毕' + '.' * 4) # 开启多线程,根据队列中存放的url数据,下载图片 for w in range(64): spider = SpiderImg(data_queue) spider.start() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

玛卡`三少

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

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

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

打赏作者

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

抵扣说明:

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

余额充值