我的Python爬虫笔记(一)——静态网页

在学习北理工嵩天老师在mooc上的课程-Python网络爬虫与信息提取。老师逻辑超强,这个学习素材非常受用!感谢老师!
 
 
这次爬取的网页链接:http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html
该网页中的表格描述2019年国内高校的排名情况,网页是静态网页。

 

我认为比较困难的点和需要注意的点:

1. 如何获取想要的标签中的内容;
2. 对于多个同样属性的标签如何迭代的获取;
3. 存储使用的数据结构

 
 

第一个爬虫

 

网页逻辑

首先,要看网页中的逻辑是怎样的。
我的Python爬虫笔记(一)——静态网页_第1张图片
网页中表示的是整个表格,是表中的一行,是每一行中的一小格。我们需要从表格中的每一行的每一格获取数据,即表格-行-格。对应于fill_univ_list(url) 方法中的for循环,先找到表,再找每一行,将每一行中需要的前三个格子的数据以列表的形式存储在ulist列表中,ulist是一个二维列表,ulist中每一个元素指代了表格中每一行的前三个格子里的数据。

 
 

代码逻辑

该代码将爬取过程中的功能分放在三个方法中,便于程序的理解。
第一个方法get_html_text(url) 使用request库获取网页并将网页转为可处理的文本;
第二个方法fill_univ_list(url) 通过创建BeautifulSoup对象实现对前一步得到的文本中所有html标签的处理,并获得一个存储学校信息的列表
第三个方法print_univ_list(ulist, num) 输出格式规范化,并打印。

以下是完整的代码(这个一定要自己写一遍!不然很难学会)

'''
爬取网页中特定的静态数据
'''

import requests
from bs4 import BeautifulSoup
import bs4


def get_html_text(url):
    '''
    从html中获取网页的文本
    :param url: 网页链接
    :return: request转化的网页的文本
    '''
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        print("产生异常")


def fill_univ_list(url):
    '''
    将网页中需要的数据填充到ulist列表中,使用BeautifulSoup。
    ulist是二维列表
    :param url: 网页链接
    :return: 包含需要的网页信息的列表,是一个二维列表
    '''
    ulist = []
    soup = BeautifulSoup(get_html_text(url), 'html.parser')
    # 对于tbody标签的所有孩子
    for tr in soup.find('tbody').children:  
    # 如果tr是tag类型,tr相当于网页表格中的每一行
        if isinstance(tr, bs4.element.Tag):  
        	# 获取tr中所有td标签(tds是包含所有td标签的列表)
            tds = tr('td')  
            # 只需要前三个属性,即排名、学校、省份
            ulist.append([tds[0].string, tds[1].string, tds[2].string])  
    return ulist


def print_univ_list(ulist, num):
	# 输出格式,{3}指format第三种空格表示方式,即汉语???
    tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"  
    # 输出的抬头
    print(tplt.format("排名", "学校", "省份", chr(12288)))  
    # 输出前num个
    for i in range(num):  
    	# 按照格式输出
        print(tplt.format(ulist[i][0], ulist[i][1], ulist[i][2], chr(12288)))  


url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html'
uinfo = fill_univ_list(url)
print_univ_list(uinfo, 20)

 
 

第二个爬虫

然后我根据以上的取数据的逻辑我又爬取了一个静态网页,网页链接:https://python123.io/index/colleges。这个网页的标签记录了很多学校的名字,通过爬取获得这些学校并打印出来。
 

网页逻辑

先是看网页的逻辑:
我的Python爬虫笔记(一)——静态网页_第2张图片
 

代码逻辑

然后写爬虫的代码:

import requests
from bs4 import BeautifulSoup
import bs4


def get_html_text(url):
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        print("产生异常")


def fill_univ_list(url):
    ulist = []
    soup = BeautifulSoup(get_html_text(url), 'html.parser')
    # div标签属性为columns is-multiline的所有孩子标签
    for info in soup.find('div', 'columns is-multiline').children:  
        if isinstance(info, bs4.element.Tag):
            univ = info('span')[0].string
            ulist.append(univ)
    return ulist


def print_univ_list(ulist, num):
    print("{}".format("学校"))  # 输出的抬头
    for i in range(num):  # 输出前num个
        print("{}".format(ulist[i]))  # 按照格式输出


url = 'https://python123.io/index/colleges'
uinfo = fill_univ_list(url)
print_univ_list(uinfo, 20)

你可能感兴趣的:(语言)