python爬虫11:实战3

python爬虫11:实战3

前言

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

申明

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

目录结构

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处理动态网页。

猜你喜欢

转载自blog.csdn.net/weixin_46676835/article/details/132489525
今日推荐