Aiohttp异步爬取小说排行榜

简介: Aiohttp异步爬取小说排行榜

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标签,如下图所示:

image.png

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

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

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

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

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

image.png

从上述的分析得知,只要动态改变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的异步并发特性。打开输出电子表格文件查看排行榜的小说信息如下图:

image.png

相关文章
|
2月前
|
数据采集 开发者 Python
小说爬取练习
通过Python的requests和BeautifulSoup4库爬取小说网站内容,详细说明爬取步骤和代码实现。
小说爬取练习
|
6月前
|
数据采集 JSON 监控
高效爬取Reddit:C#与RestSharp的完美结合
本文介绍了如何使用C#和RestSharp库,结合代理IP与多线程技术爬取Reddit数据。在数据驱动时代,Reddit作为宝贵的资料来源,其频繁更新带来了爬取挑战。通过代理服务器隐藏真实IP防止封禁,利用多线程提高并发性,文章提供代码示例展示如何实现高效爬取。关键点包括代理配置、请求头设置和数据解析统计。同时强调遵守网站条款和法律道德边界。
高效爬取Reddit:C#与RestSharp的完美结合
|
6月前
|
数据采集 存储 数据挖掘
Python爬虫实战:打造一个简单的新闻网站数据爬取工具
本文将介绍如何运用Python编写一个简单而高效的网络爬虫,帮助您在实际项目中快速获取并存储新闻网站的数据。通过学习本文,您将了解到如何利用Python中的第三方库和技术来实现数据爬取,为您的数据分析和应用提供更多可能性。
|
6月前
爬取小说
爬取小说
58 0
|
数据采集 XML 存储
构建一个简单的电影信息爬虫项目:使用Scrapy从豆瓣电影网站爬取数据
这个案例展示了如何使用 Scrapy 框架构建一个简单的爬虫项目,从网页中提取数据并保存到文件中。通过配置、编写爬虫代码、定义数据模型和数据处理管道,你可以灵活地构建各种爬虫应用。
308 0
构建一个简单的电影信息爬虫项目:使用Scrapy从豆瓣电影网站爬取数据
|
数据采集 Python
异步请求库的实际应用案例:爬取豆瓣经典电影
异步请求库的实际应用案例:爬取豆瓣经典电影
|
数据采集 Python
python爬虫爬取豆瓣电影排行榜
爬虫爬取豆瓣电影排行榜
|
数据采集 Python
Python爬虫:requests多进程爬取猫眼电影榜单
Python爬虫:requests多进程爬取猫眼电影榜单
255 0
|
数据采集 Web App开发 Python