python爬虫7:实战1

news/2024/7/19 11:08:02 标签: python, 爬虫, 开发语言

python71_0">python爬虫7:实战1

前言

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

申明

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

目录结构

文章目录

    • python爬虫7:实战1
      • 1. 目标
      • 2. 详细流程
        • 2.1 找到目标小说
        • 2.2 获取小说章节目录
        • 2.3 获取小说内容
        • 2.4 完整代码
      • 3. 总结

1. 目标

​ 这次爬虫实战,采用的库为:requests + lxml,这次以爬取一部小说为目标,具体的网站老规矩就不给了,大家学习思路最重要。

再次说明,案例本身并不重要,重要的是如何去使用和分析,另外为了避免侵权之类的问题,我不会放涉及到网站的图片,希望能理解

2. 详细流程

2.1 找到目标小说

第一步,确定get请求的url

​ 假设我们的网站为:https://xxxxxxx.com,那么,我们首先需要找到搜索框,然后随意搜索几本小说,比如这里我搜索的是圣墟万族之劫,那么观察网页上的url变化,如下:

https://xxxxx?q=圣墟
https://xxxxx?q=万族之劫

​ 可以看出,这里是get请求,并且参数名为q

第二步,正确请求网页

​ 我们可以写下第一个代码了,目标是获取想要的小说,代码如下:

python"># 都要用到的参数
HEADERS = {
    'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
}

# 获取搜索某小说后的页面
def get_search_result():
    # 网址
    url = 'xxxxx'
    # 请求参数
    search = input('请输入想要搜索的小说:')
    params = {
        'q' : search
    }
    # 请求
    response = requests.get(url,headers=HEADERS,params=params)
    # 把获取到的网页保存到本地
    with open('search.html','w',encoding='utf-8') as f:
        f.write(response.content.decode('utf-8'))

​ 结果如下:

在这里插入图片描述

​ 可以看出,获取到正确的网页,说明这一步我们完成了

正确解析网页,以获取小说链接

​ 上面,我们已经把网页源码存放到了本地一个名为search.html的文件,下面我们来解析它。

​ 解析它,首先需要明确我们要获取什么节点、什么值。看下面:

在这里插入图片描述

​ 可以看出,我们的目标标签位于div[class="mshow"]下的table[class="grid"]下的td下的a标签,并且我们需要获取这个a标签的href属性和文本值。除此之外,href属性值只是部分地址,需要跟网站根地址xxxx.com拼凑再一起。

​ 基于此,可以完成代码:

python"># 解析网页
def parse_search_result():
    # 打开文件,读取文件
    with open('search.html','r',encoding='utf-8') as f:
        content = f.read()
        # 基础url
        base_url = 'xxxxxx.com/'
        # 初始化lxml
        html = etree.HTML(content)
        # 获取目标节点
        href_list = html.xpath('//div[@class="show"]//table[@class="grid"]//td//a/@href')
        text_list = html.xpath('//div[@class="show"]//table[@class="grid"]//td//a/text()')
        # 处理内容值
        url_list = [base_url+href  for href in href_list]
        # 选择要爬取的小说
        for i,text in enumerate(text_list):
            print('当前小说名为:',text)
            decision = input('是否爬取它(只能选择一本),Y/N:')
            if decision == 'Y':
                return url_list[i],text

​ 运行结果如下:

在这里插入图片描述

2.2 获取小说章节目录

第一步,请求页面

​ 首先,我们去请求上面获取的网页,这里就比较简单了,基本上把上面的请求代码拷贝过来修改修改即可:

python"># 请求目标小说网站
def get_target_book(url):
    # 请求
    response = requests.get(url,headers=HEADERS)
    # 保存源码
    with open('book.html','w',encoding='utf-8') as f:
        f.write(response.content.decode('utf-8'))

​ 可以看到保存到本地的结果如下:
在这里插入图片描述

可以看出,这一步成功了

第二步,解析上面的网页,获取不同章节的链接

​ 这一步,主要的难点在于解析网页,首先,看下面:

在这里插入图片描述

​ 由于该网页小说章节都分为两个部位,第一个为最新章节,第二个为全部章节,而第二个才是我们需要获取的,因此xpath语法应该为:

//div[@class="show"]//div[contains(@class,'showBox') and position()=3]//ul//a

​ 那么,可以完成代码如下:

python"># 解析章节网页
def parse_chapter(base_url):
    # 打开文件,读取内容
    with open('book.html','r',encoding='utf-8') as f:
        content = f.read()
        # 初始化
        html = etree.HTML(content)
        # 解析
        href_list = html.xpath('//div[@class="show"]//div[contains(@class,"showBox") and position()=3]//ul//a/@href')
        text_list = html.xpath('//div[@class="show"]//div[contains(@class,"showBox") and position()=3]//ul//a/text()')
        # 处理:拼凑出完整网页
        url_list = [base_url+url for url in href_list]
        # 返回结果
        return url_list,text_list

​ 运行结果如下:

在这里插入图片描述

2.3 获取小说内容

​ 这里我们就不分开了,直接获取源码后直接解析。那么这里说明一下解析原理,看下面:

在这里插入图片描述

​ 可以轻松知道xpath语法:

//div[contains(@class,'book')]//div[@id='content']//text()

​ 那么,代码如下:

python"># 请求小说页面
def get_content(url,title):
    # 请求
    response = requests.get(url,headers=HEADERS)
    # 获取源码
    content = response.content.decode('utf-8')
    # 初始化
    html = etree.HTML(content)
    # 解析
    text_list = html.xpath('//div[contains(@class,"book")]//div[@id="content"]//text()')
    # 后处理
    # 首先,把第一个和最后一个的广告信息去掉
    text_list = text_list[1:-1]
    # 其次,把里面的空白字符和\xa0去掉
    text_list = [text.strip().replace('\xa0','') for text in text_list]
    # 最后,写入文件即可
    with open(title+'.txt','w',encoding='utf-8') as g:
        for text in text_list:
            g.write(text+'\n')

​ 运行结果如下:

在这里插入图片描述

可以看出,成功实现

2.4 完整代码

​ 完整代码如下:

python"># author : 自学小白菜
# -*- coding:utf-8 -*-

'''
# File Name : 7 lxml_novel.py
# Create Time : 2023/8/5 22:04
# Version : python3.7
# Description :  实战1:爬取小说
'''

# 导包
import requests
from lxml import etree

# 都要用到的参数
HEADERS = {
    'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
}

# 获取搜索某小说后的页面
def get_search_result():
    # 网址
    url = 'https://www.iwurexs.net/so.html'
    # 请求参数
    search = input('请输入想要搜索的小说:')
    params = {
        'q' : search
    }
    # 请求
    response = requests.get(url,headers=HEADERS,params=params)
    # 把获取到的网页保存到本地
    with open('search.html','w',encoding='utf-8') as f:
        f.write(response.content.decode('utf-8'))

# 解析网页
def parse_search_result():
    # 打开文件,读取文件
    with open('search.html','r',encoding='utf-8') as f:
        content = f.read()
        # 基础url
        base_url = 'https://www.iwurexs.net/'
        # 初始化lxml
        html = etree.HTML(content)
        # 获取目标节点
        href_list = html.xpath('//div[@class="show"]//table[@class="grid"]//td//a/@href')
        text_list = html.xpath('//div[@class="show"]//table[@class="grid"]//td//a/text()')
        # 处理内容值
        url_list = [base_url+href  for href in href_list]
        # 选择要爬取的小说
        for i,text in enumerate(text_list):
            print('当前小说名为:',text)
            decision = input('是否爬取它(只能选择一本),Y/N:')
            if decision == 'Y':
                return url_list[i],text

# 请求目标小说网站
def get_target_book(url):
    # 请求
    response = requests.get(url,headers=HEADERS)
    # 保存源码
    with open('book.html','w',encoding='utf-8') as f:
        f.write(response.content.decode('utf-8'))

# 解析章节网页
def parse_chapter(base_url):
    # 打开文件,读取内容
    with open('book.html','r',encoding='utf-8') as f:
        content = f.read()
        # 初始化
        html = etree.HTML(content)
        # 解析
        href_list = html.xpath('//div[@class="show"]//div[contains(@class,"showBox") and position()=3]//ul//a/@href')
        text_list = html.xpath('//div[@class="show"]//div[contains(@class,"showBox") and position()=3]//ul//a/text()')
        # 处理:拼凑出完整网页
        url_list = [base_url+url for url in href_list]
        # 返回结果
        return url_list,text_list

# 请求小说页面
def get_content(url,title):
    # 请求
    response = requests.get(url,headers=HEADERS)
    # 获取源码
    content = response.content.decode('utf-8')
    # 初始化
    html = etree.HTML(content)
    # 解析
    text_list = html.xpath('//div[contains(@class,"book")]//div[@id="content"]//text()')
    # 后处理
    # 首先,把第一个和最后一个的广告信息去掉
    text_list = text_list[1:-1]
    # 其次,把里面的空白字符和\xa0去掉
    text_list = [text.strip().replace('\xa0','') for text in text_list]
    # 最后,写入文件即可
    with open(title+'.txt','w',encoding='utf-8') as g:
        for text in text_list:
            g.write(text+'\n')

if __name__ == '__main__':
    # 第一步,获取到搜索页面的源码
    # get_search_result()
    # 第二步,进行解析
    target_url,name = parse_search_result()
    # 第三步,请求目标小说页面
    get_target_book(target_url)
    # 第四步,解析章节网页
    url_list,text_list = parse_chapter(target_url)
    for url,title in zip(url_list,text_list):
        # 第五步,请求小说具体的某个章节并直接解析
        get_content(url,title)
        break

3. 总结

​ 上面代码还不完善,存在一定优化的地方,比如代码有些地方可以解耦,另外,必须限制访问速度,不然后期容易被封掉IP,除此之外,可以考虑代理池构建等操作。


http://www.niftyadmin.cn/n/4947257.html

相关文章

【回溯】总结

1、 组合和子集问题 组合问题需要满足一定要求才算作一个答案,比如数量要求(k个数),累加和要求(target)。 子集问题是只要构成一个新的子集就算作一个答案。 进阶:去重逻辑。 一般都是要对同…

从0开始yolov8模型目标检测训练

从0开始yolov8模型目标检测训练 1 大环境 首先有大环境,即已经准备好了python、nvidia驱动、cuda、cudnn等。 2 yolov8的虚拟环境 2.1 创建虚拟环境 conda create -n yolov8 python3.102.2 激活虚拟环境 注意:激活虚拟环境的时候,需要清…

【24择校指南】中国海洋大学计算机考研考情分析

中国海洋大学(B) 考研难度(☆☆☆☆) 内容:23考情概况(拟录取和复试分析)、院校概况、23专业目录、23复试详情、各科目及专业考情分析。 正文986字,含表格预计阅读:3分钟。 2023考情概况 中…

工业安全生产信息化平台的基本架构和关键功能分享

工业安全生产信息化平台是指利用信息技术手段,将工业安全生产管理与数据采集、传输、处理相结合,实现对工业安全生产全过程的数字化、信息化、智能化管理的平台。它通过集成多种信息系统和设备,实现对重大危险源监控预警、安全风险分级管控、…

pytorch入门-网络模型训练

损失函数和反向传播 import torch from torch.nn import L1Loss # L1Loss 是 PyTorch 中的一个损失函数,用于衡量预测值与目标值之间的绝对差异。 from torch import nninputs torch.tensor([1, 2, 3], dtypetorch.float32) #创建了一个名为 inputs 的张量&#x…

Spring Boot与Redisson的整合。分布式锁

Spring Boot与Redisson的整合可以帮助您在Spring Boot应用程序中使用分布式锁、缓存等功能。下面是一些基本步骤来整合Spring Boot与Redisson: 添加Maven/Gradle依赖: 在您的Spring Boot项目的pom.xml(Maven)或build.gradle&#…

Matplotlib数据可视化(一)

目录 1.Matplotlib简介 2.Matplotlib绘图基础 2.1 创建画布与子图 2.2 添加画布属性 2.3 绘图的保存与显示 1.Matplotlib简介 Matplotlib是一个用于绘制数据可视化图表的Python库。它提供了广泛的功能和灵活性,可以创建各种类型的图表,包括折线图、…

UE5.2 LyraDemo源码阅读笔记(五)输入系统

Lyra里使用了增强输入系统,首先知道增强输入系统里的三个类型配置。 一、Input Actions (IA): 输入操作带来的变量,与玩家的输入组件绑定,回调里驱动玩家行为。 二、InputMappingContext(IMC)&#xff1a…