【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————————")

  • 11
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mitch311

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值