python爬虫11:实战3

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.mfbz.cn/a/91756.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nonlocal关键字声明

nonlocal关键字声明 作用 使得内层函数可以使用/修改外层函数的变量 值得注意的是,在未使用nonlocal声明时 对于外层函数中的可变对象,内层函数即可访问,也可以修改 def outer():x, y [1], [2]def inner(z):x.append(1)print(x)print(z)r…

历史最佳二季度表现后,爱奇艺想为用户提供更多价值

以爱奇艺为首,随着长视频平台相继转变运营思路,走向盈利目标,最早完成蜕变的爱奇艺,已开始迈向下一阶段。 近日,爱奇艺发布了截至6月30日的2023年第二季度财报。除了依然亮眼的内容表现、业绩成果外,爱奇艺…

1.Flink源码编译

目录 1.环境版本 1.1 jdk 1.2.maven 1.3.node 1.4.scala 2.下载flink源码 3.编译源码 4.idea打开flink源码 5.运行wordcount 1.环境版本 软件地址 链接:https://pan.baidu.com/s/1ZxYydR8rBfpLCcIdaOzxVg 提取码:12xq 1.1 jdk 1.2 maven 1.…

Bean 作用域和生命周期

前言: 📕作者简介:热爱编程的小七,致力于C、Java、Python等多编程语言,热爱编程和长板的运动少年! 📘相关专栏Java基础语法,JavaEE初阶,数据库,数据结构和算法…

GPT4模型架构的泄漏与分析

迄今为止,GPT4 模型是突破性的模型,可以免费或通过其商业门户(供公开测试版使用)向公众提供。它为许多企业家激发了新的项目想法和用例,但对参数数量和模型的保密却扼杀了所有押注于第一个 1 万亿参数模型到 100 万亿参…

【Mac】编译Spring 源码和Idea导入

今天我们开始Spring源码的阅读之旅。阅读Spring的源码的第一步当然是编译Spring源码。首先我们要去GitHub上将spring源码给clone下来。 笔者编译环境如下: Spring版本:5.28 https://github.com/spring-projects/spring-framework/tree/v5.2.8.RELEASE …

LoadRunner操作教程

日升时奋斗,日落时自省 目录 1、Virtual User Generator (VUG) 1.1、WebTours系统 1.1.1、WebTours启动 1.1.2、WebTours配置 1.2、脚本录制 1.3、编译 1.4、脚本运行 1.5、加强脚本 1.5.1、事务插入 1.5.2、插入集合点 1.5.3、参…

【C++ 学习 ⑰】- 继承(下)

目录 一、派生类的默认成员函数 二、继承与友元 三、继承与静态成员 四、复杂的菱形继承及菱形虚拟继承 五、继承和组合 一、派生类的默认成员函数 派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。如果基类没有默认构造函数,那么必须在派生…

Python基础学习第一天:关于Python的简单介绍

前言 最近一批批大一新生都要开始踏入校园了,计算机专业 emmm…如果有需要学习python的,尤其是还没开学的,确实可以开始找找资料看看python了,如果是自己本来就对python感兴趣,更应该需要看看了,毕竟学校到…

阿里云 Serverless 应用引擎 2.0,正式公测!

阿里云 Serverless 应用引擎 SAE2.0 正式公测上线!全面升级后的 SAE2.0 具备极简体验、标准开放、极致弹性三大优势,应用冷启动全面提效,秒级完成创建发布应用,应用成本下降 40% 以上。 此外,阿里云还带来容器服务 Se…

无涯教程-聚类算法 - Mean-Shift

如前所述,它是在无监督学习中使用的另一种强大的聚类算法,与K均值聚类不同,它不做任何假设,因此,它是一种非参数算法。 均值平移算法基本上是通过将数据点移向最高密度的数据点(即群集质心)来迭代地将数据点分配给群集…

【日常积累】Linux中vi/vim的使用

概述 vim是由vi发展演变过来的文本编辑器,因其具有语法高亮显示、多视窗编辑、代码折叠、支持插件等功能,由于其功能相比vi来说更加强大,所以在实际工作中的使用更加广泛。 vim工作模式 Vim具有多种工作模式,常用的工作模式有&…

去除wps段落柄,删除空白页

如图,有一个段落柄在左端,无法删除,只能编辑。 导致本来是8页内容,现在是9页,多了一空白页 后面新建一个空白页,发现默认会自带一个段落柄,所以有可能这个段落柄是不能消除的,那么如…

【LeetCode-面试经典150题-day15】

目录 104.二叉树的最大深度 100.相同的树 226.翻转二叉树 101.对称二叉树 105.从前序与中序遍历序列构造二叉树 106.从中序与后序遍历序列构造二叉树 117.填充每个节点的下一个右侧节点指针Ⅱ 104.二叉树的最大深度 题意: 给定一个二叉树 root ,返回其…

智能井盖传感器,物联网智能井盖系统

随着城市人口的不断增加和城市化进程的不断推进,城市基础设施的安全和可靠性变得愈发重要,城市窨井盖作为城市基础设施重要组成部分之一,其安全性事关城市安全有序运行和居民生产生活安全保障。 近年来,各地都在加强城市窨井盖治理…

【C/C++】多态的概念 | 虚函数 | 虚函数指针

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

STM32 BOOT 启动配置 ISP升级 介绍

启动配置 在STM32F10xxx里&#xff0c;可以通过BOOT[1:0]引脚选择三种不同启动模式。 启动模式选择引脚启动模式说明BOOT1BOOT0X0主闪存存储器主闪存存储器被选为启动区域01系统存储器系统存储器被选为启动区域11内置SRAM内置SRAM被选为启动区域 在系统复位后&#xff0c; S…

Kafka核心原理第一弹——更新中

架构原理 一、高性能读写架构原理——顺序写零拷贝 首先了解两个专业术语&#xff0c;研究kafka这个东西&#xff0c;你必须得搞清楚这两个概念&#xff0c;吞吐量&#xff0c;延迟。 写数据请求发送给kafka一直到他处理成功&#xff0c;你认为写请求成功&#xff0c;假设是…

WOFOST模型与PCSE模型应用

目录 第一章 理论基础 农作物生长模型概述 第二章 数据准备 第三章 WOFOST模型基础 第四章 PythonCropSimulationEnvironment 第五章 案例拓展 更多应用 实现作物产量的准确估算对于农田生态系统响应全球变化、可持续发展、科学粮食政策制定、粮食安全维护都至关重要。传…

怎么把pdf转换成jpg格式?

怎么把pdf转换成jpg格式&#xff1f;在我们日常的办公过程中&#xff0c;PDF文件是一个经常被使用来传输文件的格式。它能够确保我们的文件内容不会混乱&#xff0c;并以更加完美的方式呈现出来。然而&#xff0c;PDF文件也存在一些缺陷。例如&#xff0c;它无法直接编辑&#…
最新文章