python:最简单爬虫之爬取小说网Hello wrold

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

以下用最简单的示例来演示爬取某小说网的类目名称。

新建一个retest.py,全文代码如下,读者可以复制后直接运行。代码中我尽量添加了一些注释便于理解。

需要说明的一点,该小说网站如果后续更新改版了,文中截取字符的正则表达式可能需要根据做一些变动,才能成功爬取到我们想要的名称。

一、小说网站首页

我们想爬取的是首页-》全部分类 菜单下的小说分类名称

二、retest.py代码
python"># -*- coding: UTF-8 -*-
import re
import urllib.request
import codecs
import time

# 使用re 与 urllib 包简单爬取小说种类名称
class Retest(object):
    def __init__(self):
        self.getText()

    # 爬取方法
    def getText(self):
        print("准备开始爬取")
        # 请求网站首页,获取页面返回内容
        url = "https://www.readnovel.com"
        response = urllib.request.urlopen(url, timeout=5)
        result = response.read().decode('utf-8') #使用utf-8 避免中文乱码
        print(result)   #网页内容
        # 网页中的原字符串
        # '<dd><a href="/category/30020_f1_f1_f1_f1_f1_0_1"><em class="iconfont">&#xe630;</em><i>现代言情</i></a></dd>'
        # 通过正则表达式与固定字符组合,过滤后得到新字符串
        pr = '<dd><a href="/category/.*?_f1_f1_f1_f1_f1_0_1"><em class="iconfont">.*?;</em><i>.*?</i></a></dd>'
        print("过滤后的文本:=====")
        pattern = re.compile(pr)    #将正则表达式编译为正则对象
        movieList = pattern.findall(result) #通过正则表达式从源字符串中截取,得到一个movieList数组
        print(movieList)
        # 使用map函数,将movieList数组中各元素,通过lambda匿名函数内的方法,过滤掉其他标签字符,仅保留我们需要的类目中文标题如“现代言情”
        moveTitleList = map(lambda x: x.split("<i>")[1].split("</i>")[0], movieList)
        # 最后,依次打印出各类目名称
        for movie in moveTitleList:
            print("%s\r\n" % movie)


if __name__ == '__main__':
    Retest()
三、运行后结果

四、分析说明

下面结合上述代码再做一些补充说明,便于我们初学者更易于理解。

1.查找关键字,正则表达式获取字符串

我们在网站首页,查看前端页面源代码,并查找到关键字

红线标注的就是我们需要通过正则表达式从全文中定位并截取的字符串。

<dd><a href="/category/30020_f1_f1_f1_f1_f1_0_1"><em class="iconfont">&#xe630;</em><i>现代言情</i></a></dd>
<dd><a href="/category/30013_f1_f1_f1_f1_f1_0_1"><em class="iconfont">&#xe632;</em><i>古代言情</i></a></dd>

对应的正则表达式如下:

<dd><a href="/category/.*?_f1_f1_f1_f1_f1_0_1"><em class="iconfont">.*?;</em><i>.*?</i></a></dd>

我们只需要将固定不变的关键字符串与可变的组合在一起即可。

“30020”、“&#xe630;”、“现代言情”这三个是动态的,我们用“.*?”代替,代表任意字符串。然后通过pattern.findall得到一个movieList数组,数组内的成员如下。

[

'<dd><a href="/category/30020_f1_f1_f1_f1_f1_0_1"><em class="iconfont">&#xe630;</em><i>现代言情</i></a></dd>',

'<dd><a href="/category/30013_f1_f1_f1_f1_f1_0_1"><em class="iconfont">&#xe632;</em><i>古代言情</i></a></dd>',

'<dd><a href="/category/30031_f1_f1_f1_f1_f1_0_1"><em class="iconfont">&#xe631;</em><i>浪漫青春</i></a></dd>',

'<dd><a href="/category/30001_f1_f1_f1_f1_f1_0_1"><em class="iconfont">&#xe637;</em><i>玄幻言情</i></a></dd>',

'<dd><a href="/category/30008_f1_f1_f1_f1_f1_0_1"><em class="iconfont">&#xe62e;</em><i>仙侠奇缘</i></a></dd>',

'<dd><a href="/category/30036_f1_f1_f1_f1_f1_0_1"><em class="iconfont">&#xe634;</em><i>悬疑</i></a></dd>',

'<dd><a href="/category/30042_f1_f1_f1_f1_f1_0_1"><em class="iconfont">&#xe62d;</em><i>科幻空间</i></a></dd>',

'<dd><a href="/category/30050_f1_f1_f1_f1_f1_0_1"><em class="iconfont">&#xe638;</em><i>游戏竞技</i></a></dd>',

'<dd><a href="/category/30055_f1_f1_f1_f1_f1_0_1"><em class="iconfont">&#xe904;</em><i>轻小说</i></a></dd>'

]

2.二次过滤

我们仅需要类目中文名称,所有需要对得到的数据做二次过滤。

moveTitleList = map(lambda x: x.split("<i>")[1].split("</i>")[0], movieList)

map可以从movieList数组中逐个成员进行函数处理。而我们这里使用lambda定义了一个匿名函数

lambda x: x.split("<i>")[1].split("</i>")[0],意思是在成员中获取“<i>”第二个元素,再获取"</i>"第一个元素。即<dd><a href="/category/30020_f1_f1_f1_f1_f1_0_1"><em class="iconfont">&#xe630;</em><i>现代言情</i></a></dd>,最终可以获取到“现代言情”这几个字。

3.尾声

以上演示了如何爬取网页中的某一组数据,读者掌握理解后,可以自己尝试爬取其他数据,如推荐栏目下的书名清单等。

如果我的文章解决了你的问题,欢迎点赞、收藏或评论。


                

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

相关文章

Pytorch神经网络的模型架构(nn.Module和nn.Sequential的用法)

一、层和块 在构造自定义块之前&#xff0c;我们先回顾一下多层感知机的代码。下面的代码生成一个网络&#xff0c;其中包含一个具有256个单元和ReLU激活函数的全连接隐藏层&#xff0c;然后是一个具有10个隐藏单元且不带激活函数的全连接输出层。 import torch from torch im…

通过层进行高效学习:探索深度神经网络中的层次稀疏表示

一、介绍 深度学习中的层次稀疏表示是人工智能领域日益重要的研究领域。本文将探讨分层稀疏表示的概念、它们在深度学习中的意义、应用、挑战和未来方向。 最大限度地提高人工智能的效率和性能&#xff1a;深度学习系统中分层稀疏表示的力量。 二、理解层次稀疏表示 分层稀疏表…

Java 中使用装饰器模式 wrapped 一个不能被重写的父类中的接口方法

在开发中&#xff0c;有时候使用第三方框架时&#xff0c;我们因为特殊需求&#xff0c;需要继承框架中的一个Java类重写它的某个方法来达到期望的目的。 如果需要被重写的方法被使用 final 修饰了&#xff0c;这种情况下我们是无法直接继承这个类来重写这个方法的。 本文所述…

[Ray Tracing in One Weekend] 笔记

前言 本文参照自raytracing in one weekend教程&#xff0c;地址为&#xff1a;https://raytracing.github.io/books/RayTracingInOneWeekend.html 什么是光线追踪&#xff1f; 光线追踪模拟现实中的成像原理&#xff0c;通过模拟一条条直线在场景内反射折射&#xff0c;最终…

力扣刷题记录(14)LeetCode:763、56、738

目录 763.划分字母区间 56.合并区间 738.单调递增的数字 总结 763.划分字母区间 这道题的关键点在于想到使用一个数组去存放每个字母在字符串中的最大索引。之后我们在遍历字符串的时候就知道应该在什么地方停止&#xff0c;想要得到最大分割次数&#xff0c;就应该在当前索引…

在Django中使用多语言(i18n)

在Django中使用多语言 配置中间件 MIDDLEWARE [......django.contrib.sessions.middleware.SessionMiddleware,django.middleware.locale.LocaleMiddleware, # 此行重点django.middleware.common.CommonMiddleware,...... ]配置翻译文件目录 根目录下创建目录locale # 国…

【Transformer】Transformer and BERT(1)

文章目录 TransformerBERT 太…完整了&#xff01;同济大佬唐宇迪博士终于把【Transformer】入门到精通全套课程分享出来了&#xff0c;最新前沿方向 学习笔记 Transformer 无法并行&#xff0c;层数比较少 词向量生成之后&#xff0c;不会变&#xff0c;没有结合语境信息的情…

爬虫持久化保存

## open方法- 方法名称及参数markdown **open(file, moder, bufferingNone, encodingNone, errorsNone, newlineNone, closefdTrue)****file** 文件的路径&#xff0c;需要带上文件名包括文件后缀&#xff08;c:\\1.txt&#xff09;**mode** 打开的方式&#xff08;r,w,a,x,b,t…