建网站平台,wordpress5.0不能发布文章,长治一般做一个网站需要多少钱,宁夏百度公司本文是刘金路的《语言数据获取与分析基础》第十章的扩展#xff0c;详细解释了如何利用Python进行微博爬虫#xff0c;爬虫内容包括微博指定帖子的一级评论、评论时间、用户名、id、地区、点赞数。
整个过程十分明了#xff0c;就是用户利用代码模拟Ajax请求#xff0c;发…本文是刘金路的《语言数据获取与分析基础》第十章的扩展详细解释了如何利用Python进行微博爬虫爬虫内容包括微博指定帖子的一级评论、评论时间、用户名、id、地区、点赞数。
整个过程十分明了就是用户利用代码模拟Ajax请求发送给服务器服务器再处理该请求返回相应的数据最后在页面进行渲染。
本文所使用的第三方库有requests、openpyxl请先自行安装。
偷懒的读者可以直接跳到第七章直接复制代码运行。 效果图 文章目录
???一、基本流程
???二、查看全部评论
???三、找到评论的数据接口
???四、分析数据接口内容
???五、获取内容
???六、批量获取内容
???七、完整代码
???八、微博的限制
8.1 评论数量的限制
8.2 访问的限制 一、基本流程
我们正常使用浏览器上网通过前端浏览器这一用户界面方便地输入网址、点击链接等相当于发送了HTTP请求后端再进行数据返回。
而爬虫是通过代码模拟浏览器发送请求请求的内容包含headers、cookies等自定义信息而这些信息浏览器本身就自带的所以我们正常上网就没必要考虑这么多。在发送请求后如果服务器能正常响应就会返回海量看似杂乱的数据。最后我们需要解析这些数据得到我们想要的。 模拟浏览器发送请求我们使用Python的第三方库requests库。下面我们对百度https://www.baidu.com进行访问。 import requestsurl https://www.baidu.com response requests.get(urlurl) #发送请求print(response.status_code) #若结果返回200则表示正常
print(response.text) #请求获得源代码仔细观察返回内容可以发现内容不仅少而且出现了乱码“o| °±é”这是因为我们没有对请求进行伪装被响应端发现了。因此我们需要再加上一些额外的自定义信息。 import requestsurl https://www.baidu.comheaders{
User-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 SLBrowser/9.0.5.11051 SLBChan/10 SLBVPV/64-bit,
}response requests.get(urlurl,headersheaders) #发送请求print(response.status_code) #若结果返回200则表示正常
print(response.text)其中的’User-agent’即用户代理包含了用户所使用的操作系统版本、浏览器版本等信息。通过增加了headers头部信息瞒过了响应端因此能正常返回源代码。 ———————————————————————————————————————— 上述情景只适用于静态网页即所需要的信息在源代码里。 然而在我们进行微博评论爬虫的时候我们所需要的数据并不在源代码内而是动态加载的。 二、查看全部评论 以易烊千玺微博的最新帖子为例我们需要点击查看全部评论就会跳转到一个新的页面。 鼠标右键检查或按F12打开浏览器的开发者模式并勾选Disable cache禁用缓存。 刷新页面如图Name栏下有各种各样的数据接口储存着不同的数据我们的目的就是找到我们需要的数据接口并拿到接口下的数据。 三、找到评论的数据接口 既然有这么多数据接口那怎么找到我们需要的呢最简单的方法就是复制评论一部分内容。复制了“祝全世界最帅的千千宝贝生日快乐”后点击放大镜图标再在左侧一列粘贴该内容点击刷新图标。之后双击接口再点击Preview。 Preview内的数据是以json格式化展示简明易读。黑色小三角形功能类似目录可以进行展开、折叠。 四、分析数据接口内容 点开’data’后可以发现有0-19条数据里面的格式高度地统一依次点开几个可以发现我们需要的id、评论等数据都存储在一种类似Python字典格式的键值对里。 五、获取内容 首先进行伪装即自定义请求信息其中重要的包括’User-agent’、‘referer’防盗链、‘cookie’不同网站有不同的限定。需要登陆的网站一般都要用到cookie网站通过它识别用户登录身份。现在我们来找到自己的这些数据。 在上一步的浏览器开发者工具中如图我们复制这些数据。代码中的params与帖子有关在开发者工具的Payload内全部复制粘贴即可。 import requests
headers{
User-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 SLBrowser/9.0.5.11051 SLBChan/10 SLBVPV/64-bit,
#自行更改
referer:https://weibo.com/2653906910/P2d23mO3l,
#自行更改
cookie:SINAGLOBAL2437751658391.7534.1732613052480; XSRF-TOKENS9eYHPNYBb4EA4CdIq_CsaWG; SCFAnvWdOkk8nI9JwyZmH86cW9gt7wNLX4DFiQqFt3_n9fGf4sNBNG7XKR5z9qPUIumCMmBA3d_mSh_9zSSYO2KkA8.; SUB_2A25KQtf1DeRhGeFJ7VoX8ifNzj2IHXVpPlU9rDV8PUNbmtAbLRj1kW9Nf1irkxLTL3bKCn4suSuV-7E8sDlud4Jz; SUBP0033WrSXqPxfM725Ws9jqgMF55529P9D9W5vESPCc8VG.fle.Bw7Y00g5JpX5KzhUgL.FoMNSonceo.pSK22dJLoIEqLxKqL1KzL1K-LxKnLBKeL1hzLxK-LBKBLBKMLxK-L1-eLBoWjd5tt; ALF02_1735275685; _s_tentryweibo.com; Apache9101971672823.17.1732683724233; ULV1732683724323:2:2:2:9101971672823.17.1732683724233:1732613052488; WBPSESSKeGgzHFKbGYlLSsXAQi6w6yIVnFklCB92g9IEwKcT6IFw9t3w4GlWYLNWnobudclqNZRGUlNn00rwRSM5bdBO4FLz3Qf7TPT6G0fBQoHQ4hZcFJP5XODD1aum01okGffqFku3aTug5eregoCSIz73Q}
params {is_reload:1,id: 5105261544737539,is_show_bulletin: 2,is_mix:0,count:10,uid: 3623353053,fetch_level: 0,locale: zh-CN,
}
response requests.get(https://weibo.com/ajax/statuses/buildComments, paramsparams,headersheaders)for i in range(len(response.json()[data])-1):time response.json()[data][i][created_at]id response.json()[data][i][id]comment response.json()[data][i][text_raw]area response.json()[data][i][source]like_counts response.json()[data][i][like_counts]print(time)print(id)print(comment)print(area)print(like_counts)偷懒点读者只需要将cookie、referer更换为自己的就可以了。 六、批量获取内容 但是这些数量很少于是我们就可以猜想会不会其他的数据在类似名称的数据接口里为了试验是否该帖子下的评论数据全部存储在以buildComments…为名的数据接口下我们可以下拉评论区以便产生更多数据接口。在右侧的Filter输入框内输入buildComments就能从海量数据接口中过滤出名称为buildComments的数据接口如图。 我们可以在HeadersHTTP请求头内找到Request URL请求网址打开该网址我们可以看到密密麻麻的海量数据这些数据便是Preview内展开后的数据。 依次复制前几个URL如下
https://weibo.com/ajax/statuses/buildCommentsis_reload1id5105473521456009is_show_bulletin2is_mix0count10uid3623353053fetch_level0localezh-CN
https://weibo.com/ajax/statuses/buildCommentsis_reload1id5105473521456009is_show_bulletin2is_mix0max_id4998721601702697count20uid3623353053fetch_level0localezh-CN
https://weibo.com/ajax/statuses/buildCommentsis_reload1id5105473521456009is_show_bulletin2is_mix0max_id1218463186455944count20uid3623353053fetch_level0localezh-CN 通过比对我们可以发现以下规律 https://weibo.com/ajax/statuses/buildComments这一部分均一致之后的参数以’’进行分隔第一个数据接口的URL并不包含’max_id’这一参数且该参数在不断变化第一个数据接口的count10其余都为count20。 那么max_id到底是什么呢又如何找到max_id变化的规律呢 返回开发者工具点击第一个数据接口的Preview界面我们可以发现它数据内存储着max_id而且该值与第二个数据接口的URL的max_id一致。多验证几次我们就能合理猜测前一个数据接口的max_id就是第二个数据接口URL的参数max_id的值。 所以我们还需要获取数据接口的max_id。 max_id response.json()[max_id]至此整个逻辑已经非常清楚了。第一个数据接口的url不包含max_id从第二个数据接口开始url的max_id参数在前一个数据接口内。所以我们在获取评论等数据的时候还需要获取这一数据接口的max_id从而在之后访问url之前把max_id参数加进去。 七、完整代码
import time
import requests
import os
from openpyxl import Workbookheaders {User-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 SLBrowser/9.0.3.5211 SLBChan/105,referer: https://weibo.com/2951605050/ODUbvvNAy,cookie:input(请输入你的cookies)
}def fetch_weibo_comments(id, uid, max_idNone):params {id: id,is_show_bulletin: 2,uid: uid,fetch_level: 0,locale: zh-CN,max_id: max_id # 如果有max_id则添加到参数中}response requests.get(https://weibo.com/ajax/statuses/buildComments, paramsparams,headersheaders)data response.json()return datadef write_to_excel(data, ws):titles [用户, 时间, ID, 评论, 地区, 点赞数]for col_num, title in enumerate(titles, start1):ws.cell(row1, columncol_num, valuetitle)for index, comment in enumerate(data, start2):ws[fA{index}] comment[user][screen_name]ws[fB{index}] comment[created_at]ws[fC{index}] comment[id]ws[fD{index}] comment[text_raw]ws[fE{index}] comment[source]ws[fF{index}] comment[like_counts]def main():id input(请输入主页id)uid input(请输入主页uid)max_id_list []comment_data []for i in range(15): #因为微博限制只能爬取15页if i 0:data fetch_weibo_comments(id, uid)max_id_list.append(str(data[max_id]))comment_data.extend(data[data])else:data fetch_weibo_comments(id, uid, max_id_list[i - 1])max_id_list.append(str(data[max_id]))comment_data.extend(data[data])print(f成功自动爬取第{i 1}页评论)time.sleep(1)# 写入Excelwb Workbook()ws wb.activewrite_to_excel(comment_data, ws)home_dir os.path.expanduser(~)desktop_path os.path.join(home_dir, Desktop)wb.save(desktop_path ./comment_list.xlsx)if __name__ __main__:main()最后的结果会保存在桌面上生成一个名为’comment_list’的excel文件。cookie、uid、id在下图位置找到。 八、微博的限制
8.1 评论数量的限制 在代码中我们只爬取了前15页评论这是因为微博设限只能加载前300条评论。 8.2 访问的限制 在试验的时候我们可以发现第一个数据接口可以短时间内无限次访问但是其他的数据接口短时间内访问会出现如下图的结果。 因此在代码实践过程中我们需要格外注意这个限制。 有问题的可以一起交流