Aiohttp异步爬取小说排行榜

news2024/11/27 10:28:23

Aiohttp异步爬取小说排行榜

*** Aiohttp简介及使用 ***

​ Aiohttp是Python的一个第三方网络编程模块, 它可以开发服务端和客户端,服务端也就是我们常说的网站服务器;客户端是访问网站的API接口,常用于接口测试,也可用于开发网络爬虫。Aiohttp是基于Asyncio实现的HTTP框架,Asyncio是从Python3.4开始引入的标准库,它是因协程的概念而生,这是Python官网推荐高并发的模块之一。

​ 由于Asyncio具有高并发的特性,因此Aiohttp继承了Asyncio的特性, 使得Aiohttp非常适合开发网络爬虫。在使用Aiohttp之前,需要安装Aiohttp模块,安装方式可以使用pip指令完成,也可以自行下载whl安装包(https://www.lfd.uci.edu/~gohlke/pythonlibs/#aiohttp),安装指令如下:

# pip 在线安装aiohttp
pip3 install aiohttp

Aiohttp模块安装完成之后,在Python的交互模式下,导入Aiohttp模块并验证模块安装是否成功,验证代码如下:

>>>import aiohttp
>>>aiohttp.__version__
'3.8.4'

Aiohttp异步爬取小说排行榜

运行环境

​ 操作系统:mac OS

​ IDE: Pycharm professional 2020.1

通过案例了解Aiohttp的应用,案例实现过程如下:

  • 爬取对象是起点小说网的24小时热销榜
  • 数据清洗会使用第三方模块bs4实现
  • 数据以CSV文件存储并以电子表格文件输出

安装bs4模块,使用pip在线安装即可,进入terminal输入安装指令如下:

% pip3 install bs4

首先分析24小时热销榜的网页结构,在浏览器访问网址(www.qidian.com/rank/hotsales?page1)并打开浏览器的开发者工具,点击Network选项卡的Doc标签,如下图所示:

在这里插入图片描述

分析网页结构是要根据爬虫的爬取方式而决定,爬取方式主要分两类,说明如下:

  (1) 如果使用Selenium或Splash爬取数据,网页分析需要在开发者工具的Elements选项卡里进行,因为Selenium和Splash是获取网页加载后的内容。

​ (2)如果使用Requests或Aiohttp这类模块爬取数据,则由开发者工具的Network选项卡进行网页分析,并且还要在各个分类标签里找到数据所对应的请求方式。

从图上看到, 网页上的小说信息可以在Doc标签里找到对应的HTML源码,并且在Doc标签的请求地址与浏览器的地址栏是一致的,也就是说我们只需对网页地址发送HTTP请求即可获取小说信息。

在网页下最下方设有分页功能,当点击不同的页数按钮,浏览器地址栏的URL地址会随之变化, 如第一页的page1、第二页的page2…以此类推,参数page 代表分页功能的页数,URL地址根据页数的不同来显示相应的小说信息。如下图所示:

在这里插入图片描述
在这里插入图片描述

从上述的分析得知,只要动态改变URL地址的参数page即可得到不同页数的网页内容,然后将网页内容进行数据清洗并提取相应的小说信息,最后将小说信息写入csv文件,然后输出为电子表格文件,项目实现代码如下:

from bs4 import BeautifulSoup
import aiohttp
import asyncio
import csv
import pandas as pd
from pandas.io.excel import ExcelWriter


# 定义网站访问函数getData,将网站内容返回
async def getData(url, headers):
    # 创建会话对象session
    async with aiohttp.ClientSession() as session:
        # 发送GET请求,并设置请求头
        async with session.get(url, headers=headers) as response:
            # 返回响应内容
            return await response.text()


# 定义存储数据函数,解析页面返回
def saveData(result):
    for _ in result:
        soup = BeautifulSoup(_, 'html.parser')
        find_div = soup.find_all('div', class_='book-mid-info')
        for d in find_div:
            name = d.find('h2').getText()
            author = d.find('a', class_='name').getText()
            intro = d.find('p', class_='intro').getText()
            update = d.find('p', class_='update').getText()
            csvFile = open('data.csv', 'a', newline='')
            writer = csv.writer(csvFile)
            writer.writerow([name, author, intro,  update])
            csvFile.close()


# 定义运行函数
def run():
    for _ in range(25):
        # 构建不同的URL地址并传入函数getData,最后由asyncio模块执行
        task = asyncio.ensure_future(getData(url.format(_ + 1), headers))
        # 将所有请求加入到列表tasks
        tasks.append(task)
    # 等待所有请求执行完成,一并返回全部的响应内容
    result = loop.run_until_complete(asyncio.gather(*tasks))
    saveData(result)
    print(len(result))


if __name__ == '__main__':
    headers = {
        'User-Agent':
            'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 '
            'Safari/537.36 '
    }
    csvFile = open('data.csv', 'w', newline='')
    writer = csv.writer(csvFile)
    # 写入标题,以便后面转成电子表格文件做表头
    writer.writerow(['书 名', '作 者', '简介', '更新日期'])
    csvFile.close()
    url = 'https://www.qidian.com/rank/hotsales/page{}/'
    # 创建get_event_loop对象
    loop = asyncio.get_event_loop()
    tasks = []
    # 调用函数run
    run()
    with ExcelWriter('畅销小说排行榜.xlsx') as ew:
        # 将csv文件转换为excel文件
        pd.read_csv("data.csv").to_excel(ew, sheet_name="起点中文小说畅销榜", index=False)

排行榜25个分页所爬取的时间约为3秒左右,这样的爬取效率归功于Aiohttp的异步并发特性。打开输出电子表格文件查看排行榜的小说信息如下图:
在这里插入图片描述

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

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

相关文章

Vue基础第七篇

一、vuex的使用 1.概念 在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信。 2.何时…

MyBatis操作数据库实现

说明:MyBatis是作用于三层架构开发,数据访问层(Data Access Object)的框架,用于访问数据库,对数据进行操作。 一、环境搭建 首先,创建一个SpringBoot模块,然后把MyBatis的环境搭建…

华为OD机试真题 JavaScript 实现【获取字符串中连续出现次数第k多的字母的次数】【2023Q1 100分】,附详细解题思路

一、题目描述 给定一个字符串&#xff0c;只包含大写字母&#xff0c;求在包含同一字母的子串中&#xff0c;长度第 k 长的子串的长度&#xff0c;相同字母只取最长的那个子串。 二、输入描述 第一行有一个子串(1<长度<100)&#xff0c;只包含大写字母&#xff1b;第二…

GEngine一个基于WebGPU的渲染引擎

一、废话篇&#xff1a; 2019年时候就有写一个渲染引擎想法&#xff0c;一直到现在才真正意义上算给实现了当初的想法&#xff0c;写了好几个月了和小伙伴这才有个初版&#xff08;虽然里面还有一堆bug哈&#xff0c;没时间改啊&#xff09;。说在前面GEngine借鉴了其他渲染引擎…

计算机网络方面的面试题目(合集)

python面试题 1、python下多线程的限制以及多进程中传递参数的方式 python多线程有个全局解释器锁(global interpreter lock)&#xff0c;这个锁的意思是任一时间只能有一个线程使用解释器&#xff0c;跟单cpu跑多个程序一个意思&#xff0c;大家都是轮着用的&#xff0c;这叫“…

在外web浏览器远程访问jupyter notebook服务器详细教程

文章目录 前言视频教程1. Python环境安装2. Jupyter 安装3. 启动Jupyter Notebook4. 远程访问4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5. 固定公网地址 前言 Jupyter Notebook&#xff0c;它是一个交互式的数据科学和计算环境&#xff0c;支持多种编程语言&#…

利用 canvas 实现背景图片和其他图片以及文字的组合生成新图片

预览世界效果图如下&#xff1a; 注&#xff1a;以下图片中&#xff0c;二维码部分是我动态生成的&#xff0c;以及姓名和工号位置的参数需要动态替换。 实现思路&#xff1a; 利用 canvas 实现在面板上画图以及绘制文字等等。 官方文档 API 地址如下&#xff1a;canvas AP…

知道效果广告,让你的广告投入更有价值!

效果广告作为一种能直接触达用户的广告&#xff0c;在互联网上遍地开花&#xff0c;今天我们就一起来了解下效果广告吧&#xff5e; 1.背景 在传统的门户广告、搜索广告中&#xff0c;一则广告的呈现是针对其所有可覆盖的受众&#xff0c;而真正对广告信息感兴趣的人群只是广大…

代码审计 底层逻辑

红队利用中&#xff0c;主要有以下几个板块。 找到漏洞-->利用漏洞-->权限维持-->痕迹清除。找到漏洞对应的技能是代码审计。 利用漏洞对应的技能是各和实战中利用技巧绕 waf。 权限维持&#xff0c;抽象来看&#xff0c;就是系统自己启动我的恶意代码&#xff0c;实现…

ROS学习——通信机制(话题通信③—注意事项)

2.1.2 话题通信基本操作A(C) Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 043话题通信(C)4_注意事项_Chapter2-ROS通信机制_哔哩哔哩_bilibili 1. int main(int argc, char const *argv[]){} vscode 中的 main 函数 声明 int main(int argc, char const *argv…

更新Navicat Premium 16.2 之 如何使用Navicat连接Redis的新手教程

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

向clickhouse插入一段由经纬度构成的路径

目录 背景粗暴简单字符串示例 数组套数组示例 LineStringWKT来帮忙参考资料 背景 现有一条路&#xff0c;这条路由好几段路段构成&#xff0c;每个路段又由一些轨迹点先后连接而成&#xff0c;且这些轨迹点数量不固定&#xff0c;有些路段由10个轨迹点连接而成&#xff0c;有些…

13 MCMC——马尔可夫链蒙特卡洛

文章目录 13 MCMC——马尔可夫链蒙特卡洛13.1 MCMC的意义13.2 简单采样方法介绍13.2.1 概率分布采样13.2.2 Rejection Sampling——拒绝采样13.2.3 Importance Sampling——重要性采样 13.3 Markov Chain知识补充13.3.1 Markov Chain定义13.3.2 Markov Chain性质——平稳分布13…

javaScript蓝桥杯----猜硬币

目录 一、介绍二、准备三、目标四、代码五、完成 一、介绍 为了打发无聊的时间&#xff0c;小蓝开发了一款人机对战的猜硬币游戏&#xff0c;页面中一共有 9 个杯子&#xff0c;系统会随机挑选 3 个杯子在里面放入硬币&#xff0c;玩家通过输入含有杯子序号的字符串进行猜选&a…

基于Python班级管理系统毕业设计-附源码171809

目 录 摘要 1 绪论 1.1研究背景 1.2研究的目的与意义 1.3系统开发技术的特色 1.4论文结构与章节安排 2 基于Python班级管理系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 2.3.2数据修改流程 2.3.3数据删除流程 2.3 系统功能分析 2.3.1 功能性…

【考点】CKA 08_Kubernetes工作负载与调度 关系调度 nodeSelector 亲和性和反亲和性 污点 节点驱离与下线

文章目录 考试题目&#xff1a;deployment 扩容&#xff08;扩容命令&#xff09;1. Kubernetes 调度器1.1 调度概览1.2 kube-scheduler1.3 kube-scheduler 调度流程 2. Kubernetes 关系调度2.1 节点标签2.2 节点隔离/限制2.3 nodeName 字段2.3.1 准备工作2.3.2 创建使用 nodeN…

深度学习-第T10周——数据增强

深度学习-第T10周——数据增强 深度学习-第T10周——数据增强一、前言二、我的环境三、前期工作1、导入数据集2、查看图片数目 四、数据预处理1、 加载数据1.1、设置图片格式1.2、划分训练集1.3、划分验证集1.4、查看标签1.5、再次检查数据1.6、配置数据集 2、数据可视化 五、数…

硬件设计电源系列文章-DCDC转换器基础知识

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示&#xff1a;这里可以添加技术概要 本文主要接着上篇&#xff0c;上篇文章主要讲述了LDO的相关基础知识&#xff0c;本节开始分享DCDC基础知识 整体架构流程 提示&#xff1a;这里可以添加技术整体架构 以下是…

ROS学习——通信机制(话题通信②—订阅方实现)

2.1 话题通信 Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 042话题通信(C)3_订阅方实现_Chapter2-ROS通信机制_哔哩哔哩_bilibili 1.新建demo02_sub.cpp文件&#xff0c;搭建框架 2.包含头文件 3.初始化ROS节点 cuiHua——节点名称&#xff0c;具有唯一性 4.创…

一小时让你Get到面试套路:记一次Java初中级程序员面试流程梳理

视频教程传送门&#xff1a; 一小时让你Get到面试套路&#xff1a;记一次Java初中级程序员面试流程梳理_哔哩哔哩_bilibili听了N多个师兄师姐的面试录音&#xff0c;采访了N多个师兄时间的面试经历&#xff0c;才总结出来的java面试流程&#xff0c;非常适合正在准备面试的你。…