项目十一:爬取热搜榜(小白实战级)

news2024/11/20 12:35:49

首先,恭喜各位也恭喜自已学习爬虫基础到达圆满级,今后的自已python爬虫之旅会随着网络发展而不断进步。回想起来,我学过请求库requests模块、解析库re模块、lmxl模块到数据保存的基本应用方法,这一次的学习python爬虫之旅收获很多,也希望通过记录的方式一步一步的成长。

接下来我会根据我现有的理论体系来实战。不断突破境界

一般来说,我们在网络生活中都会在搜索引擎中会直接或间接的看到不同的社会内容,而爬取热搜榜下的内容通常会用在不同的创景,主要有以下作用:

  1. 市场分析:通过分析热搜榜,企业可以了解当前的热门话题和趋势,从而调整市场策略或推广活动。
  2. 社会研究:研究者可以利用热搜数据来研究社会动态、公众兴趣和行为模式3。
  3. 新闻机构:新闻媒体可以利用热搜榜快速捕捉热点新闻,及时报道。
  4. 数据可视化:通过数据可视化技术,将热搜数据以图表、散点图等形式展示,使信息更加直观易懂。
  5. 舆情监控:政府或企业可以监控热搜榜,及时了解公众关注的焦点,进行有效的舆情管理。
  6. 内容创作:内容创作者可以根据热搜榜上的热门话题创作相关内容,吸引更多的关注和流量。
  7. 学术研究:学者可以利用热搜数据进行语言学、传播学等领域的研究。
  8. 技术开发:技术人员可以通过实践爬虫技术,提升自己在网络编程、数据解析和自动化处理方面的能力。

第一步: 选定目标网站,分析网站的请求数据,目标网址为热搜榜

下图与上图都是出自同一处请求标头

可以得知上面的数据,我们可以直接构建和添加相应的代码如下

cookies = {
    'Hm_lvt_1d9b8e4e110b54c48922093ef42f94fe': '1647522958', #跟踪用户会话状态,该值表示用户活动时间
    'PHPSESSID': 'e5ne2vg34tkfkjseuduod1q5ss', #会话标识符,用于存储会话信息,如登录状态
    'Hm_lpvt_1d9b8e4e110b54c48922093ef42f94fe': '1647523063', #跟踪用户会话状态,该值表示用户最后一次活动时间
    'UM_distinctid': '17f9806e4e4886-0e3b4c1d996d63-977173c-1fa400-17f9806e4e535f', #用户唯一标识符,用于统计用户的访问次数
    'CNZZDATA1278227787': '951014879-1647514960-%7C1647514960',#网站统计代码,用于统计网站的访问次数
}

headers = {
    'Connection': 'keep-alive',#保持连接
    'Cache-Control': 'max-age=0',#不缓存
    'Upgrade-Insecure-Requests': '1',#允许https
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36',#浏览器标识
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',#接受类型
    'Accept-Language': 'zh-CN,zh;q=0.9',#语言
}

第二步:输出响应信息,以表明爬虫响应成功,代码如下

import requests
url = 'https://hot.meibp.com/'
cookies = {
    'Hm_lvt_1d9b8e4e110b54c48922093ef42f94fe': '1647522958', #跟踪用户会话状态,该值表示用户活动时间
    'PHPSESSID': 'e5ne2vg34tkfkjseuduod1q5ss', #会话标识符,用于存储会话信息,如登录状态
    'Hm_lpvt_1d9b8e4e110b54c48922093ef42f94fe': '1647523063', #跟踪用户会话状态,该值表示用户最后一次活动时间
    'UM_distinctid': '17f9806e4e4886-0e3b4c1d996d63-977173c-1fa400-17f9806e4e535f', #用户唯一标识符,用于统计用户的访问次数
    'CNZZDATA1278227787': '951014879-1647514960-%7C1647514960',#网站统计代码,用于统计网站的访问次数
}

headers = {
    'Connection': 'keep-alive',#保持连接
    'Cache-Control': 'max-age=0',#不缓存
    'Upgrade-Insecure-Requests': '1',#允许https
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36',#浏览器标识
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',#接受类型
    'Accept-Language': 'zh-CN,zh;q=0.9',#语言
}

response = requests.get(url, headers=headers, cookies=cookies) 
if response.status_code == 200:
    print('响应成功')
else:
    print('响应失败:', response.status_code)

输出结果

第三步:分析网站页面结构,确认需要提取的数据元素为热搜类别、标题和链接

先确定热搜类别元素,图下

可以看到热搜类别在a元素中,但是我们选择的是多个类型的热搜,可以使用 XPath 语法来解析 HTML 文档,并从中提取特定数据的 Python 代码。构造代码如下

divs = html.xpath('//div[@class="items"]/div[@class="row"]/div')

然后确定热缩类别下的信息和链接,图下

可以看到选中的页面元素在div元素下,其他热搜信息也都在相同的结构中,可以使用循坏遍历语句

第四步,构建代码

divs = html.xpath('//div[@class="items"]/div[@class="row"]/div')

for div in divs:
    cat = div.xpath('./a/@title')
    for a in div.xpath('./div/div/a'):
        result = {
            "热搜类别": "".join(cat),
            "标题": "".join(a.xpath('./@title')),
            "链接": "".join(a.xpath('./@href'))
        }
        print(result)

第五,构建完整代码

import requests #导入requests模块
from lxml import etree #导入lxml模块
# 定义cookie
cookies = {
    'Hm_lvt_1d9b8e4e110b54c48922093ef42f94fe': '1647522958',
    'PHPSESSID': 'e5ne2vg34tkfkjseuduod1q5ss',
    'Hm_lpvt_1d9b8e4e110b54c48922093ef42f94fe': '1647523063',
    'UM_distinctid': '17f9806e4e4886-0e3b4c1d996d63-977173c-1fa400-17f9806e4e535f',
    'CNZZDATA1278227787': '951014879-1647514960-%7C1647514960',
}
# 定义请求头
headers = {
    'Connection': 'keep-alive',
    'Cache-Control': 'max-age=0',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'Accept-Language': 'zh-CN,zh;q=0.9',
}
# 发送请求
response = requests.get('http://hot.meibp.com/', headers=headers, cookies=cookies, verify=False)
# 解析响应内容
html = etree.HTML(response.text)
# 定位到热搜列表
divs = html.xpath('//div[@class="items"]/div[@class="row"]/div')
# 遍历热搜列表
for div in divs:
    cat = div.xpath('./a/@title') # 热搜类别
    for a in div.xpath('./div/div/a'): # 热搜标题和链接
        result = {
            "热搜类别": "".join(cat),
            "标题": "".join(a.xpath('./@title')),
            "链接": "".join(a.xpath('./@href'))
        }
        print(result)

输出结果

可以看到控制台输出信息成功

当然这个代码可以自行添加

import json

with open('data.json', 'w') as file:
    file.write(json.dumps(result, indent=2))

不过有时候做数据分析的时候,一般都是在目录文件下生成,所以我们可以通过接JSON和CSV文件组合使用,代码如下

import requests
from lxml import etree
import json
import csv

cookies = {
        'Hm_lvt_1d9b8e4e110b54c48922093ef42f94fe': '1647522958', #跟踪用户会话状态,该值表示用户活动时间
          'PHPSESSID': 'e5ne2vg34tkfkjseuduod1q5ss', #会话标识符,用于存储会话信息,如登录状态
          'Hm_lpvt_1d9b8e4e110b54c48922093ef42f94fe': '1647523063', #跟踪用户会话状态,该值表示用户最后一次活动时间
          'UM_distinctid': '17f9806e4e4886-0e3b4c1d996d63-977173c-1fa400-17f9806e4e535f', #用户唯一标识符,用于统计用户的访问次数
          'CNZZDATA1278227787': '951014879-1647514960-%7C1647514960',#网站统计代码,用于统计网站的访问次数
}

headers = {
         'Connection': 'keep-alive',#保持连接
         'Cache-Control': 'max-age=0',#不缓存
         'Upgrade-Insecure-Requests': '1',#允许https
         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36',#浏览器标识
         'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',#接受类型
         'Accept-Language': 'zh-CN,zh;q=0.9',#语言
}

# 发送请求
response = requests.get('https://hot.meibp.com/', headers=headers, cookies=cookies, verify=False)
html = etree.HTML(response.text)

# 定位到热搜列表
divs = html.xpath('//div[@class="items"]/div[@class="row"]/div')

# 调整数据结构
rows = [] # 存储热搜数据
for div in divs: # 遍历每一个热搜
    cat = "".join(div.xpath('./a/@title')) # 热搜类别
    for a in div.xpath('./div/div/a'):
        title = "".join(a.xpath('./@title')) # 热搜标题
        link = "".join(a.xpath('./@href')) # 热搜链接
        rows.append([cat, title, link])

# 将数据写入 CSV 文件
with open('data.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerow(["热搜类别", "标题", "链接"])  # 写入表头
    writer.writerows(rows)  # 写入数据行

print("数据已成功写入 data.csv 文件")

输出结果

这样的话比较美观多了,引用数据比较方便。

好了,今日分享到此一游,我是好运,想要好运。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1624187.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三 SpringMVC返回数据以及RESTFul设计标准

SpringMVC返回数据 一 控制页面跳转 1.1 快速使用 开发模式回顾在 Web 开发中,有两种主要的开发模式:前后端分离和混合开发。前后端分离模式:[重点]指将前端的界面和后端的业务逻辑通过接口分离开发的一种方式。开发人员使用不同的技术栈和…

OAuth2、JWT

文章目录 OAuth2JWT OAuth2 官网: https://oauth.net/2/ 在 RFC 6749 中说明 1、资源所有者 resource owner, 如 github 用户 2、客户端/第三方应用 client, 如 支持github 登录的 csdn 3、资源服务器 resource server, 如 4、授…

高级美肤解决方案,精细的磨皮处理效果

在数字化时代,高清视频和精致图片已成为企业展示形象、推广产品的重要媒介。然而,面对镜头时,肌肤的微小瑕疵往往成为影响整体美观的“绊脚石”。美摄科技针对这一问题,推出了一系列基于人脸识别技术的高级美肤解决方案&#xff0…

基于昇腾AI 使用AscendCL实现垃圾分类和视频物体分类应用

现如今,人工智能迅猛发展,AI赋能产业发展的速度正在加快,“AI”的需求蜂拥而来,但AI应用快速落地的过程中仍存在很大的挑战:向下需要适配的硬件,向上需要完善的技术支持,两者缺一不可。 基于此&…

Python中ArcPy按照分幅条带与成像日期拼接每个8天间隔内的遥感影像

本文介绍基于Python中的ArcPy模块,将大量遥感影像文件按照分幅条带编号与成像时间加以分组,并将同一分幅的遥感影像加以每个8天时间间隔内的镶嵌拼接的方法。 首先,来看一下本文具体的需求。我们现有一个文件夹,其中含有大量的.ti…

网工交换基础——Qinq技术

一、Qinq的概述 QinQ(802.1Q-in-802.1Q),也叫做VLAN Stacking或Double VLAN,由IEEE 802.1ad标准定义,是一项扩展VLAN空间的技术,通过在802.1Q标签报文的基础上再增加一层802.1Q的Tag来达到扩展VLAN空间的目…

面试:JVM垃圾回收

一、三种垃圾回收算法 1、标记清除(已废弃) 找到根对象(局部变量正在引用的对象、静态变量正在引用的对象);沿着根对象的引用链,查看当前的对象是否被根对象所引用,若被引用,则加上…

Oracle数据库的AI能力分析,释放企业数据价值

解锁Oracle数据库的AI潜力 Oracle数据库提供了一系列的AI能力,旨在帮助企业和开发者更高效地利用人工智能技术。以下是Oracle数据库AI能力的一些关键点:1. AI向量相似性搜索:Oracle Database 23c引入了AI Vector Search功能,该功…

2024/4/25 C++day3

#include <iostream> using namespace std; class Person //Person类 {string name; //两个私有属性变量name&#xff0c;ageint age;public: //一个公有属性指针变量&#xff0c;一个无参构造函数&#xff0c;一个有参构造函数&#xff0c;一个sho…

树莓派学习笔记--串口通信(配置硬件串口进行通信)

树莓派串口知识点 树莓派4b的外设一共包含两个串口&#xff1a;硬件串口&#xff08;/dev/ttyAMA0&#xff09;,mini串口&#xff08;/dev/ttyS0&#xff09; 硬件串口由硬件实现&#xff0c;有单独的波特率时钟源&#xff0c;性能高&#xff0c;可靠&#xff1b;而mini串口性能…

msf抓取hashdump的思考

1. windows登录的明文密码&#xff0c;存储过程是怎么样的&#xff0c;密文存在哪个文件下&#xff0c;该文件是否可以打开&#xff0c;并且查看到密文 2. 我们通过hashdump 抓取出 所有用户的密文&#xff0c;分为两个模块&#xff0c;为什么&#xff1f; 这两个模块分别都代表…

架构师系列-消息中间件(九)- RocketMQ 进阶(三)-消费端消息保障

5.2 消费端保障 5.2.1 注意幂等性 应用程序在使用RocketMQ进行消息消费时必须支持幂等消费&#xff0c;即同一个消息被消费多次和消费一次的结果一样&#xff0c;这一点在使用RoketMQ或者分析RocketMQ源代码之前再怎么强调也不为过。 “至少一次送达”的消息交付策略&#xff…

不墨迹,向媒体投稿不讲攻略,直接上方法

作为一名单位信息宣传员,我曾深陷于向媒体投稿的泥沼之中,饱尝了费时费力、审核严苛、出稿缓慢的苦涩,承受着领导急切期盼与自我压力交织的煎熬。然而,当我有幸接触到智慧软文发布系统,这一切困境如同阴霾散去,取而代之的是便捷流畅的投稿流程,以及领导满意、团队轻松的工作氛围…

详解Qt中的鼠标事件

在Qt中&#xff0c;处理鼠标事件是构建交互式界面的关键。Qt提供了一系列与鼠标相关的事件处理函数&#xff0c;允许开发者捕获鼠标的各种动作&#xff0c;如按下、释放、移动、双击等。以下是鼠标事件的使用方法、技巧以及注意事项&#xff0c;并附带C代码示例。 基础使用方法…

Node.js 22 发布,原生支持 WebSocket 客户端

昨日&#xff0c;Node.js 官方博客正式宣布 Node.js 22 的发布&#xff01;新版本亮点包括 require() ES 模块、WebSocket 客户端、V8 JavaScript 引擎的更新等&#xff01; Node.js 22 将在 10 月进入长期支持 (LTS)&#xff0c;但在此之前&#xff0c;它将是接下来六个月的 …

问题-MySQL将较大的SQL文件导入MySQL

迁移数据的时候&#xff0c;我们有时候会用sqlyog等数据库工具导入到新数据库。可能插入的SQL语句太大&#xff0c;出现导入一半失败的情况。明明代码没错&#xff0c;这让人摸不着头脑。 对于大文件导入&#xff0c;有几种方法&#xff1a; 方法1&#xff1a;使用命令行&…

总体设计(下)

启发规则 描绘软件结构的图形工具 面向数据流的设计方法

暴雨亮相CCBN2024 助力广电行业数智化转型

4月23日&#xff0c;第三十届中国国际广播电视信息网络展览会&#xff08;简称CCBN2024&#xff09;在北京开展&#xff0c;本次展览会由国家广播电视总局指导、广播电视科学研究院主办&#xff0c;作为国内广电视听领域首个综合性、专业化、引领性、国际化科技产业盛会&#x…

搭建强化学习的机械臂MuJoCo环境以及urdf转xml文件方法

一、背景 基于强化学习的机械臂应用日趋广泛&#xff0c;摆脱了基于模型到达固定点的束缚。基于强化学习算法&#xff0c;机械臂可以完成拧魔方、推抓任务&#xff08;Andy Zeng的经典论文&#xff09;&#xff0c;暂且想一下如果用传统方法完成此类复杂任务是何等困难。 强化…

Chisel 入门(2)运算符

Chisel 入门(2) 运算符 逻辑运算符 ChiselExplanationwidth!x逻辑非1x && y逻辑与1x||y逻辑或1 位操作运算符 ChiselExplanationwidthin Verilog~x位反w(x)~ signal_xx & y位与max(w(x), w(y))signal_x & signal_yx | y位或max(w(x), w(y))signal_x | sign…