python爬虫11:实战3

news2025/1/17 21:38:02

python爬虫11:实战3

前言

​ python实现网络爬虫非常简单,只需要掌握一定的基础知识和一定的库使用技巧即可。本系列目标旨在梳理相关知识点,方便以后复习。

申明

​ 本系列所涉及的代码仅用于个人研究与讨论,并不会对网站产生不好影响。

目录结构

文章目录

    • python爬虫11:实战3
      • 1. 目标
      • 2. 详细流程
        • 2.1 前置基础
        • 2.2 整体框架
        • 2.3 获取目标小说函数
        • 2.4 获取小说章节函数
        • 2.5 下载小说函数
        • 2.6 完整代码
      • 3. 总结

1. 目标

​ 这次爬虫实战,采用的库为:selenium,这次同样以之前的小说网站为目标,具体的网站老规矩就不给了,大家学习思路最重要。

再次说明,案例本身并不重要,重要的是如何去使用和分析,另外为了避免侵权之类的问题,我不会放涉及到网站的图片,希望能理解

2. 详细流程

2.1 前置基础

​ 之前已经分别采用requests+lxmlrequests+bs4实现了这个实战,这里我们采用selenium来实现,只需要对代码进行一定程度的修改即可完成目标,因此建议没看过这两篇文章的可以先看看。

​ 正因如此,本篇的主要目的在于熟悉selenium的使用流程和使用技巧

2.2 整体框架

​ 我们先来写出整体框架:

# 导入包
from selenium import webdriver
from selenium.webdriver.common.by import By

# 获取目标小说
def get_search_book():
    pass

# 获取小说章节列表
def get_book_chapters():
    pass

# 下载小说
def download_chapter():
    pass


if __name__ == '__main__':
    # 第一步,请求小说网站,并进行搜索,获取到要看的小说
    get_search_book()
    # 第二步,获取小说的目录
    get_book_chapters()
    # 第三步,下载小说
    download_chapter()

​ 下面来一一完成目标。

2.3 获取目标小说函数

​ 这个函数的流程如下:

1. 请求网页
2. 找到网页中的搜索框标签和搜索框旁边的搜索按钮
3. 输入想要搜索的小说,然后点击按钮即可跳转

​ 另外,像这种搜索框、搜索按钮之类的,一般都有比较独一无二的属性,因此可以非常快速的确定标签位置。所以这里就不讲解如何获取标签了(并且之前两篇已经分享过具体的分析流程了)。

​ 完成后代码如下:

# 获取目标小说
def get_search_book():
    # 初始化
    driver = webdriver.Chrome()
    # 地址
    url = 'https://www.iwurexs.net/'
    # 请求
    driver.get(url)
    # 找到搜索框和搜索按钮
    input_tag = driver.find_element(by=By.ID,value='bdcs-search-form-input')
    search_button = driver.find_element(by=By.ID,value='bdcs-search-form-submit')
    # 搜索要看的小说名字
    book = input('请输入要看的小说名字:')
    # 开始搜索
    input_tag.send_keys(book)
    search_button.click()
    time.sleep(2)
    # 切换到新的页面句柄上
    # print(driver.window_handles)
    # print(driver.current_window_handle)
    driver.switch_to.window(driver.window_handles[1])
    # 找到我们需要的信息
    a_list = driver.find_elements(by=By.XPATH,value='//div[@class="show"]//table[@class="grid"]//td[@class="even"]//a')
    url_list = [a.get_attribute('href') for a in a_list]
    text_list = [a.text for a in a_list]
    # 选择要下载的小说
    for url,text in zip(url_list,text_list):
        print('当前小说名:',text)
        decision = input('是否选择下载该小说(Y/N):')
        if decision == 'Y':
            driver.close()
            return url,text

​ 运行结果如下图:

在这里插入图片描述

2.4 获取小说章节函数

​ 这个函数更简单,流程如下:

1. 请求上面获取的链接
2. 找到所有的章节a标签即可(我这里用的xpath,即之前第一个实战讲解的思路)

​ 代码如下:

# 获取小说章节列表
def get_book_chapters(url):
    # 初始化
    driver = webdriver.Chrome()
    # 请求
    driver.get(url)
    # 找到章节目录
    a_list = driver.find_elements(by=By.XPATH,value='//div[@class="show"]//div[contains(@class,"showBox") and position()=3]//ul//a')
    # 获取相关信息
    url_list = [a.get_attribute('href') for a in a_list]
    title_list = [a.text for a in a_list]
    driver.close()
    return url_list,title_list

​ 结果如下:

在这里插入图片描述

2.5 下载小说函数

​ 这个函数修改起来也很简单,思路如下:

1. 一个一个的请求上面获取的章节链接
2. 解析获取每个章节的内容
3. 将章节内容和标题保存到txt文件中

​ 代码如下:

# 下载小说
def download_chapter(url,title):
    # 初始化
    driver = webdriver.Chrome()
    # 请求
    driver.get(url)
    # 解析
    content = driver.find_element(by=By.ID,value='content').text
    # 写入文件中
    with open(title+'.txt','w',encoding='utf-8') as f:
        f.write(content)
    # 退出
    driver.close()
    driver.quit()

​ 运行结果如下:

在这里插入图片描述

2.6 完整代码

​ 完整代码如下:

# 导入包
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

# 获取目标小说
def get_search_book():
    # 初始化
    driver = webdriver.Chrome()
    # 地址
    url = 'https://www.iwurexs.net/'
    # 请求
    driver.get(url)
    # 找到搜索框和搜索按钮
    input_tag = driver.find_element(by=By.ID,value='bdcs-search-form-input')
    search_button = driver.find_element(by=By.ID,value='bdcs-search-form-submit')
    # 搜索要看的小说名字
    book = input('请输入要看的小说名字:')
    # 开始搜索
    input_tag.send_keys(book)
    search_button.click()
    time.sleep(2)
    # 切换到新的页面句柄上
    # print(driver.window_handles)
    # print(driver.current_window_handle)
    driver.switch_to.window(driver.window_handles[1])
    # 找到我们需要的信息
    a_list = driver.find_elements(by=By.XPATH,value='//div[@class="show"]//table[@class="grid"]//td[@class="even"]//a')
    url_list = [a.get_attribute('href') for a in a_list]
    text_list = [a.text for a in a_list]
    # 选择要下载的小说
    for url,text in zip(url_list,text_list):
        print('当前小说名:',text)
        decision = input('是否选择下载该小说(Y/N):')
        if decision == 'Y':
            driver.close()
            return url,text


# 获取小说章节列表
def get_book_chapters(url):
    # 初始化
    driver = webdriver.Chrome()
    # 请求
    driver.get(url)
    # 找到章节目录
    a_list = driver.find_elements(by=By.XPATH,value='//div[@class="show"]//div[contains(@class,"showBox") and position()=3]//ul//a')
    # 获取相关信息
    url_list = [a.get_attribute('href') for a in a_list]
    title_list = [a.text for a in a_list]
    driver.close()
    return url_list,title_list


# 下载小说
def download_chapter(url,title):
    # 初始化
    driver = webdriver.Chrome()
    # 请求
    driver.get(url)
    # 解析
    content = driver.find_element(by=By.ID,value='content').text
    # 写入文件中
    with open(title+'.txt','w',encoding='utf-8') as f:
        f.write(content)
    # 退出
    driver.close()
    driver.quit()


if __name__ == '__main__':
    # 第一步,请求小说网站,并进行搜索,获取到要看的小说
    url,title = get_search_book()
    # 第二步,获取小说的目录
    url_list,title_list = get_book_chapters(url)
    # 第三步,下载小说
    for url,title in zip(url_list,title_list):
        download_chapter(url,title)

3. 总结

​ 本次目的是熟悉selenium的基本操作,比如请求网页、解析网页、切换窗口等内容。本次案例比较简单,并且有前面的lxml、bs4的基础,所以讲解得比较粗糙。

​ 除此之外,通过本次案例,可以明显看出,selenium比其他库的优势在于,由于它是模仿人的浏览动作,因此想要被反爬虫识别出来是有一定难度的。

​ 下一篇,讲解selenium处理动态网页。

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

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

相关文章

springboot整合modbus4J(一)

springboot整合modbus4J 1. 介绍 (1) modbus poll:modbus主机仿真器,用于测试和调试modbus从设备。该软件支持modbus rtu、ASCII、TCP/IP。用来帮助开发人员测试modbus从设备,或者其它modbus协议的测试和仿真。它支持多文档接口&#xff0c…

阿里云服务器和腾讯云服务器折扣对比_哪家折扣低?

阿里云服务器和腾讯云服务器根据购买时长可以享受一定的优惠折扣,综合对比下来腾讯云折扣更低,阿腾云来对比下阿里云和腾讯云的云服务器根据购买时长可以享受的常规折扣对比: 目录 阿里云和腾讯云折扣对比 阿里云服务器常规折扣 腾讯云服…

逃出Verifier 无限蓝屏

逃出Verifier 无限蓝屏 前情提要:今天由于在处理 终止代码:WDF_VIOLATION 的蓝屏时,看到网上有用Verifier 来处理这个问题,但是按照方法处理后导致了Verifier无限蓝屏,重启就蓝屏,最后是进入安全模式操作&a…

软件测试及数据分析处理实训室建设方案

一 、系统概述 软件测试及数据分析处理是软件开发过程中的一项重要测试活动,旨在验证不同软件模块或组件之间的集成与交互是否正常。综合测试确保各个模块按照设计要求正确地协同工作,以实现整个软件系统的功能和性能。以下是软件测试及数据分析处理的一…

数据通信——TCP(三次握手及基础特性)

引言 TCP(传输控制协议),不像之前的UDP那样,因为这个协议要将很多复杂的东西,所以这次的特性是简单的特性,后续会讲一些复杂难懂的知识,这次先说一些TCP明显的特性 面向连接 TCP提供了对连接的管…

[论文分享]TSPTM-survey:时间序列预训练模型研究综述

目录 1 概要 1.1 贡献点 2 背景 2.1 时序挖掘(TSM)任务 2.2 时间序列的深度学习模型 2.3 预训练模型优势 3 TS-PTMS 概述 3.1 监督预训练 3.1.1 基于分类的预训练 3.1.1.1 通用编码器 3.1.1.2 对齐编码器 3.1.1.3 模型重编程 3.1.1.4 总结 3.1.2 基于预测的预训练…

线性代数(五) 线性空间

前言 《线性代数(三) 线性方程组&向量空间》我通过解线性方程组的方式去理解线性空间。此章从另一个角度去理解 空间是什么 大家较熟悉的:平面直角坐标系是最常见的二维空间 空间由无穷多个坐标点组成 每个坐标点就是一个向量 反过来,也可说&…

泡泡玛特回应头部IP营收增速放缓:IP上市时间不固定

8月23日,针对今年上半年头部IP营收增速放缓问题,泡泡玛特(09992.HK)管理层在业绩会上解释称,每个IP上市时间并不固定,单从上半年看同比增长会有偏差,而随着下半年两个新系列的推出,全…

Sql Server 数据库事务与锁,同一事务更新查询锁的变化

我有一个People表,有三行数据: 如果我们没详细了解数据库事务执行加锁的过程中,会不会有这样一个疑问:如下的这段 SQL 开启了事务,并且在事务中进行了更新和查询操作。 BEGIN TRAN update People set Name张三 where …

AI绘画工具MJ新功能有点东西,小白也能轻松一键换装

先看最终做出来的效果 直接来干货吧。Midjourney,下面简称MJ 1.局部重绘功能来袭 就在前两天,MJ悄咪咪上线了这个被众人期待的新功能:局部重绘。 对于那些追求创新和个性化的设计师来说,局部绘制不仅是一个实用的功能&#xff…

Smartbi电子表格软件版本更新,首次推出Excel轻应用和语音播放

Smartbi电子表格软件又又又更新啦! 此次更新,首次推出了新特性——Excel轻应用和语音播报。另外,还对产品功能、Demo示例、配套文档进行了完善和迭代。 低代码开发Excel轻应用 可实现迅速发布web应用 业务用户的需求往往都处于“解决问题”…

无涯教程-进程 - 简介

进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区。另外,系统空间是“公共场所”,各进…

重磅!云智慧监控宝这些功能免费用啦

自云智慧推出监控宝以来,各行业领域反映强烈,现已有超过24万人次使用监控宝官网的免费试用功能。得益于诸多企业及用户对监控宝热情的持续升温,云智慧释放技术红利,推出监控宝免费使用福利,面向中小型企业提供监控宝核…

YOLO目标检测——耳环数据集下载分享

耳环数据集 耳环数据集是用于研究和分析耳环相关问题的数据集,包含了各种不同类型和风格的耳环图像,共同2600张高清图片 数据集点击下载:YOLO耳环数据集2600图片.rar

如何利用链路追踪快速定位问题

“中浩,xxx接口报错了你看一下咋回事” “稍等一下哈,我看一下。Xxx组的xxx接口报错了,我们这边直接抛错了” “具体啥问题啊,你看下日志,我去找xxx组的人问一下,现在阻塞流程了啊” “呃。。。对这个接口的请求日志…

WebDAV之π-Disk派盘 + 一刻日记

一刻日记是一款日记、笔记和备忘录应用程序,旨在提供一个简单而专注的日记写作工具。它提供了一个干净、直观的界面,允许用户记录和管理他们的日常事务、个人情感、成就和目标等内容。 一刻日记的主要功能包括: – 创建和编辑日记、用户可以撰写和编辑自己的日记,记录重要…

腾讯云服务器租用价格表_一年、1个月和1小时报价明细

腾讯云服务器租用费用表:轻量应用服务器2核2G4M带宽112元一年,540元三年、2核4G5M带宽218元一年,2核4G5M带宽756元三年、云服务器CVM S5实例2核2G配置280.8元一年、GPU服务器GN10Xp实例145元7天,腾讯云服务器网长期更新腾讯云轻量…

Gitee API的使用|如何批量删除Gitee下的所有仓库

前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。 高质量博客汇总https://blog.csdn.net/yu_cblog/cate…

【LeetCode 】数组简介

集合列表和数组 本文中介绍的概念为适用于所有编程语言的抽象理论,具体实现会由编程语言的不同而稍有差别。 具体介绍数组之前,我们先来了解一下集合、列表和数组的概念之间的差别。 集合 集合一般被定义为:由一个或多个确定的元素所构成的…

数字人直播软件火爆!为何越来越多人看好无人直播的应用前景?

随着科技的不断发展,数字人直播的应用前景正在逐渐明朗化。数字人是指利用计算机技术创建的一种虚拟人物,可以模仿真人的声音、表情、动作等,具有很高的仿真度和互动性。数字人直播是指通过数字人技术实现的一种直播方式,可以让观…