python爬虫笔记(五)网络爬虫之提取——实例:中国大学排名爬虫

1. 中国大学排名定向爬虫

网站:http://www.zuihaodaxue.com/zuihaodaxuepaiming2016.html

查看源代码,发现信息直接写在HTML里的,即该定向爬虫可以实现

2. 程序的结构设计

2. 实例编写

2.1 代码总框架

# -*- coding: utf-8 -*-
"""
Created on Thu Jan 30 01:27:38 2020

@author: douzi
"""

import requests
from bs4 import BeautifulSoup

# 将url转换成html
def getHTMLText(url):
        return ""

# 提取html信息中关键的数据,并提取到列表中
def fillUnivList(ulist, html):
    pass    

def printUnivList(ulist, num):  # 打印num所大学信息
    print("Suc" + str(num))
    
def main():
    # 大学信息放到列表中
    uinfo = []       
    # 大学排名的url
    url = "http://www.zuihaodaxue.com/zuihaodaxuepaiming2016.html"
    # 将url转换成html
    html = getHTMLText(url)   
    fillUnivList(uinfo, html)
    printUnivList(uinfo, 20)    # 20 univs
    
if __name__ == '__main__':
    main()
    

2.2 将url转换成html

import requests
from bs4 import BeautifulSoup

def getHTMLText(url):
    try:
        headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"}
        r = requests.get(url, timeout=30, headers=headers)
        r.raise_for_status()              # 产生异常信息
        r.encoding = r.apparent_encoding  # 修改编码
        return r.text   # 返回网页信息
    except:
        return ""

2.3 提取html信息中关键的数据,并提取到列表中

(1)观察源代码

  • 所有大学信息被封装在表格中,这个表格标签叫 tbody
  • 在 tbody 中,每个大学信息又被封装在 tr 中,每个 tr 标签,包含所有当前大学的所有信息
  • 每个 tr 中信息,又被 td 所包围

(2)遍历tbody中类型为tr的标签,查询tr标签中的td标签,所对应的字符串信息

# 提取html信息中关键的数据,并提取到列表中
def fillUnivList(ulist, html):
    soup = BeautifulSoup(html, "html.parser")
    # 所有大学信息被封装在表格中,这个表格标签叫tbody
    # 在tbody中,每个大学信息又被封装在tr中,每个tr标签,包含所有当前大学的所有信息
    # 每个tr中信息,又被td所包围
    # 1. 遍历tbody,tr即每个大学的信息
    for tr in soup.find('tbody').children:
        # 过滤非标签类型的其他数据
        if isinstance(tr, bs4.element.Tag):
            tds = tr('td')    # 查询tr中的 td
            ulist.append([tds[0].string, tds[1].string, tds[3].string])
    

注意:用法 a = soup("xxx"), a[0].string

2.4 格式化输出

def printUnivList(ulist, num):
    print("{:^10}\t{:^6}\t{:^10}".format("排名", "学校名称", "总分"))
    for i in range(num):
        u = ulist[i]
        print("{:^10}\t{:^6}\t{:^10}".format(u[0], u[1], u[2]))    

3. 全部代码

# -*- coding: utf-8 -*-
"""
Created on Thu Jan 30 01:27:38 2020

@author: douzi
"""

import requests
from bs4 import BeautifulSoup
import bs4

def getHTMLText(url):
    try:
        headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"}
        r = requests.get(url, timeout=30, headers=headers)
        r.raise_for_status()              # 产生异常信息
        r.encoding = r.apparent_encoding  # 修改编码
        return r.text   # 返回网页信息
    except:
        return ""

# 提取html信息中关键的数据,并提取到列表中
def fillUnivList(ulist, html):
    soup = BeautifulSoup(html, "html.parser")
    # 所有大学信息被封装在表格中,这个表格标签叫tbody
    # 在tbody中,每个大学信息又被封装在tr中,每个tr标签,包含所有当前大学的所有信息
    # 每个tr中信息,又被td所包围
    # 1. 遍历tbody,tr即每个大学的信息
    for tr in soup.find('tbody').children:
        # 过滤非标签类型的其他数据
        if isinstance(tr, bs4.element.Tag):
            tds = tr('td')    # 查询tr中的 td
            ulist.append([tds[0].string, tds[1].string, tds[3].string])
            
    
def printUnivList(ulist, num):
    print("{:^10}\t{:^6}\t{:^10}".format("排名", "学校名称", "总分"))
    for i in range(num):
        u = ulist[i]
        print("{:^10}\t{:^6}\t{:^10}".format(u[0], u[1], u[2]))    
    
    
def main():
    # 大学信息放到列表中
    uinfo = []       
    # 大学排名的url
    url = "http://www.zuihaodaxue.com/zuihaodaxuepaiming2016.html"
    # 将url转换成html
    html = getHTMLText(url)   
    fillUnivList(uinfo, html)
    printUnivList(uinfo, 20)    # 20 univs
    
if __name__ == '__main__':
    main()
    

猜你喜欢

转载自www.cnblogs.com/douzujun/p/12241972.html