安装bs4模块,使用pip在线安装即可,进入输入安装指令如下:
% pip3 install bs4
首先分析24小时热销榜的网页结构,在浏览器访问网址()并打开浏览器的开发者工具,点击选项卡的Doc标签,如下图所示:
分析网页结构是要根据爬虫的爬取方式而决定,爬取方式主要分两类,说明如下:
(1) 如果使用Selenium或Splash爬取数据,网页分析需要在开发者工具的Elements选项卡里进行,因为Selenium和Splash是获取网页加载后的内容。
(2)如果使用或这类模块爬取数据,则由开发者工具的选项卡进行网页分析,并且还要在各个分类标签里找到数据所对应的请求方式。
从图上看到, 网页上的小说信息可以在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秒左右,这样的爬取效率归功于的异步并发特性。打开输出电子表格文件查看排行榜的小说信息如下图:
———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,永久会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: hs105011
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。