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+lxml
和requests+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处理动态网页。