python爬取百度百科属性框

python爬取百度百科属性框记录

由于构建知识图谱时需要爬取一些实体属性,故考虑爬取百度百科的属性框,如图:
马寅初
实体名称为马寅初,想根据以上的信息框爬取一些三元组关系,并保存到csv文件中,格式如下:

|实体|关系|属性
|——
|马寅初|中文名|马寅初
|马寅初|外文名|马寅初
|马寅初|国籍|中国
|马寅初|出生日期|…

一个两个实体可以考虑在网页上直接复制粘贴,但有很多个该怎么办呢?故考虑选用python爬虫来获取这些信息。

分析页面结构

在百科页面上右键-检查,观察网页结构,发现属性框是存放在一个名叫 basic-info.com-clearfix的标签里的,并且里面还分了左右两列。
在这里插入图片描述
再进一步观察,发现属性名都存放在 basic-info-item name标签里,属性值都存放在basic-info-item value标签里。
由于属性名和属性值是一一对应的,故我们的策略就是获得两个列表,一个存放爬到的属性名,一个存放爬到的属性值,然后进行拼接。
由于爬虫的时候容易被禁,所以我们要构造一个headers,来模拟浏览器访问。我们浏览器中查找自己的user-agent。具体为在网页右键-检查-选择Network-选择Doc
拉到最下面,即可查看自己的user-agent具体的值啦。
在这里插入图片描述

爬虫准备

基本思路有了,就开始编程吧~我这里选用的是Spyder来写爬虫代码。用到的BeautifulSoup包和requests就不在这里介绍啦!

  1. 包的引入和准备
    1
    2
    3
    4
    from bs4 import BeautifulSoup
    import requests
    import csv #用到的写入csv文件的包

  2. 文件导入
    由于我有很多想要爬取的实体啦,故把实体名称存放在了一个txt文件里,每行都存放一个想要爬取的实体名。接下来需要导入文件。

这里有一个小提示!
读取实体的时候会把末尾的换行符”\n”也读进来,但这并不是我们想要的,所以我们采用strip来删除末尾的字符。

1
2
3
4
5
6
7
8
9
10
#初始化一个存放待爬取关键词的列表
keywordlist = []
#打开文件
with open('qita.txt','r',encoding = 'UTF-8') as f:
#逐行读取要爬取的实体名
for keyword in f.readlines():
keyword = keyword.strip("\n")
keywordlist.append(keyword)
print(keywordlist)

  1. 爬虫开始!
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    def getHTMLText(url):
    i = 0
    while i<3: #最大重连次数为3
    try:
    #构造headers,user-agent看上述获取方法
    headers = {
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36'}
    r = requests.get(url,headers=headers,timeout=5)
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    soup = BeautifulSoup(r.text,'html.parser')
    return soup
    except requests.exceptions.RequestException:
    i += 1
    return 0

1
2
3
4
5
6
7
8
9
10
11
12
for keyword in keywordlist:
url = 'http://baike.baidu.com/search/word?word='+keyword
objSoup = getHTMLText(url)
#找标题
title = objSoup.find('h1')
title = title.get_text()
title = "".join(title.split())
#找属性名
attr = objSoup.find_all('dt', class_="basicInfo-item name")
#找属性值
info = objSoup.find_all('dd', class_="basicInfo-item value") # 找到所有dd标签,返回一个列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
attrlist = []
infolist = []
titlelist = []
for i in attr:
t = i.get_text()
t = "".join(t.split()) #去除空白符
attrlist.append(t)
titlelist.append(title) #重复title
for j in info:
n = j.get_text()
n = "".join(n.split())
infolist.append(n)
#文件写入方式为在文件后继续写内容,而不覆盖原有内容,故选择'a'这种打开方式。
with open('qita.csv','a',newline='')as f:
writer = csv.writer(f)
writer.writerows(zip(titlelist,attrlist,infolist))

最后爬到的结果就是这个样子的啦。
只是一个Excel示例
在这里插入图片描述
初步实现了一个小爬虫,但是还有待优化的地方。
比如爬取的实体若没有相应百度百科链接,就会报错。应该设置一个判断,如果url获取失败就报错。
还有就是模块化还不够优美,代码功能是能实现,但是写的略丑了一点…


python爬取百度百科属性框
https://abigail61.github.io/2024/11/23/原创-- python爬取百度百科属性框/
作者
Yajing Luo
发布于
2024年11月23日
许可协议