python爬虫7:实战1

news2024/11/16 18:04:22

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

第二步,正确请求网页

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

# 都要用到的参数
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拼凑再一起。

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

# 解析网页
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 获取小说章节目录

第一步,请求页面

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

# 请求目标小说网站
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

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

# 解析章节网页
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()

​ 那么,代码如下:

# 请求小说页面
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 完整代码

​ 完整代码如下:

# 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.coloradmin.cn/o/890434.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QT学习笔记-Linux ARM环境下实现QT程序通过ODBC驱动访问SQLServer数据库

QT学习笔记-Linux ARM环境下实现QT程序通过ODBC驱动访问SQLServer数据库 0、背景1、基本环境2、搭建交叉编译环境3、在交叉编译服务器上交叉编译安装unixODBC3.1 下载unixODBC3.2 交叉编译unixODBC3.2.1 基本编译说明3.2.2 交叉编译说明3.2.3 ./configure -build,-host,-target…

iTOP-RK3399开发板开发板作为客户端- ssh使用

默认使用本地用户为远程登录时的用户;远程连接虚拟机里面的 Ubuntu(IP 地址为 192.168.1.20), 如下图所示: ssh 192.168.1.20 以指定用户身份连接至服务器,输入以下命令: 输入 exit 退出 ssh 登录。 更多…

基础设施SIG月度动态:龙蜥大讲堂 - 基础设施系列专题分享火热进行中(7~8 月上旬持续分享),敬请关注!

基础设施 SIG(OpenAnolis Infra SIG)目标:负责 OpenAnolis 社区基础设施工程平台的建设,包括官网、Bugzilla、Maillist、ABS、ANAS、CI 门禁以及社区 DevOps 相关的研发工程系统。 01 SIG 整体进展 1、龙蜥大讲堂 - 基础设施系…

Vue3和Vue2对比学习之全局 API 应用实例

文章目录 0.前言1.参考文档2.详细说明2.1 全局 API 应用实例 非兼容2.2 一个新的全局 API:createAppconfig.productionTip 移除config.ignoredElements 替换为 config.isCustomElementVue.prototype 替换为 config.globalPropertiesVue.extend 移除类型推断组件继承…

最新年轻人副业赚钱攻略

最近几年,随着互联网的快速发展和社会变革的加速,年轻人副业赚钱的需求也越来越大。无论是为了增加收入、提升个人能力还是实现自我价值,年轻人们都纷纷开始寻找副业赚钱的机会。 那么,如何才能在副业赚钱中脱颖而出呢&#xff1…

软考笔记——10.项目管理

进度管理 进度管理就是采用科学的方法,确定进度目标,编制进度计划和资源供应计划,进行进度控制,在与质量、成本目标协调的基础上,实现工期目标。 具体来说,包括以下过程: (1) 活动定义&#…

Appium-移动端自动测试框架,如何入门?

Appium是一个开源跨平台移动应用自动化测试框架。 既然只是想学习下Appium如何入门,那么我们就直奔主题。文章结构如下: 1、为什么要使用Appium? 2、如何搭建Appium工具环境?(超详细) 3、通过demo演示Appium的使用 4、Appium如何…

PD协议受电端芯片是什么?——浅谈快充协议在Hi003/XSP16应用

PD协议的全称是USB Power Delivery协议,该协议是基于USB 3.1中的Type-C接口,所以一般使用Type-C接口的充电器都有PD协议。 目前充电器常见的USB-PD功率为:5V3A(15W)、9V2A(18W)、12V3A&#xf…

扩散模型实战(四):从零构建扩散模型

推荐阅读列表: 扩散模型实战(一):基本原理介绍 扩散模型实战(二):扩散模型的发展 扩散模型实战(三):扩散模型的应用 本文以MNIST数据集为例,从…

【Linux】POSIX信号量和基于环形队列的生产消费者模型

目录 写在前面的话 什么是POSIX信号量 POSIX信号量的使用 基于环形队列的生产消费者模型 写在前面的话 本文章主要先介绍POSIX信号量,以及一些接口的使用,然后再编码设计一个基于环形队列的生产消费者模型来使用这些接口。 讲解POSIX信号量时&#x…

阿里云服务器镜像大全_Linux和Windows操作系统清单

阿里云服务器操作系统大全,阿里云提供的镜像均为正版授权,正版镜像可以在云服务器ECS上运行的应用程序提供安全、稳定的运行环境系统,阿里云服务器以公共镜像为例分享阿里云服务器操作系统大全,包括Alibaba Cloud Linux镜像、Linu…

洁净室气流流型分类、检测及相关法规要求概览

洁净室气流形式可以分为单向流或非单向流两种。如果综合利用两种气流,通常叫做混合气流。单向流可以是垂直的或水平的。两种单向流都以最终过滤的送风和回风入口,它们几乎是相对设置,这样才能使气流的流动形式保持尽可能的呈直线状。确认气流…

java全局捕捉异常并返回统一返回值

1. 首先定义全局异常处理类 import org.springframework.validation.BindException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.…

vcsa6.7 vsan超融合,虚拟机突然识别不到加密狗

问题现象: vcsa6.7 vsan超融合,虚拟机突然识别不到加密狗,加密狗直通给虚拟机,打开设备管理器,有未知的usb设备,重启虚拟机,卸载tools,重新安装tools,都不行 问题解决…

面向对象编程(OOP):Python中的抽象与封装

文章目录 🍀引言🍀 类与对象🍀封装🍀继承🍀多态🍀面向对象编程的优势🍀使用面向对象编程的场景🍀实例化与构造函数🍀 成员属性和类属性🍀魔术方法&#x1f34…

opencv基础:几个常用窗口方法

开始说了一些opencv中的一些常用方法。 namedWindow方法 在OpenCV中,namedWindow函数用于创建一个窗口,并给它指定一个名字。这个函数的基本语法如下: import cv2cv2.namedWindow(窗口名称, 标识 )窗口名称:其实窗口名称&…

SqlServer Management工具格式化代码、美化SQL

1、下载simple but powerful SQL formatter 插件下载地址:地址 2、安装 点击next—> finish 3、重新打开SqlServer Management即可看到 SQL Beautifier 点击Format ALL SQL 或者选中sql点击Format Selected SQL即可

Linux的基本权限(文件,目录)

文章目录 前言一、Linux权限的概念二、Linux权限管理 1.文件访问者分类2.文件类型和访问类型3.文件访问权限的相关设置方法三、目录的权限四、权限的总结 前言 Linux下一切皆文件,指令的本质就是可执行文件,直接安装到了系统的某种路径下 一、Linux权限的…

交换实验一

题目 交换机上接口配置 SW1 interface GigabitEthernet0/0/1 port hybrid tagged vlan 2 port hybrid untagged vlan 3 to 6 interface Ethernet0/0/2 port hybrid pvid vlan 3 port hybrid untagged vlan 2 to 6 interface Ethernet0/0/3 port link-type access port d…

【NAS群晖drive异地访问】使用cpolar远程访问内网Synology Drive「内网穿透」

文章目录 前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用 2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用 3. 结语 前言 群晖作为专业的数据存储中心&…