首页 > 编程语言 >python 爬虫入门实战——爬取维基百科“百科全书”词条页面内链

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

时间:2024-08-03 13:00:22浏览次数:13  
标签:links python 标签 爬取 维基百科 html link csv find

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)





标签:links,python,标签,爬取,维基百科,html,link,csv,find
From: https://blog.csdn.net/guanxxx/article/details/140888852

相关文章

  • Python:match()和search()的区别
    在Python中,match()和search()函数通常与正则表达式(regularexpressions)一起使用,特别是在re模块中。尽管它们都用于搜索字符串中的模式,但它们在搜索行为上有关键的区别。re.match()re.match()函数尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()......
  • Python:range()函数的用法
    range()函数是Python中一个内置函数,用于生成一个数字序列。这个函数通常用于在for循环中迭代一个指定的次数。range()函数可以接收一到三个参数,分别是起始值(start)、结束值(stop)和步长(step),但步长是可选的,默认值为1。基本用法两个参数:range(start,stop)生成一个从star......
  • 计算机毕业设计-基于python高校大学生评奖评优系统【源码+文档+PPT】
    精彩专栏推荐订阅:在下方主页......
  • Python知识点
    目录1、数据类型2、变量3、列表4、集合5、字典6、注释7、基本功能8、条件语句9、循环语句10、函数11、异常处理12、字符串操作13、正则表达式1、数据类型数据类型是可以存储在变量中的数据规范。解释器根据变量的类型为变量分配内存。下面是Python中的各种......
  • 家庭局域网中电脑唤醒 —— WOL远程唤醒(python实现)
    相关:https://blog.csdn.net/hih30250/article/details/136342258在WOL介绍里说过WOL数据包的最简格式是由6个字节的255和目标计算机的48位MAC地址,重复16次组成,并且这个数据包可以包含在任何协议中,最常见的是包含在UDP中。点击查看代码importsocketimportstructclass......
  • python3解析wav文件获取dtmf值
    操作系统:Windows10_x64Python版本:3.9.2从事FreeSwitch相关工作,大概率会遇得到DTMF,DTMF的传递方式有三种:In-bandRFC2833SIP-INFO使用RFC2833或SIP-INFO传递方式的DTMF,FreeSwitch可以在日志中打印出来,但遇到inband模式的DTMF,FreeSwitch的日志就打印不出来了。如果是会议......
  • Python框架-FastAPI
    FastAPI是一个现代、快速(高性能)的web框架,用于构建API。官网:https://fastapi.tiangolo.com/源码:https://github.com/fastapi/fastapi安装#安装FastAPIpipinstallfastapi#安装Uvicorn(用于运行ASGI服务器)pipinstalluvicorn创建一个main.pyfromfastapiimpor......
  • 12:Python列表属性
    #list类,列表li=[1,2,6,'adfadsf','fadfe',['fda',5,["wdf",4],'中国人']]#中国号括起来,逗号分开,可以是数字、字符串、列表、布尔值,列表可以嵌套任何类型print(li)print(li[5])#索引取值print(li[3:6])#切片结果也是列表print(li[3:-1])foriteminli:......
  • python 滑动验证码爬取思路
    参考文章:python爬虫之滑动验证码[完整版]-简书内附个人理解注释示例代码:fromseleniumimportwebdriverfromselenium.webdriver.common.action_chainsimportActionChainsimporttimefromselenium.webdriver.common.byimportByfromselenium.webdriver.support.......
  • 使用Python自动将照片文件夹转换为PowerPoint幻灯片
    在这个数字时代,我们经常需要快速创建照片幻灯片来展示我们的回忆或工作成果。今天,我们将探讨如何使用Python来自动化这个过程,将一个文件夹中的所有照片转换为一个精美的PowerPoint演示文稿,每张照片占据一页,并以文件名作为标题。C:\pythoncode\new\jpeginsertppt.py全......