python 爬虫入门实战——爬取维基百科“百科全书”词条页面内链

news2024/9/20 9:48:13

1. 简述

本次爬取维基百科“百科全书”词条页面内链,仅发送一次请求,获取一个 html 页面,同时不包含应对反爬虫的知识,仅包含最基础的网页爬取、数据清洗、存储为 csv 文件。

爬取网址 url 为 “https://zh.wikipedia.org/wiki/百科全书”,爬取内容为该页面所有内链及内链标识(下图蓝色字体部分)

将整个爬虫代码拆分为以下四部分介绍,同时列出相应部分代码并详解:

  1. 导入所需的库

  2. 请求并返回 “百科全书” 词条页面 html 文档

  3. 解析 html 文档,获取此页面包含的词条链接信息

  4. 持久化存储获得的词条链接信息,保存为 csv 文件

步骤 2、3、4 都设置一个函数,最后调用即可。

data = request_html()
results = parse_links(data)
save_csv(results)

下图为最终结果:

2. 导入所需库

使用 requests 库中的 get 函数发送请求;
使用 beautifulsoup 库解析 html 网页,同时使用 re 库进行正则匹配,获取想要数据;
使用 csv 库将解析得到的结果存储为 csv 文件。

源码为:

from requests import get
from bs4 import BeautifulSoup
import re
from csv import DictWriter

3. 请求并返回 html 文档

设置 请求头headers,将 UA 添加到 headers 中;
使用 get 函数发送请求,获取返回的内容。

源码为:

def request_html():
    url = 'https://zh.wikipedia.org/wiki/百科全书'
    user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36'
    headers = {'user-agent': user_agent}
    response = get(url, headers=headers)
    return response.text

4. 获取所需数据

想要获取所需数据,大致思路为:
首先创建 html 的 BeautifulSoup 实例,为了简单,直接使用内置的 html.parser 解析器;
然后使用 find 与 find_all 函数,通过匹配标签名与属性,获取所需的标签列表;
逐个处理标签列表中的标签,将所需数据以列表形式返回。

上述思路中,最主要的是通过 find 函数查找到所需标签列表,通过 F12 可知:
整个页面内容部分包含在 “class” 属性值为 “mw-content-container” 的 “div” 标签中,因此可通过 bs对象 查找所需标签 bs.body.find('div', {'class': 'mw-page-container'}).find('div', {'class': 'mw-content-container'})

词条链接都包含在 “a” 标签中,且以 “/wiki/” 开头,因此可通过正则进行匹配 find_all('a', {'href': re.compile('^/wiki/.*')})

源码为:

def parse_links(html_data: str):
    bs = BeautifulSoup(html_data, 'html.parser')
    tags = bs.body.find('div', {'class': 'mw-page-container'}).find(
        'div', {'class': 'mw-content-container'}).find_all(
            'a', {'href': re.compile('^/wiki/.*')})
    results = []
    links = set()
    for tag in tags:
        link = 'https://zh.wikipedia.org' + tag['href']
        if link not in links:
            links.add(link)
        else:
            continue
        try:
            title = tag['title']
        except KeyError:
            continue
        result = {}
        result['title'] = title
        result['link'] = link
        results.append(result)
    return results

5. 存储为 csv 文件

将得到的数据直接存储到 csv 文件中即可。

源码为:

def save_csv(data: list[dict]):
    with open('inner_links.csv', 'w', encoding='utf-8', newline='') as f:
        f_writer = DictWriter(f, ['title', 'link'])
        f_writer.writeheader()
        f_writer.writerows(data)
 

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

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

相关文章

历届奥运会奖牌数据(1896年-2024年7月)

奥运会,全称奥林匹克运动会(Olympic Games),是国际奥林匹克委员会主办的世界规模最大的综合性体育赛事,每四年一届,会期不超过16天。这项历史悠久的赛事起源于古希腊,现代奥运会则始于1896年的希…

opencascade AIS_ViewCube源码学习小方块

opencascade AIS_ViewCube 小方块 前言 用于显示视图操控立方体的交互对象。 视图立方体由多个部分组成,负责不同的相机操作: 立方体的各个面代表主视图:顶部、底部、左侧、右侧、前侧和后侧。 边表示主视图之一的旋转45度。 顶点表示主视…

3143. 正方形中的最多点数 Medium

给你一个二维数组 points 和一个字符串 s ,其中 points[i] 表示第 i 个点的坐标,s[i] 表示第 i 个点的 标签 。 如果一个正方形的中心在 (0, 0) ,所有边都平行于坐标轴,且正方形内 不 存在标签相同的两个点,那么我们称…

ChatGPT协助撰写研究论文的11种方法【全集】

学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 当我们使用 ChatGPT 时,原本那些需要花费数小时、数天、有时甚至更长时间的任务现在只需几分钟甚至更短时间。 今天的分享,我们将谈谈 ChatGPT 在研究论文方面可…

右键空白处自定义菜单

效果 建立二级菜单 winr输入 regedit 路径复制到地址栏,回车即可定位。 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\如果没有地址栏 在shell上右键,新建项,名字随意但最好是英文(…

免费开源!PDF加盖骑缝章小工具PDFQFZ

PDFQFZ是一款免费开源的PDF加盖骑缝章小工具,主要用于给多页合同等PDF文件添加骑缝章,以达到防伪效果。该工具支持对PDF文件或文件夹进行随机分割、印章设定、骑缝章等操作,生成加盖骑缝章的PDF文件。 主要功能: 支持加密PDF文件…

Python安装教程(Window环境)

1 Python安装 1.1 Python官网下载 1)在Python官网选择Python版本(这里选择Python 3.12.4),点击对应的【Download】按钮下载。2)根电脑的操作系统类型选择(这里电脑64位操作系统),点…

【商品支付】漏洞详解!

产生原因: 订单金额的验证:价格未保存在数据库中未校验商品价格与数据库中是否匹配 不安全的传输: 订单相关信息未进行加密传输(话说你加密的地方一定是重要地方,你不加密,你就是有病,哈哈哈) 验证规…

(超全)Kubernetes 的核心组件解析

引言 在现代软件开发和运维的世界中,容器化技术已经成为一种标志性的解决方案,它为应用的构建、部署和管理提供了前所未有的灵活性和效率。然而,随着应用规模的扩大和复杂性的增加,单纯依靠容器本身来管理这些应用和服务已不再足够…

gitlab 服务器安装

阿里云盘快传 百度链接 链接:https://pan.baidu.com/s/1Gn5bWHi45Dcpe1RH1S06dw 提取码:yai2 然后就是有一台服务器 cd /mkdir gitlab上传下载好的东西rpm -ivh gitlab-ce-10.8.4-ce.0.el7.x86_64.rpm 这里可以tab提示vim /etc/gitlab/gitlab.rb我建议…

【JavaEE精炼宝库】 网络编程套接字——UDP业务逻辑 | TCP流套接字编程及业务逻辑实现

文章目录 一、UDP业务逻辑实现二、TCP流套接字编程2.1 API 介绍:2.1.1 ServerSocket:2.1.2 Socket: 2.2 Java流套接字通信模型:2.3 代码示例:2.3.1 TCP Echo Server:2.3.2 TCP Echo Client:2.3.…

【刷题汇总 -- 爱吃素、相差不超过k的最多数、最长公共子序列(一)】

C日常刷题积累 今日刷题汇总 - day0261、爱吃素1.1、题目1.2、思路1.3、程序实现 2、相差不超过k的最多数2.1、题目2.2、思路2.3、程序实现 -- 滑动窗口 3、最长公共子序列(一)3.1、题目3.2、思路3.3、程序实现 -- dp 4、题目链接 今日刷题汇总 - day026 1、爱吃素 1.1、题目…

自写Json转换工具

前面写了简单的API测试工具ApiTools,返回的json有时需要做很多转换,于是开发了这个工具。 功能包括 1、json字符串转为表格,可以直观的展示,也可以复制,并支持转换后的表格点击列头进行排序,比较方便地定…

鸿蒙系统开发【应用接续】基本功能

应用接续 介绍 基于ArkTS扩展的声明式开发范式编程语言编写的一个分布式视频播放器,主要包括一个直播视频播放界面,实现视频播放时可以从一台设备迁移到另一台设备继续运行,来选择更合适的设备继续执行播放功能以及PAD视频播放时协同调用手…

怎么选择的开放式耳机好用?2024超值耳机分享!

耳机在当前数字化时代已成为我们生活、娱乐乃至工作中的重要部分。随着市场需求的增长,消费者对耳机的期望也在提高,他们不仅追求音质的卓越,还关注佩戴的舒适度和外观设计。虽然传统的入耳式和半入耳式耳机在音质上往往能够满足人们&#xf…

JavaFX布局-Accordion

JavaFX布局-Accordion 一个可扩展的面板&#xff0c;包括标题、内容与TitledPane配合一起使用 public static Accordion demo1() {// 创建AccordionAccordion accordion new Accordion();// 内边距accordion.setPadding(new Insets(10, 10, 10, 10));for (int i 1; i < 1…

PSINS工具箱函数介绍——avperrset

目录 avperrset是设置avp误差的函数使用方法函数源代码源代码解析 avperrset是设置avp误差的函数 输入为角度误差、速度误差、位置误差。 输出也是角度误差、速度误差、位置误差。 看起来输入和输出都一样&#xff0c;为什么还要这个函数呢&#xff1f; 那是因为这个函数可以进…

计算机网络-PIM-DM密集模式工作原理

一、PIM-DM基础概念 PIM-DM主要用在组成员较少且相对密集的网络中&#xff0c;通过"扩散-剪枝"的方式形成组播转发树&#xff08;SPT&#xff09;。 PIM-DM在形成SPT的过程中&#xff0c;除了扩散&#xff08;Flooding&#xff09;&#xff0c;剪枝&#xff08;Prune…

基于YOLOv10的裂缝检测系统

基于YOLOv10的裂缝检测系统 (价格80) 包含 【裂缝】 1个类 通过PYQT构建UI界面&#xff0c;包含图片检测&#xff0c;视频检测&#xff0c;摄像头实时检测。 &#xff08;该系统可以根据数据训练出的yolov10的权重文件&#xff0c;运用在其他检测系统上&#xff0c;如火…

Logic Error: 如何识别和修复逻辑错误

&#x1f9e9; Logic Error: 如何识别和修复逻辑错误 &#x1f50d; &#x1f9e9; Logic Error: 如何识别和修复逻辑错误 &#x1f50d;摘要引言正文内容一、什么是逻辑错误&#xff1f; &#x1f914;1.1 逻辑错误的定义1.2 逻辑错误的特征 二、常见的逻辑错误类型 &#x1f…