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

打印 上一主题 下一主题

主题 1017|帖子 1017|积分 3051

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1. 简述

本次爬取维基百科“百科全书”词条页面内链,仅发送一次请求,获取一个 html 页面,同时不包含应对反爬虫的知识,仅包含最基础的网页爬取、数据清洗、存储为 csv 文件。
爬取网址 url 为 “https://zh.wikipedia.org/wiki/百科全书”,爬取内容为该页面所有内链及内链标识(下图蓝色字体部门)



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

  • 导入所需的库
  • 请求并返回 “百科全书” 词条页面 html 文档
  • 解析 html 文档,获取此页面包含的词条链接信息
  • 长期化存储获得的词条链接信息,保存为 csv 文件
步骤 2、3、4 都设置一个函数,最后调用即可。
  1. data = request_html()
  2. results = parse_links(data)
  3. save_csv(results)
复制代码
下图为终极结果:


2. 导入所需库

使用 requests 库中的 get 函数发送请求;
使用 beautifulsoup 库解析 html 网页,同时使用 re 库进行正则匹配,获取想要数据;
使用 csv 库将解析得到的结果存储为 csv 文件。
源码为:
  1. from requests import get
  2. from bs4 import BeautifulSoup
  3. import re
  4. from csv import DictWriter
复制代码
3. 请求并返回 html 文档

设置 请求头headers,将 UA 添加到 headers 中;
使用 get 函数发送请求,获取返回的内容。
源码为:
  1. def request_html():
  2.     url = 'https://zh.wikipedia.org/wiki/百科全书'
  3.     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'
  4.     headers = {'user-agent': user_agent}
  5.     response = get(url, headers=headers)
  6.     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/.*')})


源码为:
  1. def parse_links(html_data: str):
  2.     bs = BeautifulSoup(html_data, 'html.parser')
  3.     tags = bs.body.find('div', {'class': 'mw-page-container'}).find(
  4.         'div', {'class': 'mw-content-container'}).find_all(
  5.             'a', {'href': re.compile('^/wiki/.*')})
  6.     results = []
  7.     links = set()
  8.     for tag in tags:
  9.         link = 'https://zh.wikipedia.org' + tag['href']
  10.         if link not in links:
  11.             links.add(link)
  12.         else:
  13.             continue
  14.         try:
  15.             title = tag['title']
  16.         except KeyError:
  17.             continue
  18.         result = {}
  19.         result['title'] = title
  20.         result['link'] = link
  21.         results.append(result)
  22.     return results
复制代码
5. 存储为 csv 文件

将得到的数据直接存储到 csv 文件中即可。
源码为:
  1. def save_csv(data: list[dict]):
  2.     with open('inner_links.csv', 'w', encoding='utf-8', newline='') as f:
  3.         f_writer = DictWriter(f, ['title', 'link'])
  4.         f_writer.writeheader()
  5.         f_writer.writerows(data)
复制代码
[code][/code]
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王柳

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表