从安装软件开始教你爬取微博上万条评论数据!这都还学不会吗?

2023-11-08 21:20

本文主要是介绍从安装软件开始教你爬取微博上万条评论数据!这都还学不会吗?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

0. 前言

 

    最近有同学问我有没有试过用scrapy爬东西,说想爬一条微博下面的评论,恰好几年前用scrapy爬过电影票房做作业,于是心血来潮,再次使用scrapy进行了这次微博评论的爬取,弥补了一下当年想爬微博但是没有进行的遗憾,(看到是动态加载,难度太高,知难而退)

    这次选择scrapy的理由是当时被问就是有没有用过scrapy,其次是因为几年前用过,觉得编码量小、也不难,不太需要懂底层实现原理,十分适合初学python或者爬虫的同学来使用

 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

python免费学习资料以及群交流解答点击即可加入


 

1. 前期准备

 

1.1 安装python

 

  安装python就没什么技术含量了,网上有很多教程,我在装这些东西的时候也是跟着教程做的避免出错,所以没什么好班门弄斧的了,要特别注意的是要配置环境变量,如果没有正确配置环境变量,有些命令可能要切换到相应文件夹下面才能使用

  在系统变量-环境变量-Path中加入你的Python安装路径的Scripts路径

  

  我的是C:\Python27\C:\Python27\Scripts

 

1.2 安装scrapy

  

    这一步在安装的时候没有详细记录,引用文章https://www.cnblogs.com/txw1958/archive/2012/07/12/scrapy_installation_introduce.html

    有报错的话跟着报错解决就行了

 

1.3 创建scrapy项目

 

    在安装好scrapy之后,在控制台输入

   

scrapy startproject 项目名

    我是在pycharm下面的控制台输入

    创建了一个名为weiboCrawl的Project,然后在pycharm中打开就行了

 


2. 对象选择

 

    本来选择的对象是weibo.cn

    因为这个站点的爬虫肯定是最好做的,不涉及复杂的加载,只有简单的翻页,递归的请求就好了,但是不知为何,在第50页之后的评论显示不出来

    然后在思考的过程中点到了手机微博触屏版m.weibo.cn的链接,他是这个样子的

    按下 F12 debug ,在没有往下拖动的时候

  这里加载的东西有点多,但是无所谓,先拖到最下面,然后将页面往下拖动加载评论,观察新加载的请求

  往下拖动加载评论

    可以看到,红框是我们上一个截图的最后一个请求,黄色框就是我们向下拖动加载评论的时候新发出的请求,那么新加载的评论肯定也是返回在这些请求当中的

    评论我想百分之99都不会返回在jpeg里面的吧,那肯定就是在最上面那两个请求获得了新加载的评论了,如果实在不行、返回的格式都是你不认识的格式,那一个一个点开来看看也是可以的

可以看到,新加载的评论确实在这个请求中返回

再往下拉多几次之后发现都是一样的,那么我们就可以通过这个移动版微博的这个请求来爬取我们想要的评论,接下来要做的只是找到他们之中的规律请求就好了

   


 

3. 对象分析

 

3.1 请求分析

 

    第一个请求https://m.weibo.cn/comments/hotflow?id=4466768535861595&mid=4466768535861595&max_id_type=0

    第二个请求https://m.weibo.cn/comments/hotflow?id=4466768535861595&mid=4466768535861595&max_id=4570005682782617&max_id_type=1

    第三个请求https://m.weibo.cn/comments/hotflow?id=4466768535861595&mid=4466768535861595&max_id=4569624815600863&max_id_type=1

    后续请求类似

    请求中,有id、mid、max_id、max_id_type四个参数,其中id和mid通过观察发现在每个请求中都是一样的,因此无须分析,重点看另外两个

    其中,max_id_type只有第一次为0,后面都为1,不难知道,max_id_type为0的时候表示不传max_id,为1时表示传max_id

    也就是说我们第一次请求设置为0,后面这个参数都设置为1就好了

    观察第一个请求的返回包

    

    返回的max_id=4570005682782617

    再看第二个请求中传递的参数max_id恰好就是第一个返回包中返回的max_id的值

    后面的请求也是如此,下一个请求传递的max_id的值是上一个返回包中的max_id的值

    得出结论:

    1.发起请求,存储返回的max_id的值,

    2.在JavaScript的控制下,浏览器拖动到一定位置,触发下一次查询请求

    3.传递上次接收到的max_id,再在这个请求中获得下一个max_id值

    4.到2

    以此类推

    当然,这里没有求证是否正确,因为要看他的JavaScript,没有必要,大概正确即可,功能完成就行

    因此,我们的爬虫思路可以跟他的编码思路一样

    1.发起第一次请求

    2.提取评论内容

    3.提取max_id

    4.发起下一个请求

    5.到2

    以此类推

 

3.2 内容分析

 

    刚刚的返回内容都是通过preview查看的,实际的response中以json串返回了一大堆数据,该串太长,就不贴上来了

    通过preview可以知道

    评论的内容对应“text”中的值

    max_id和max_id_type对应max_id和max_id_type的值

    值得一提的是,实际上评论的内容是以类似

"text":"\u674e\u533b\u751f\u4f60\u597d"

    这样的unicode编码返回的,所以在提取出来存到本地使用时,要转码再写入,要不会不显示中文,在等等的编码环节会提到

    因为返回的是json串,应该无法使用css选择器提取内容,因此目前只能想到使用正则表达式提取

    而整个返回包中text只有评论时出现,所以我们可以简单的写一个匹配

"text":"(.*?)"

    的内容就好了

    其他需要提取的内容也是如此

 


 

4. 编码

 

4.1 spider.py 程序入口

 

首先我新建了一个spider.py

from scrapy import cmdline cmdline.execute(['scrapy','crawl','weiboCrawler'])

这样我就可以直接使用pycharm的运行启动了,不需要在控制台输命令

如果有需要的话请根据上图的结构新建文件

第三个参数需要对应你的爬虫的名字

 

4.2 settings.py

 

  修改

ROBOTSTXT_OBEY = False

  修改

COOKIES_ENABLED = True

  去注释,将中间件启用

# Enable or disable downloader middlewares# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.htmlDOWNLOADER_MIDDLEWARES = {   'weiboCrawl.middlewares.WeibocrawlDownloaderMiddleware': 543,}

  修改Headers

DEFAULT_REQUEST_HEADERS = {  'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36'}

 

4.3 middlewares.py

 

在process_request函数中增加你的cookies的值,如果没有cookie,微博可能会视为游客用户,无法正确加载评论

这里有些cookie应该是不需要的,但是为了保险起见,我还是全部加上了

你可以通过

浏览器F12-Application-Storage-Cookies-对应的网址

查看你的cookies并加入

最后,该函数要返回None,返回其他可能会出错,如果有其他的需求的话再考虑返回其他值,这次不需要

 

4.4 weiboCrawler.py

 

在这个文件中,我们只要完成分析得到的需求即可,即

请求-提取内容-请求

剩下的交给框架去做就好了

# -*- coding: utf-8 -*-import scrapyimport reimport sysimport timereload(sys)sys.setdefaultencoding('utf-8') class WeibocrawlerSpider(scrapy.Spider):    name = 'weiboCrawler'    allowed_domains = ['m.weibo.cn']    start_urls = ['https://m.weibo.cn/comments/hotflow?id=4466768535861595&mid=4466768535861595&max_id_type=0']      def parse(self, response):        #正则表达式匹配评论        textList = re.findall(r"\"text\":\"(.*?)\",", response.body)        #正则表达式匹配max_id,将用来查询下一页的评论        maxId = re.findall(r"\"max_id\":(.*?),", response.body)        #正则表达式匹配max_id_type,初始为0,后面都是1        maxIdType = re.findall(r"\"max_id_type\":(.*?)}", response.body)        #获取最后一个max_id        max_id = maxId[len(maxId) - 1]        #获取max_id_type        max_id_type = maxIdType[len(maxIdType) - 1]         #将评论写入文本        with open("resultComment.txt",'a') as f:            for text in textList:                text += '\n'                #显示中文                f.write(text.encode().decode('unicode_escape'))         #向下继续查询        if int(max_id_type) == 1 :            #这里直接拼接就好了,不太需要搞什么高级的操作            new_url = 'https://m.weibo.cn/comments/hotflow?id=4466768535861595&mid=4466768535861595&max_id='+str(max_id)+'&max_id_type=1'            print(new_url)            #需要暂停一下,如果一直请求,微博可能会返回请求过于频繁403Forbidden            time.sleep(3)            #发起请求            yield scrapy.Request(url=new_url, callback=self.parse)

 


 

5. 结果

 

评论是成功提取出来了,对应网页上的内容也可以对应起来

但是一些@别人的啊,或者是一些微博表情变成了链接,看起来很乱

想去掉也是可以的,但是我觉得没有必要,先就这样了

 


 

6. 后记总结

 

    因为只需要写一个例子出来,所以写的很简单,复用性不高

    没有深入的了解Scrapy框架的原理  

    完成的功能也很简单,只提取了评论,如果需要提取用户名或者其他内容,按照分析中的思路来做即可

    另外,由于数量过大,我没有爬取该微博全部的评论,只爬取了一部分,不确定设置了time.sleep后是否还会被服务器屏蔽

    如果有被屏蔽的情况发生,可以考虑引入Cookie池,这一类的文章在我研究如何引入cookie时看到过,各位读者可以自己搜索一下

 

这篇关于从安装软件开始教你爬取微博上万条评论数据!这都还学不会吗?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/weixin_43881394/article/details/109743206
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/372586

相关文章

安装centos8设置基础软件仓库时出错的解决方案

《安装centos8设置基础软件仓库时出错的解决方案》:本文主要介绍安装centos8设置基础软件仓库时出错的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录安装Centos8设置基础软件仓库时出错版本 8版本 8.2.200android4版本 javas

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

Python数据分析与可视化的全面指南(从数据清洗到图表呈现)

《Python数据分析与可视化的全面指南(从数据清洗到图表呈现)》Python是数据分析与可视化领域中最受欢迎的编程语言之一,凭借其丰富的库和工具,Python能够帮助我们快速处理、分析数据并生成高质... 目录一、数据采集与初步探索二、数据清洗的七种武器1. 缺失值处理策略2. 异常值检测与修正3. 数据

pandas实现数据concat拼接的示例代码

《pandas实现数据concat拼接的示例代码》pandas.concat用于合并DataFrame或Series,本文主要介绍了pandas实现数据concat拼接的示例代码,具有一定的参考价值,... 目录语法示例:使用pandas.concat合并数据默认的concat:参数axis=0,join=

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L

Pytorch介绍与安装过程

《Pytorch介绍与安装过程》PyTorch因其直观的设计、卓越的灵活性以及强大的动态计算图功能,迅速在学术界和工业界获得了广泛认可,成为当前深度学习研究和开发的主流工具之一,本文给大家介绍Pyto... 目录1、Pytorch介绍1.1、核心理念1.2、核心组件与功能1.3、适用场景与优势总结1.4、优

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

conda安装GPU版pytorch默认却是cpu版本

《conda安装GPU版pytorch默认却是cpu版本》本文主要介绍了遇到Conda安装PyTorchGPU版本却默认安装CPU的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、问题描述二、网上解决方案罗列【此节为反面方案罗列!!!】三、发现的根本原因[独家]3.1 p

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

windows系统上如何进行maven安装和配置方式

《windows系统上如何进行maven安装和配置方式》:本文主要介绍windows系统上如何进行maven安装和配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. Maven 简介2. maven的下载与安装2.1 下载 Maven2.2 Maven安装2.