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模块进行内容解析,爬取院士信息的主要内容,如果未能解决你的问题,请参考以下文章

利用正则表达式实现python强口令检测

python中利用正则表达式匹配ip地址

Python常用模块

Python HTTP下载文件并显示下载进度条

Python学习---网页爬虫[下载图片]

python爬取糗百第一页的笑话