102402119陈封第一次作业

作业① 软科中国大学排名定向爬虫

1)软科大学排名爬虫实验

import requests
from bs4 import BeautifulSoup
def get_page_html(target_url):
    """
    请求网页,获取网页源代码
    :param target_url: 目标网页地址
    :return: 网页的html文本
    """
    # 请求头,模拟浏览器访问,防止被服务器拦截
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
    }
    # 发送get请求
    response = requests.get(target_url, headers=headers)
   
    response.encoding = "utf-8"
    return response.text
def parse_university_data():
    """
    解析软科2020中国大学排名数据
    :return: 解析完成的大学排名列表,每一项是[排名,学校名称,省市,学校类型,总分]
    """
    page_url = "http://www.shanghairanking.cn/rankings/bcur/2020"
    # 软科数据接口,页面是vue动态渲染,真实数据从这个接口获取
    data_api_url = "https://www.shanghairanking.cn/api/pub/v1/bcur?bcur_type=11&year=2020"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
    }
    # 获取页面html
    html_text = get_page_html(page_url)
    soup = BeautifulSoup(html_text, "html.parser")
    # 请求json接口获取排名数据
    api_response = requests.get(data_api_url, headers=headers)
    json_data = api_response.json()
    ranking_result = []
    # 遍历每一条大学数据
    for item in json_data["data"]["rankings"]:
        rank = item["ranking"]           # 排名
        school_name = item["univNameCn"]  # 学校中文名称
        province = item["province"]       # 省市
        school_type = item["univCategory"]
        total_score = item["score"]       # 总分
        ranking_result.append([rank, school_name, province, school_type, total_score])
    return ranking_result
def print_ranking_table(ranking_list):
    """
    在控制台格式化打印排名表格
    :param ranking_list: 大学排名数据列表
    """
    
    print(f"{'排名':<6}{'学校名称':<12}{'省市':<8}{'学校类型':<10}{'总分':<8}")
    print("-" * 50)
    # 循环输出每一行学校信息
    for row in ranking_list:
        print(f"{row[0]:<6}{row[1]:<12}{row[2]:<8}{row[3]:<10}{row[4]:<8}")
if __name__ == "__main__":
    university_rank_data = parse_university_data()
    print_ranking_table(university_rank_data)

1

2

2)心得体会

本次爬虫实验使用 requests 与 BeautifulSoup 库爬取软科中国大学排名数据,让我掌握了网页请求与 HTML 解析的基础流程。通过分析网页标签结构,提取排名、院校、省市等信息,我理解了静态网页数据抓取的原理,也学会模拟浏览器请求来完成页面访问。同时我认识到爬虫技术需要遵守网站规则与网络法规,不能恶意抓取。这次实践将 Python 网络爬虫的理论知识落地,提升了网页分析与数据提取的动手能力,也树立了合法合规使用爬虫技术的意识。

作业② 商城书包比价爬虫(requests+re)

1)商城商品比价爬虫实验

import requests
import re

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}

url = "https://search.dangdang.com/?key=书包"

try:
    response = requests.get(url, headers=headers, timeout=10)
    response.raise_for_status()
    response.encoding = "gbk"
    html = response.text

    # 正则表达式:匹配商品名称title和价格
    pattern = re.compile(r'<p class="name".*?title="(.*?)".*?<span class="price_n">&yen;(.*?)</span>', re.S)
    result = pattern.findall(html)

    print(f"{'序号':<6}{'价格':<8}{'商品名'}")
    for idx, (name, price) in enumerate(result, start=1):
        print(f"{idx:<6}{price:<8}{name}")

except Exception as e:
    print("爬取失败:", e)

3

4

2)心得体会

本次实验利用 requests 获取当当网搜索页面源码,结合 re 正则表达式爬取 “书包” 的商品名称与价格,实现简单的商品比价爬虫。我学会了编写正则表达式对网页文本进行匹配捕获,掌握了基于字符串的网页数据提取方法。和之前 BeautifulSoup 解析 DOM 树的方式相比,正则无需构建文档树,但是容错性较差,页面标签轻微变化就会造成匹配失败。同时我也了解到爬虫需要配置请求头模拟浏览器访问,防止请求被服务器拦截。本次实践让我体会到爬虫在商品比价场景的实际用途,也再次认识到爬虫技术必须遵守网站规则,合理控制访问频率,合法采集公开信息,提升了正则编写与网页调试的动手能力。

作业③ 网页图片批量爬取爬虫

1)网页图片下载爬虫实验

import requests
from bs4 import BeautifulSoup
import os
from urllib.parse import urljoin

url = "https://news.fzu.edu.cn/yxfd.htm"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}

# 创建保存图片的文件夹
save_dir = "fzu_images"
if not os.path.exists(save_dir):
    os.mkdir(save_dir)

try:
    resp = requests.get(url, headers=headers, timeout=10)
    resp.raise_for_status()
    resp.encoding = "utf-8"
    soup = BeautifulSoup(resp.text, "html.parser")

    # 找到所有img标签
    img_tags = soup.find_all("img")
    count = 0
    for img in img_tags:
        img_src = img.get("src")
        if not img_src:
            continue
        # 拼接成完整url
        full_img_url = urljoin(url, img_src)
        # 判断后缀 jpg/jpeg/png
        if full_img_url.lower().endswith((".jpg", ".jpeg", ".png")):
            count += 1
            # 获取图片二进制数据
            img_resp = requests.get(full_img_url, headers=headers, timeout=10)
            # 保存文件
            file_name = os.path.join(save_dir, f"img_{count}{os.path.splitext(full_img_url)[1]}")
            with open(file_name, "wb") as f:
                f.write(img_resp.content)
            print(f"已保存:{file_name}")
    print(f"全部下载完成,共下载{count}张图片")

except Exception as e:
    print("爬取异常:", e)

5

6

2)心得体会

本次图片爬虫实验,使用 requests 和 BeautifulSoup 爬取福州大学新闻网页中的 jpg、jpeg、png 图片并保存到本地指定文件夹。我学会解析网页 img 标签,利用 urljoin 将图片相对地址转为完整链接,以二进制流的形式下载图片;同时掌握了通过绝对路径创建文件夹、筛选图片后缀的方法。实验让我理解网页图片链接分为相对路径与绝对路径,若不做路径拼接处理会出现图片访问失败的问题。

posted @ 2026-10-16 23:54  罗cf  阅读(3)  评论(0)    收藏  举报