python 爬虫实战 | 下载一本小说

news/2024/7/19 9:30:01 标签: python, 爬虫, 开发语言

1. 爬虫几个主要部分

  • 根据链接获取页面信息
  • 从页面信息获取需要的信息:正则匹配,bs4,xpath等
  • 保存:文件、数据库

最难得就是中间匹配部分,要针对每个网站的内容特点和要获取的信息综合选择合适的匹配策略。

其他重要方面:

  • 中文乱码怎么处理:主动设置编码格式
  • 如果需要很多页面,还要获取这些页面的链接列表。
  • 防止被屏幕:加header头,加随机访问间隔
  • 验证码:这个没办法

2. 爬虫实战

目的:爬取一本小说。先从目录页获取链接列表,再从每个页面获取文本,保存到本地文件。
环境:python3,jupyter notebook

(1) 获取url列表

import requests
import re
from bs4 import BeautifulSoup
import time,random

# 从目录页,获取链接列表
page="https://www.27k.net/read/63021"
headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36",
}
respose=requests.get(page, headers);
assert respose.status_code==200,'Error: requests.get'

soup=BeautifulSoup(respose.text,"lxml")
arr=soup.find_all("ul", attrs={"id":"chapterList"})[0].find_all("a")
arr

输出:
[<a href="/read/63021/24610005.html">第1章</a>,
 <a href="/read/63021/24610006.html">第2章</a>,
 <a href="/read/63021/24610007.html">第3章</a>,
...

(2) 从一个页面获取内容并保存

import requests
import re
from bs4 import BeautifulSoup
import time,random

# 为防被封,不能高频访问:模拟用户的点击间隔
def pause(seconds=2):
    #随机时间段后[2s,12s]执行
    pause=seconds+3*random.random()
    print('  sleep '+str(pause) + "second \n")
    time.sleep(pause)


def write2file(url):
    #1. get response
    headers = {
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36",
    }
    respose=requests.get(url, headers);
    assert respose.status_code==200,'Error: requests.get'


    #2. get info
    soup=BeautifulSoup(respose.text,"lxml")
    patterns=soup.find_all("div","txtnav")[0]

    #3. write to file
    fw=open('novel.txt','a');

    i=0
    for item in patterns:
        i=i+1
        if i<3: #过滤掉前面重复信息
            continue
        text=item.string
        if None != text:
            if text.strip() != "": #跳过全是空格的行
                #print("  "+text)
                text=re.sub("章\s{14}", "章\n", text)
                fw.write("  "+text)
    fw.write("\n\n\n");
    fw.close();

# #url0="https://www.27k.net/read/63021/%s.html"
# i=0
# for i in range(0,1):

#     url=url0 % str(24610005+i);
#     print(i, url)
#     write2file(url)
#     pause(1);

# print("end")

(3) 应用到批量url中

i=0
for ele in arr:
    i =i +1
    url ="https://www.27k.net" +ele.get("href")
    print(i, url)
    write2file(url)
    pause(1);

print("end") #284

等待程序运行结束(因为设置了随机等待时间,该示例需要几十分钟),就能在工作目录看到一个 txt 文件。
根据原网页,为该txt手动添加一些头尾信息,保存到手机,就可以阅读了。

比手动一个一个复制粘贴省力多了,还不容易出错。


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

相关文章

vue-el-admin 使用?

一、搭建&#xff08;下载启动&#xff09; 下载地址&#xff1a;panjiachen (vue-el-admin) - Gitee.com 共两个版本 vue-element-admin&#xff1a;完善版 vue-admin-template&#xff1a;极简版 启动&#xff1a;node.js切换版本到16及以下&#xff0c;再使用npm install 安…

使用logback配置日志打印策略

目录 logback-spring.xml配置详解 1、父标签configuration 2、两种属性标签 3、三个节点标签 3.1、append节点标签 3.2、root节点标签 3.3、logger节点标签 3.4、logger和root的关系 4、完整日志配置 logback在springboot中有内置的存在&#xff0c;当然也可以再重新引…

channel的底层原理

golang之channel底层实现原理 在前面的文章中&#xff0c;我们已经了解了golang中channel的使用和优势。现在&#xff0c;让我们深入了解一下channel的底层实现原理&#xff0c;以更好地理解其工作方式。 通道的数据结构 在golang中&#xff0c;每个channel都有一个与之关联的数…

双碳目标下DNDC模型建模方法及在土壤碳储量、温室气体排放、农田减排、土地变化、气候变化中的应用

由于全球变暖、大气中温室气体浓度逐年增加等问题的出现&#xff0c;“双碳”行动特别是碳中和已经在世界范围形成广泛影响。国家领导人在多次重要会议上讲到&#xff0c;要把“双碳”纳入经济社会发展和生态文明建设整体布局。同时&#xff0c;提到要把减污降碳协同增效作为促…

模块化与组件化

组件相当于库&#xff0c;模块相当于框架. 组件化就是把可以复用的、独立的、基础的代码封装到一个方法或者代码片段里&#xff0c;需要的地方引入使用。用极少的代码实现之前相同的功能&#xff0c;避免代码的复写&#xff0c;提高了开发的效率。 模块化是为了单独实现某一功…

QT 连mysql数据库

//要在QT中连接MySQL数据库&#xff0c;需要进行以下步骤&#xff1a; //1. 安装MySQL数据库和QT开发环境。 //2. 在QT中添加MySQL驱动程序。 //可以在QT的“帮助”菜单中找到“关于插件”的选项&#xff0c; //然后选择“SQL驱动程序”选项卡&#xff0c;查看是否已经安装了M…

MATLAB涡度通量数据处理实践技术应用

基于MATLAB语言、以实践案例为主&#xff0c;提供代码、原理与操作结合 1、以涡度通量塔的高频观测数据为例&#xff1a;基于MATLAB开展上机操作 2、涡度通量观测基本概况&#xff1a;观测技术方法、数据获取与预处理等 3、涡度通量数据质量控制&#xff1a;通量数据异常值识…

中国联通泛终端技术生态创新成果发布,移远通信荣获业务与应用板块突出贡献奖

6月7日&#xff0c;以“轻联万物 共赴星海”为主题的2023中国联通泛终端技术生态创新成果发布会在北京举行。 会上&#xff0c;中国联通泛终端技术生态创新联合实验室对一年来作出突出贡献的单位进行了嘉奖。移远通信凭借其在物联网产品及应用解决方案等领域的深厚积累和突出贡…