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
2
3
4from bs4 import BeautifulSoup
import requests
import csv #用到的写入csv文件的包 - 文件导入
由于我有很多想要爬取的实体啦,故把实体名称存放在了一个txt文件里,每行都存放一个想要爬取的实体名。接下来需要导入文件。
这里有一个小提示!
读取实体的时候会把末尾的换行符”\n”也读进来,但这并不是我们想要的,所以我们采用strip来删除末尾的字符。
1 |
|
- 爬虫开始!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16def 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 |
|
1 |
|
最后爬到的结果就是这个样子的啦。
只是一个Excel示例
初步实现了一个小爬虫,但是还有待优化的地方。
比如爬取的实体若没有相应百度百科链接,就会报错。应该设置一个判断,如果url获取失败就报错。
还有就是模块化还不够优美,代码功能是能实现,但是写的略丑了一点…