Python利用urllib模块+正则表达式并利用BeautifulSoup模块进行内容解析,爬取院士信息
Posted Mitch311
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python利用urllib模块+正则表达式并利用BeautifulSoup模块进行内容解析,爬取院士信息相关的知识,希望对你有一定的参考价值。
题目👇
使用urllib模块或request模块读取网页内容,并利用BeautifulSoup模块进行内容解析,编写爬虫从http://www.cae.cn/cae/html/main/col48/column_48_1.html爬取中国工程院院士信息
思路分析👇
先来了解一下BeautifulSoup的相关知识:
1.BeautifulSoup简介
BeautifulSoup4和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据。
BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如果我们不安装它,则 Python 会使用 Python默认的解析器,lxml 解析器更加强大,速度更快,推荐使用lxml 解析器。
Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。
2.BeautifulSoup的安装
首先我们需要安装一个BeautifulSoup库。python3版本可以直接在cmd下用pip3命令进行安装。
命令行输入:
pip3 install beautifulsoup4
效果如图:
代码示例👇
#author:Mitchell
#date:12.10
#part1:使用urllib模块或request模块读取网页内容,并利用BeautifulSoup模块进行内容解析
#编写爬虫从http://www.cae.cn/cae/html/main/col48/column_48_1.html爬取中国工程院院士信息
from bs4 import BeautifulSoup
import requests
import sys
#写入文件函数,规定写入的格式
def writer(name, filename, text):
with open(filename, 'a', encoding='utf-8') as f:
f.write(name + '\\n')
f.writelines(text)
f.write('\\n\\n')
#获取要爬取的链接,参数server为网页服务器主站,target为目标网址,urls用来存放需要爬取的链接地址
def get_download_url(server,target,names,urls):
#目标的请求头,用来说明服务器使用的附加信息
headers =
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36'
#url作为Request()方法的参数,构造并返回一个符合headers要求的Request对象
req = requests.get(url = target,headers = headers)
#网页的html代码
html = req.text
#使用BeatuifulSoup的解析器
li_bf = BeautifulSoup(html)
#找到html代码中所有class=name_list的li列表标签,保存到名为li的数组里
li = li_bf.find_all('li', class_ = 'name_list')
#全局变量nums用来保存urls中链接的个数
global nums
nums = len(li)
for each in li:
a_bf = BeautifulSoup(str(each))
a = a_bf.find_all('a') #每个院士姓名下就一个<a href...
names.append(a[0].string) #获取链接的名字
tstr = server + a[0].get('href') #获取"href"属性的值,即链接
urls.append(tstr)#将链接放入urls列表
#爬取院士文本信息
def get_contents(target):
#目标的请求头,用来说明服务器使用的附加信息
headers =
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36'
req = requests.get(url = target, headers = headers)
req.encoding = 'utf-8'
#网页的html代码
html = req.text
#使用BeatuifulSoup的解析器
bf = BeautifulSoup(html)
#找到html代码中所有class=intro的div标签,保存到名为div的数组里
div = bf.find_all('div', class_ = 'intro')
#再次使用BeatuifulSoup的解析器
p_bf = BeautifulSoup(str(div[0]))
#找到html代码中所有p也就是段落标签,保存到名为p的数组里
p = p_bf.find_all('p')
#保存信息文本
txt = ''
for each in p:
txt += each.text
return txt
names = []#存放院士姓名
urls = []#存放院士信息的链接地址
server = 'http://www.cae.cn'#网页服务器主站
target = 'http://www.cae.cn/cae/html/main/col48/column_48_1.html'#目标网址
#获取链接地址
get_download_url(server,target,names,urls)
print('工程院院士信息开始下载:')
print('nums = ',nums)
for i in range(nums):
writer(names[i], '工程院士信息.txt', get_contents(urls[i]))
if (i+1)%10 == 0:
#将下载进度输出到控制台,实时变动
sys.stdout.write(" 已下载:%.3f%%" % float((i+1)*100/nums) + '\\r')
#刷新缓存区
sys.stdout.flush()
print('工程院院士信息下载完成')
print("————————END————————")
以上是关于Python利用urllib模块+正则表达式并利用BeautifulSoup模块进行内容解析,爬取院士信息的主要内容,如果未能解决你的问题,请参考以下文章