目录

1. 项目介绍

2. 网络爬虫

3. 爬虫结果

4. 项目源码


1. 项目介绍

利用网页特征爬取演员如下百科信息:

  1. 演员名字
  2. 演员摘要介绍
  3. 演员基础信息

从打开某个人的百科网页可以看出上述三点内容所在的位置。具体可以参考最下面的开源代码。

2. 网络爬虫

Requests 是一个优雅而简单的Python HTTP库。

Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.

利用 requests 爬取页面的 HTML,然后使用 beautiful soup 解析 HTML 获取目标数据。

安装依赖 requirements.txt

beautifulsoup4==4.12.2
requests==2.20.0
pip install -r requirements.txt

执行爬虫:

python main.py

爬虫主程序:

import json
import time
import random
from typing import Dict, Setfrom utils.downloader import HTMLDownloader
from utils.manager import URLManager
from utils.parser import HTMLParserclass Spider:"""爬虫主程序"""FILE_PATH = "data/person.jsonl"def __init__(self) -> None:self._manager = URLManager()self._parser = HTMLParser()self._downloader = HTMLDownloader()self._downloaded_urls = self._get_downloaded_urls()def execute(self, init_url: str, target: int=20000) -> None:self._execute(init_url, target)def _execute(self, init_url: str, target: int) -> None:"""爬虫调度"""self._display("开始爬虫")counter = 1# 加入初始 urlself._manager.add_url(init_url)# 如果 url 管理器中有 url 则一直执行while self._manager.has_url():url = self._manager.get_url()self._display("第 {} 个:".format(counter), "*", 5)print(url)# 如果已经下载则跳过if url in self._downloaded_urls and counter > 1:self._display("已爬取", "*", 2)continue# 下载页面资源page, url = self._downloader.download(url)# 解析页面try:urls, data = self._parser.parse(page, url)except AttributeError as e:print(e)continue# 获取到的 url 添加到 url 管理器中if urls:self._manager.add_urls(urls)# 保存爬取的结果if data and url not in self._downloaded_urls:self._save(data)counter += 1if counter > target:breakself._sleep()@staticmethoddef _display(text: str, symbol: str="=", num: int=20) -> None:"""格式化输出"""line = symbol * num \+ " " + text + " " \+ symbol * numprint(line)@staticmethoddef _get_downloaded_urls() -> Set[str]:"""获取已下载结果"""with open(Spider.FILE_PATH, "r") as f:data = [json.loads(i)["url"] for i in f.readlines() if i.strip()]return set(data)@staticmethoddef _sleep() -> None:"""随机休眠,模拟用户点击耗时"""time.sleep(random.random() * 5 + 1)@staticmethoddef _save(data: Dict[str, str]) -> None:"""结果保存"""with open(Spider.FILE_PATH, "a") as f:line = json.dumps(data, ensure_ascii=False)f.write(line + "\n")if __name__ == "__main__":spider = Spider()init_url = "https://baike.baidu.com/item/黄晓明/6597"spider.execute(init_url)

URL 管理器:

from typing import Setclass URLManager:"""url 管理器"""def __init__(self) -> None:# 待爬取的 url 集合self._capture_urls = set()# 已爬取的 url 集合self._finished_urls = set()def has_url(self) -> bool:"""判断待爬取集合,是否有 url"""return len(self._capture_urls) != 0def get_url(self) -> str:"""从待爬取集合中获取 url"""url = self._capture_urls.pop()self._finished_urls.add(url)return urldef add_url(self, url: str) -> None:"""添加 url 到待爬取集合中"""if url and url not in self._capture_urls and url not in self._finished_urls:self._capture_urls.add(url)def add_urls(self, urls: Set[str]) -> None:"""批量添加 url 到待爬取集合中"""for url in urls:self.add_url(url)

HTML 下载器:

from urllib import parse
from typing import Union, Tupleimport requestsclass HTMLDownloader:"""HTML 下载器"""def __init__(self) -> None:self._headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"}def download(self, url: str) -> Union[Tuple[str, str], None]:"""网页下载"""if url:r = requests.get(url=url, headers=self._headers)page = r.texturl = parse.unquote(r.url)return page, url

HTML 解析器:

import re
from typing import Set, Dict, Tuple, Union
from urllib import parsefrom bs4 import BeautifulSoupclass HTMLParser:"""HTML 解析器"""# 百家姓文件DIR = "data/lastnames.txt"# 演员关键词ACTOR_KEYWORDS = ["演员",]# 人物关键词PERSON_KEYWORDS = ["出生地","毕业院校","出生日期","国\xa0\xa0\xa0\xa0籍","民\xa0\xa0\xa0\xa0族","身\xa0\xa0\xa0\xa0高","星\xa0\xa0\xa0\xa0座","血\xa0\xa0\xa0\xa0型","生\xa0\xa0\xa0\xa0肖","性\xa0\xa0\xa0\xa0别",]# 名字长度限制NAME_LENGTH = 4def __init__(self) -> None:self._soup = Noneself._current_url = Noneself._lastnames = self._get_lastnames()def parse(self, page: str, url: str) -> Tuple[Set[str], Dict[str, str]]:"""解析网页"""if page and url:self._soup = BeautifulSoup(page, "html.parser")self._current_url = urlurls = self._get_page_urls()data = self._get_page_data()return urls, datadef _get_page_urls(self) -> Set[str]:"""获取页面中的 url, url可能是人名相关才添加"""urls = self._soup.find_all('a',href=re.compile(r'/item/(\%\w{2})+'))url_set = set()for url in urls:rel_path = parse.unquote(url["href"])if self._is_name(rel_path):path = parse.urljoin(self._current_url, rel_path)url_set.add(path)return url_setdef _get_page_title(self) -> str:"""获取页面标题"""title = self._soup.find('dd',class_='lemmaWgt-lemmaTitle-title').find('h1').get_text()return titledef _get_page_summary(self) -> str:"""获取页面摘要"""summary = self._soup.find('div',attrs={'label-module': 'lemmaSummary'},class_='lemma-summary').get_text()return summarydef _get_page_info(self) -> str:"""获取页面基本信息"""info = self._soup.find("div",class_="basic-info").get_text()return infodef _get_page_data(self) -> Union[Dict[str, str], None]:"""获取页面数据"""info = self._get_page_info()summary = self._get_page_summary()if self._is_person(info) and self._is_actor(summary):data = dict()data["title"] = self._get_page_title()data["url"] = self._current_urldata["summary"] = summarydata["basic-info"] = inforeturn data@staticmethoddef _get_lastnames() -> Set[str]:"""获取姓氏集合"""with open(HTMLParser.DIR, "r") as f:data = [i.strip() for i in f.readlines() if i.strip()]return set(data)def _is_name(self, rel_path: str) -> bool:"""是否是名字 eg: /item/黄晓明/"""name = rel_path.split('/')[2]top1, top2 = name[:1], name[:2]if len(name) <= HTMLParser.NAME_LENGTH and top1 in self._lastnames or top2 in self._lastnames:return Truereturn False@staticmethoddef _is_person(info) -> bool:"""通过关键词判断页面是否是人物"""for key in HTMLParser.PERSON_KEYWORDS:if key in info:return Truereturn False@staticmethoddef _is_actor(summary) -> bool:"""通过关键词判断页面是否是演员"""for key in HTMLParser.ACTOR_KEYWORDS:if key in summary:return Truereturn False

3. 爬虫结果

{"title": "xxx", "url": "xxx", "summary": "xxx"}
{"title": "xxx", "url": "xxx", "summary": "xxx"}
{"title": "xxx", "url": "xxx", "summary": "xxx"}
{"title": "xxx", "url": "xxx", "summary": "xxx"}
{"title": "xxx", "url": "xxx", "summary": "xxx"}
{"title": "xxx", "url": "xxx", "summary": "xxx"}
{"title": "xxx", "url": "xxx", "summary": "xxx"}
{"title": "xxx", "url": "xxx", "summary": "xxx"}
{"title": "xxx", "url": "xxx", "summary": "xxx"}
{"title": "xxx", "url": "xxx", "summary": "xxx"}
{"title": "xxx", "url": "xxx", "summary": "xxx"}

4. 项目源码

https://gitee.com/hl0929/baike-spider

【娱乐圈明星知识图谱1】百科爬虫相关推荐

  1. 娱乐圈明星字迹大盘点,井柏然竟不是第一

    近日,张一山发博称"感谢你们一直陪伴我,支持我...也感谢十二年前的家有儿女,让我变成了现在的我."并附上照片和亲笔信. 张一山 此微博一出,网友们纷纷表示"张一山写字好 ...

  2. 娱乐圈明星集体考编?靳东官宣煤矿文工团副团长,张艺兴关晓彤苏青加入国家话剧院

    近期小编发现越来越多的艺人开始考编,除了前几天靳东官宣担任煤矿文工团副团长之外,12月25日中国国家话剧院迎来自己的二十周年华诞,在一段特别制作的纪念视频<你永远可以相信>中,小编发现很多 ...

  3. 艾永亮:预约这家寿司店全靠人品,半个娱乐圈明星纷纷来打卡!

    被称之为"寿司之神"的小野二郎,其创建的数寄屋桥次郎寿司店位于银座办公楼地下室,面对只有十个座位的寿司小店每天却人满为患,没有豪华的装修,就连空间都显得有些狭窄,就连厕所都得跑出店 ...

  4. 部署明星关系图谱那些事儿(GitHub Pages)

    时光飞逝,距离发布上一篇文章 InteractiveGraph 实现酷炫关系图谱之前瞻 已经过去了近两个月,嘴上说着会马上把实战"娱乐圈明星关系图谱"的代码开源到 github/D ...

  5. 不了解喜欢的明星有什么关系?教你用Neo4j 快速构建明星关系图谱,让你比他自己还了解

    前言 本文将带你用 neo4j 快速实现一个明星关系图谱,因为拖延的缘故,正好赶上又一年的4月1日,于是将文中的几个例子顺势改成了"哥哥"张国荣.正所谓"巧妇难为无米之炊 ...

  6. 用 Neo4j 快速构建明星关系图谱,你一定感兴趣

    今天做一下你们感兴趣的事情,带你们用 neo4j 构建明星关系图谱,这次爬取一下娱乐圈专业的娱乐综合门户网站下载"明星"页的"更多明星"里所有9141条数据. ...

  7. 一文教你用 Neo4j 快速构建明星关系图谱

    更多有趣项目及代码见于:DesertsX/gulius-projects 前言 本文将带你用 neo4j 快速实现一个明星关系图谱,因为拖延的缘故,正好赶上又一年的4月1日,于是将文中的几个例子顺势改 ...

  8. 知识图谱可视化技术在美团的实践与探索

    省时查报告-专业.及时.全面的行研报告库 省时查方案-专业.及时.全面的营销策划方案库 [免费下载]2022年3月份热门报告盘点 某短视频APP推荐算法及策略最详细拆解 大萧条来临前的几大征兆 机器学 ...

  9. 【医疗人工智能】DKDR:一种用于疾病诊断的知识图谱和深度强化学习方法

    Article 作者:Yuanyuan Jia, Zhiren Tan, Junxing Zhang 文献题目:DKDR: An Approach of Knowledge Graph and Dee ...

最新文章

  1. 机器学习中的数学基础(1)——向量和范数
  2. 中国农业大学计算机专业在陕西录取分数线,陕西考生,400多分被985大学录取,分不高的考生“捡漏“注意这几点...
  3. mfc exe 在繁体系统 乱码_成都市招标文件编制及备案系统使用技巧问答
  4. azure_Azure ML算法备忘单
  5. Java 8中的java.util.Random
  6. Java String和Date的转换 Date类型操作
  7. oracle存储过程没有返回值,Java调用Oracle存储过程(无返回值)
  8. Java 并发编程之内置锁 synchronized
  9. java mvc下载文件_Springmvc实现文件下载2种实现方法
  10. SAP License:SE16如何删除或合修改数据库表
  11. 每日英语:6 Brainy Habits of the Wisest People
  12. Strace诊断CPU跑高问题(java/php网站)
  13. ECharts怎样显示中国地图
  14. Python实现视频流媒体传输
  15. CS61B project 2 示例图的地牢地图房间走廊地图生成洞穴地图生成方法
  16. Android ListView异步获取网络图片
  17. PowerManagerService分析(二)之updatePowerStateLocked()核心
  18. 自动化测试之单元测试框架
  19. 网页中插入视频播放代码全集
  20. OpenGL中三原色对应的glcolor3f

热门文章

  1. VMware虚拟机配置
  2. 慕课网“小慕听书“ireader项目
  3. 三角形最小/最大路径
  4. 中学生听说能力测试软件,初中生学习软件排行榜 适合初中生学习的APP推荐
  5. 中行信用卡数据岗知识
  6. FCS2022-05-DSADT
  7. WPS如何转PDF格式?WPS转PDF怎么转?
  8. mysql数据查询语言(基本查询语句)
  9. 富盛Sbo插件集Ver1.2.0 简介及免费下载
  10. orical 时间类型和mydql时间类型的差别