python爬虫11:实战3

news/2024/7/19 10:23:47 标签: python, 爬虫, 开发语言

python113_0">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 整体框架

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

python"># 导入包
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. 输入想要搜索的小说,然后点击按钮即可跳转

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

​ 完成后代码如下:

python"># 获取目标小说
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,即之前第一个实战讲解的思路)

​ 代码如下:

python"># 获取小说章节列表
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文件中

​ 代码如下:

python"># 下载小说
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 完整代码

​ 完整代码如下:

python"># 导入包
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.niftyadmin.cn/n/4970996.html

相关文章

“探索Spring与MyBatis集成的最佳实践与技巧“

目录 引言:1.Spring与MyBatis集成的基本配置2.Spring aop集成pagehelper插件总结附带内容: 引言: 在现代的软件开发中,Spring和MyBatis是两个非常流行的框架。Spring提供了强大的依赖注入和面向切面编程的功能,而MyBa…

C语言练习3(巩固提升)

C语言练习3 选择题 选择题 前言 奋斗是曲折的,“为有牺牲多壮志,敢教日月换新天”,要奋斗就会有牺牲,我们要始终发扬大无畏精神和无私奉献精神。奋斗者是精神最为富足的人,也是最懂得幸福、最享受幸福的人。正如马克思…

[论文分享]Pedestrian attribute recognition based on attribute correlation

Pedestrian attribute recognition based on attribute correlation 行人属性识别广泛应用于行人跟踪和行人重识别。 两项最基本的挑战: 多标签性质数据样本的差异性特征,例如类别不平衡和部分遮挡。 不同方法的示意图: 此项工作中&#…

PHP自己的框架验证码Captcha使用(完善篇八)

1、实现效果生成验证验证码 2、验证码类CaptchaBase.php <?php class CaptchaBase {private $width;private $height;private $length;public function __construct($width, $height, $length){$this->width $width;$this->height $height;$this->length $le…

Linux操作系统--常用指令(文件目录类指令)

(1).pwd指令 功能:显示当前工作目录的绝对路径。 如果你使用cd命令进行切换的时候不知道到了哪里,就可以使用该指令输出路径查看。 (2).cd命令 功能:用于切换路径 语法: cd + 路径(路径可以指绝对路径,也可以是相对路径)

安装启动yolo5教程

目录 一、下载yolo5项目 二、安装miniconda&#xff08;建议不要安装在C盘&#xff09; 三、安装CUDA 四、安装pytorch 五、修改配置参数 六、修改电脑参数 七、启动项目 博主硬件&#xff1a; Windows 10 家庭中文版 一、下载yolo5项目 GitHub - ultralytics/yolov5:…

B. Burning Midnight Oil

Problem - B - Codeforces 问题描述&#xff1a;给定n和k&#xff0c;求满足以下条件的最小的v。 n ≥ ∑ i 0 ∞ [ v k i ] n \ge \sum_{i0}^{\infty}[ \frac v {k^i}] n≥i0∑∞​[kiv​] 具有单调性&#xff0c;用二分。二分答案&#xff0c;最大值最小。 代码&#xff…

力扣数组类题目--41缺失的第一个正数

41 缺失的第一个正数 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,0] 输出&#xff1a;3 示例 2&#xff1a; 输入&a…