Python 抓取笑话内容并存入 CSV

        在互联网上,有许多有趣的内容等待我们去挖掘和收集。今天,我们就来深入了解一段 Python 代码,它能够帮助我们从指定网站抓取笑话内容,并将其整理保存为 CSV 文件,方便后续查看和分析。

结果展示(文末附完整代码):

目录

结果展示(文末附完整代码):

一、代码整体介绍

二、代码准备与环境搭建

三、Get函数:获取笑话列表页面信息

1. 设置请求头(headers)和 Cookies

2. 发送请求获取页面内容并提取笑话链接与标题

四、parse函数:解析单个笑话内容

1. 再次设置请求头和 Cookies 并获取页面内容

2. 提取并处理笑话内容

五、save_to_csv函数:保存数据到 CSV 文件

1. 设置 CSV 文件的表头

2. 写入数据到 CSV 文件

六、主程序入口(__main__部分)

完整代码:

注意:


一、代码整体介绍

        这段代码主要实现了从 “xiaohua.zol.com.cn” 这个网站上抓取笑话相关信息的功能。它通过几个函数的协作,完成了获取笑话列表、解析每个笑话的具体内容以及将数据保存到 CSV 文件的一系列操作。

二、代码准备与环境搭建

        在开始解读代码之前,确保你已经安装了以下必要的库:

  • csv:这是 Python 内置的用于处理 CSV 文件(逗号分隔值文件)的库,通过它我们可以方便地进行数据的读写操作,将抓取到的笑话数据保存为 CSV 格式。
  • re:正则表达式库,在代码中起到了至关重要的作用,用于在网页文本内容中进行模式匹配,提取我们需要的笑话标题、链接以及具体内容等信息。
  • requests:一个常用的用于发送 HTTP 请求的库,通过它我们可以向目标网站发送请求,获取网页的源代码,进而从中提取我们所需的数据。

        如果你还没有安装requests库(因为csvre是 Python 内置库,一般无需单独安装),可以通过以下命令在命令行中进行安装(假设你已经安装了 Python 并且配置好了相应的环境):

pip install requests

三、Get函数:获取笑话列表页面信息

   Get函数是整个抓取流程的第一步,它接受一个参数num,这个参数代表要获取的笑话列表页面的页码。

1. 设置请求头(headers)和 Cookies

        在函数内部,首先设置了请求头(headers)和 Cookies 信息。请求头包含了诸如浏览器类型、接受的内容类型等信息,模拟了一个真实浏览器访问网站的情况,有助于顺利获取网页内容。Cookies 则是网站在之前访问时可能存储在客户端的一些信息,这里设置的具体值可能是在之前与该网站交互过程中获取到的,或者是通过分析网站的访问机制确定的。

headers = {
    "authority": "xiaohua.zol.com.cn",
    "accept": "text/ht........
    "pragma": "no-cache",
    "referer": "https://xiaohua.zol.com.cn/",
    "sec-ch-ua": "^\\^Not.A/Brand^^;v=^\\^8^^, ^\\^Chromium^^;v=^\\^114^^, ^\\^Microsoft",
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": "^\\^Windows^^",
    "sec-fetch-dest": "document",
    "sec-fetch-mode": "navigate",
    "sec-fetch-site": "same-origin",
    "sec-fetch-user": "?1",
    "upgrade-insecure-requests": "1",
    ......
cookies = {
    "ip_ck": "3Iqk0oW.....c3Mzg^%^3D",
    "Hm_lvt_a.....
    "questionnaire_close_today": "1689811201",
    "questionnaire_close_total": "1",
    "questionnaire_pv": "1689811230"
}

2. 发送请求获取页面内容并提取笑话链接与标题

        接着,根据传入的页码num构建了要访问的 URL,然后使用requests库发送 GET 请求获取该页面的文本内容。之后,通过正则表达式re.findall从获取到的页面内容中提取出笑话的链接和标题信息。

url = f"https://xiaohua.zol.com.cn/new/{num}.html"
response = requests.get(url, headers=headers, cookies=cookies).text
r1 = re.findall(r'<span class="article-title"><a target="_blank" href="(.*?)">(.*?)</a></span>', response, re.S)
for r in r1:
    href = 'https://xiaohua.zol.com.cn' + r[0]
    title = r[1]
    parse(title, href)

        对于提取到的每个笑话的链接和标题,都会调用parse函数进一步解析该笑话的具体内容。

四、parse函数:解析单个笑话内容

   parse函数接受两个参数:title(笑话标题)和href(笑话链接),其主要任务是获取并处理单个笑话的具体内容。

1. 再次设置请求头和 Cookies 并获取页面内容

        与Get函数类似,在parse函数内部也需要重新设置请求头和 Cookies,因为访问不同的页面(这里是每个笑话的具体页面)可能需要不同的请求配置。然后使用requests库发送 GET 请求获取笑话具体页面的文本内容。

headers = {
    "authority": "xiaohua.zol.com.cn",
    "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
    "accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
    "cache-control": "no-cache",
    "pragma": "no-cache",
    "sec-ch-ua": "^\\^Not.A/Brand^^;v=^\\^8^^, ^\\^Chromium^^;v=^\\^114^^, ^\\^Microsoft",
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": "^\\^Windows^^",
    "sec-fetch-dest": "document",
    "sec-fetch-mode": "navigate",
    "sec-fetch-site": "none",
    "sec-fetch-user": "?1",
   ........
}
cookies = {
    "ip_ck": "....D",
    "Hm_lvt_a...... "1689736909",
    "lv": "1689829426",
    "vn": "3",
    "questionnaire_pv": "1689811215"
}
response = requests.get(href, headers=headers, cookies=cookies).text

2. 提取并处理笑话内容

        使用正则表达式从获取到的页面内容中提取出笑话的文本内容部分,然后通过一系列的正则表达式替换操作,去除其中的回车、空格以及 HTML 标签等,只保留纯净的文本内容和数字。最后,将笑话标题和处理后的文本内容添加到一个列表data中,并打印出来,同时调用save_to_csv函数将数据保存到 CSV 文件。

r2 = re.findall(r'<div class="article-text">(.*?)</div>', response, re.S)[0]
# 去除回车和空格
text = re.sub(r"\s", "", r2)
# 去除标签,只保留文本内容和数字
text = re.sub(r"<.*?>", "", text)
# 打印结果
data.append(title)
data.append(text)
print(data)
save_to_csv(data)

五、save_to_csv函数:保存数据到 CSV 文件

   save_to_csv函数负责将抓取到的笑话数据保存到 CSV 文件中。

1. 设置 CSV 文件的表头

        首先定义了 CSV 文件的表头,这里设置为['title', 'text'],分别对应笑话的标题和内容。

headers = ['title', 'text']

2. 写入数据到 CSV 文件

        使用csv.writer创建一个 CSV 文件写入对象,然后判断文件是否为空(通过file.tell()判断写入指针的位置),如果为空则先写入表头。接着,将传入的笑话数据列表data写入到 CSV 文件中,并在写入成功后打印提示信息。

with open('./joker.csv', 'a', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)

    if file.tell() == 0:
        writer.writerow(headers)

    writer.writerow(data)

print("数据已成功保存到CSV文件。")

六、主程序入口(__main__部分)

        在if __name__ == "__main__"这部分代码中,是整个程序的入口点。首先通过input函数提示用户输入要下载的页数,然后使用for循环遍历从1到用户输入的页数relit,在每次循环中调用Get函数来获取对应页码的笑话列表页面信息,进而完成整个抓取和保存数据的流程。

try:
    relit = int(input('请输入要下载的页数(一页20条):'))
    for num in range(1, relit + 1):
        Get(num)
except:
    pass

完整代码:

# -*- coding:utf-8 -*-
import csv
import re

import requests


def Get(num):
    headers = {
        
    }
    cookies = {
       
    }
    url = f"https://xiaohua.zol.com.cn/new/{num}.html"
    response = requests.get(url, headers=headers, cookies=cookies).text
    # print(response)
    r1 = re.findall(r'<span class="article-title"><a target="_blank" href="(.*?)">(.*?)</a></span>', response, re.S)
    for r in r1:
        href = 'https://xiaohua.zol.com.cn' + r[0]
        title = r[1]
        # print(title, href)
        parse(title, href)


def parse(title, href):
    data = []
    headers = {
      
    }
    cookies = {
       
    response = requests.get(href, headers=headers, cookies=cookies).text
    r2 = re.findall(r'<div class="article-text">(.*?)</div>', response, re.S)[0]
    # 去除回车和空格
    text = re.sub(r"\s", "", r2)
    # 去除标签,只保留文本内容和数字
    text = re.sub(r"<.*?>", "", text)
    # 打印结果
    data.append(title)
    data.append(text)
    # print(title)
    # print(text)
    print(data)
    save_to_csv(data)


def save_to_csv(data):
    headers = ['title', 'text']

    with open('./joker.csv', 'a', newline='', encoding='utf-8') as file:
        writer = csv.writer(file)

        if file.tell() == 0:
            writer.writerow(headers)

        writer.writerow(data)

    print("数据已成功保存到CSV文件。")


if __name__ == "__main__":
    try:
        relit = int(input('请输入要下载的页数(一页20条):'))
        for num in range(1, relit + 1):
            Get(num)
    except:
        pass

注意:

        在使用本代码进行网站数据抓取时,请务必遵守相关法律法规以及目标网站(“xiaohua.zol.com.cn”)的使用规则和服务协议。本代码仅用于学习和研究目的,不得用于任何非法的商业用途或侵犯他人权益的行为。若因不当使用本代码而导致的任何法律纠纷或不良后果,使用者需自行承担全部责任。在进行数据抓取操作之前,请确保你已经充分了解并获得了合法的授权与许可,尊重网站的正常运营和其他用户的合法权益。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/922551.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis-09 SpringBoot集成Redis

Jedis 和 lettuce 基本已经过时 集成RedisTemplate 单机 1.建 Modul 2.改pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instanc…

Linux:自定义Shell

本文旨在通过自己完成一个简单的Shell来帮助理解命令行Shell这个程序。 目录 一、输出“提示” 二、获取输入 三、切割字符串 四、执行指令 1.子进程替换 2.内建指令 一、输出“提示” 这个项目基于虚拟机Ubuntu22.04.5实现。 打开终端界面如图所示。 其中。 之前&#x…

夜天之书 #104 开源软件有断供的风险吗?

近期&#xff0c;Linux 上游因为受美国出口管制条例的影响&#xff0c;将移除部分开发者的 MAINTAINER 权限&#xff0c;引起了新一轮对开源依赖的重新评估。 关于其中开源精神和社群治理的讨论&#xff0c;卫 Sir 的两篇文章已经讨论得比较清楚&#xff08;见尾注&#xff09;…

tensorforce(dqn框架)安装

win7 64位操作系统 python版本&#xff1a;3.8.10 pip install tensorflow 默认的tensorflow的版本是2.31.0&#xff0c;安装tensorforce后自动升级到3.6.0 tensorflow:升级到3.6.0 keras&#xff1a;升级到3.6.0 tensorforce安装 pip3 install tensorforce protobuf 需要降到…

STM32抢占优先级不生效

板类型&#xff1a;STM32F103精英开发板代码背景&#xff1a; 设置了USART1中断和KEY_UP中断(使用EXTI0外部中断)两个中断的优先级分组都设为2&#xff08;2bit抢占优先级&#xff0c;2bit响应优先级)EXTI0中断抢占优先级设为3&#xff0c; 响应优先级设为3USART1抢占优先级设…

4.1_未授权漏洞

未授权漏洞 成因&#xff1a;配置错误&#xff0c;默认口令&#xff08;弱口令&#xff09;&#xff0c;接口配置不当&#xff1b;未授权漏洞 漏洞利用方式 Redis 未授权访问漏洞 Getshell方式 写入webshell&#xff1b; 连接目标redis&#xff1a;redis-cli -h 192.168.7…

快速识别模型:simple_ocr,部署教程

快速识别图片中的英文、标点符号、数学符号、Emoji, 模型会输出图片中文字行的坐标位置、最低得分、识别结果。当前服务用到的模型&#xff1a;检测模型、数字识别、英文符号识别。 一、部署流程 1.更新基础环境 apt update2.安装miniconda wget https://repo.anaconda.com/…

衡山派D133EBS 开发环境安装及SDK编译烧写镜像烧录

1.创建新文件夹&#xff0c;用来存放SDK包&#xff08;其实本质就是路径要对就ok了&#xff09;&#xff0c;右键鼠标通过Open Git Bash here来打开git 输入命令 git clone --depth1 https://gitee.com/lcsc/luban-lite.git 来拉取&#xff0c;如下所示&#xff1a;&#xff0…

蓝桥杯不知道叫什么题目

小蓝有一个整数&#xff0c;初始值为1&#xff0c;他可以花费一些代价对这个整数进行变换。 小蓝可以花贵1的代价将教数增加1。 小蓝可以花费3的代价将整数增加一个值,这个值是整数的数位中最大的那个(1到9) .小蓝可以花费10的代价将整数变为原来的2倍, 例如&#xff0c;如果整…

读取mysql、kafka数据筛选后放入mysql

要求&#xff1a; 从kafka的topic-car中读取卡口数据&#xff0c;将超速车辆写入mysql的t_monitor_info表 当通过卡口的车速超过该卡口限速的1.2倍 就认定为超速。 G107 1&#xff09;卡口数据格式如下&#xff1a; action_time long --摄像头拍摄时间戳&#xff0c;精确到秒…

CVE-2022-24124

根据提示 访问api/get-organizations salmap和手工注入都不行&#xff0c;使用substring() 查库&#xff0c;查到有4个库 ?p1&pageSize10&valuee99nb&sortField&sortOrder&field (substring((select count(schema_name) from information_schema.sche…

采用python3.12 +django5.1 结合 RabbitMQ 和发送邮件功能,实现一个简单的告警系统 前后端分离 vue-element

一、开发环境搭建和配置 #mac环境 brew install python3.12 python3.12 --version python3.12 -m pip install --upgrade pip python3.12 -m pip install Django5.1 python3.12 -m django --version #用于检索系统信息和进程管理 python3.12 -m pip install psutil #集成 pika…

Python文件夹.idea的作用

每当我们创建python的时候&#xff0c;发现文件夹里面都会有.idea文件夹。 那么这个是什么东西呢&#xff1f; .idea是集成开发环境&#xff08;IDE&#xff09;创建项目时自动生成的配置目录。 .idea文件目录介绍&#xff1a; workspace.xml&#xff1a;包含项目的整体配置信…

【计算机网络】多路转接之poll

poll也是一种linux中的多路转接方案(poll也是只负责IO过程中的"等") 解决&#xff1a;1.select的fd有上限的问题&#xff1b;2.每次调用都要重新设置关心的fd 一、poll的使用 int poll(struct pollfd *fds, nfds_t nfds, int timeout); ① struct pollfd *fds&…

使用 Elastic 收集 Windows 遥测数据:ETW Filebeat 输入简介

作者&#xff1a;来自 Elastic Chema Martinez 在安全领域&#xff0c;能够使用 Windows 主机的系统遥测数据为监控、故障排除和保护 IT 环境开辟了新的可能性。意识到这一点&#xff0c;Elastic 推出了专注于 Windows 事件跟踪 (ETW) 的新功能 - 这是一种强大的 Windows 原生机…

.net core MVC入门(一)

文章目录 项目地址一、环境配置1.1 安装EF core需要包1.2 配置数据库连接二、使用EF创建表2.1 整体流程梳理2.1 建表详细流程三、添加第一个视图3.1整体流程梳理3.1 添加视图,并显示在web里四、使用EF增加Catogory数据,并且读取数据到页面4.1整体流程梳理4.2 实现五、增加Cat…

短视频矩阵矩阵,矩阵号策略

随着数字媒体的迅猛发展&#xff0c;短视频平台已经成为企业和个人品牌推广的核心渠道。在这一背景下&#xff0c;短视频矩阵营销策略应运而生&#xff0c;它通过高效整合和管理多个短视频账号&#xff0c;实现资源的最优配置和营销效果的最大化。本文旨在深入探讨短视频矩阵的…

决策回归树【原理/算例/决策回归树 VS 线性回归】

决策回归树 1. 决策回归树原理2. 决策回归树算例3. 手动计算MSE和最优划分属性4. 决策回归树 VS 线性回归 1. 决策回归树原理 决策回归树&#xff0c;虽然叫做“回归”树&#xff0c;但是它的本质还是分类算法&#xff0c;只是分的类别多一点。 1. 回归树的裂分指标 回归树种&…

基于STM32的智能鱼缸控制系统的Proteus仿真

文章目录 一、智能鱼缸控制系统1.题目要求2.思路2.1 主控2.2 传感器2.3 按键2.4 声光报警2.5 自动换水&#xff0c;喂食&#xff0c;供氧2.6 OLED显示2.7 电源部分2.8 远程终端 3.电路仿真3.1 未仿真时3.2 开始仿真&#xff0c;正常显示3.3 按下设置按键&#xff0c;进入阈值界…

【Python爬虫】Scrapy框架实战---百度首页热榜新闻

如何利用Scrapy框架实战提取百度首页热榜新闻的排名、标题和链接 一、安装Scrapy库 二、创建项目&#xff08;以BaiduSpider为例&#xff09; scrapy startproject BaiduSpider生成每个文件的功能&#xff1a; 二、 创建爬虫脚本&#xff08;爬虫名&#xff1a;news&#xff…