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():passif __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.hqwc.cn/news/88066.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

完美解决Ubuntu网络故障,连接异常,IP地址一直显示127.0.0.1

终端输入ifconfig显示虚拟机IP地址为127.0.0.1&#xff0c;具体输出内容如下&#xff1a; wxyubuntu:~$ ifconfig lo: flags73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0inet6 ::1 prefixlen 128 scopeid 0x10<host>loop txqueuelen …

adb 命令

1.adb shell dumpsys activity top | find "ACTIVITY" 查看当前运行的activity包名 2.adb shell am start -n 包名/页面名 打开应用的页面 3.查看将要启动或退出app的包名 adb shell am monitor 只有在启动或退出的时候才会打印 4.查看当前启动应用的包名 ad…

5G智能网关如何解决城市停车痛点难点

2023年上半年&#xff0c;我国汽车新注册登记1175万辆&#xff0c;同比增长5.8%&#xff0c;88个城市汽车保有量超过100万辆&#xff0c;北京、成都等24个城市超过300万辆。随着车辆保有量持续增加&#xff0c;停车难问题长期困扰城市居民&#xff0c;也导致城市路段违停普遍、…

运用Python解析HTML页面获取资料

在网络爬虫的应用中&#xff0c;我们经常需要从HTML页面中提取图片、音频和文字资源。本文将介绍如何使用Python的requests库和BeautifulSoup解析HTML页面&#xff0c;获取这些资源。 一、环境准备 首先&#xff0c;确保您已经安装了Python环境。接下来&#xff0c;我们需要安…

Docker数据管理(数据卷与数据卷容器)

目录 一、数据卷&#xff08;Data Volumes&#xff09; 1、概述 2、原理 3、作用 4、示例&#xff1a;宿主机目录 /var/test 挂载同步到容器中的 /data1 二、数据卷容器&#xff08;DataVolumes Containers&#xff09; 1、概述 2、作用 3、示例&#xff1a;创建并使用…

Java中线程的7大状态的基本介绍

在线程的生命周期中&#xff0c;有七种不同的状态&#xff0c;这些状态描述了线程在不同阶段的情况。Java中线程的七大状态如下&#xff1a; 新建&#xff08;New&#xff09;&#xff1a; 当创建一个线程对象时&#xff0c;线程就处于新建状态。此时&#xff0c;线程已经被创建…

【Python小练习】利用DES进行加密解密

from Crypto.Cipher import DES from Crypto.Util.Padding import pad, unpad import json# 创建 DES 加密对象 key b123456 # 8字节的密钥&#xff0c;注意必须为字节类型 cipher DES.new(key, DES.MODE_ECB)# 加密 def encrypt_data(data):plaintext json.dumps(data).en…

[oneAPI] 基于BERT预训练模型的SWAG问答任务

[oneAPI] 基于BERT预训练模型的SWAG问答任务 基于Intel DevCloud for oneAPI下的Intel Optimization for PyTorch基于BERT预训练模型的SWAG问答任务数据集下载和描述数据集构建问答选择模型训练 结果参考资料 比赛&#xff1a;https://marketing.csdn.net/p/f3e44fbfe46c465f4d…

老Python程序员职业生涯感悟—写给正在迷茫的你

我来讲几个极其重要&#xff0c;但是大多数Python小白都在一直犯的思维错误吧&#xff01;如果你能早点了解清楚这些&#xff0c;会改变你的一生的。所以这一期专门总结了大家问的最多的&#xff0c;关于学习Python相关的问题来给大家聊。希望能带给大家不一样的参考。或者能提…

Module not found: Error: Can‘t resolve ‘less-loader‘解决办法

前言&#xff1a; 主要是在自我提升方面&#xff0c;感觉自己做后端还是需要继续努力&#xff0c;争取炮筒前后端&#xff0c;作为一个全栈软阿金开发人员&#xff0c;所以还是需要努力下&#xff0c;找个方面&#xff0c;目前是计划学会Vue&#xff0c;这样后端有java和pytho…

CentOS 7 Nacos 设置开机自动重启

一、说明 Nacos如果是手动启动的话&#xff0c;在服务器宕机或者重启后&#xff0c;没有自动运行&#xff0c;影响很多业务系统&#xff0c;需要每次手动执行命令 startup.sh -m standalone&#xff0c;才能启动 Nacos 服务&#xff0c;不能像docker服务一样&#xff0c;使用 …

Mysql B+树索引

一、联合索引 内节点中存储的是 目录项 记录 &#xff0c;叶子节点中存储的是 用户记录 &#xff08;由于不是聚簇索引&#xff0c;所以用户记录是不完整的&#xff0c;缺少 country 列的 值&#xff09;。这个 idx_name_birthday_phone_number 索引对应的 B 树中页面和记录的排…