数据采集第一次作业

本次作业使用 Python 完成三个定向采集任务。运行环境为 Python 3.10 及以上版本,依赖库如下。

pip install requests beautifulsoup4

作业① requests+BeautifulSoup爬取软科2020大学排名数据采集

  目标网页:软科2020中国大学排名页面。本程序解析网页HTML中的表格,提取排名、学校名称、省市、学校类型、总分信息,只抓取当前页面表格数据,不进行翻页、不递归访问其他链接。
  程序用BeautifulSoup定位网页table标签,遍历每一行tr,再提取单元格td内文本。设置request请求头模拟浏览器访问,解决网页反爬拦截问题。输出格式化打印成表格样式,方便直观查看排名信息。

(1)代码呈现与运行结果

完整代码: university_rank_spider.py 

from bs4 import BeautifulSoup
def crawl_university_rank():
    url = "http://www.shanghairanking.cn/rankings/bcur/2020"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
    }
    resp = requests.get(url, headers=headers)
    resp.encoding = resp.apparent_encoding
    soup = BeautifulSoup(resp.text, "html.parser")
    table = soup.find("table")
    rows = table.find_all("tr")[1:] # 跳过表头
    print(f"{'排名':<6}{'学校名称':<12}{'省市':<6}{'学校类型':<8}{'总分':<8}")
    for row in rows:
        tds = row.find_all("td")
        if len(tds)>=5:
            rank = tds[0].get_text(strip=True)
            name = tds[1].get_text(strip=True)
            province = tds[2].get_text(strip=True)
            school_type = tds[3].get_text(strip=True)
            score = tds[4].get_text(strip=True)
            print(f"{rank:<6}{name:<12}{province:<6}{school_type:<8}{score:<8}")
if __name__ == '__main__':
    crawl_university_rank()

屏幕截图 2026-10-11 153200

屏幕截图 2026-10-11 153210

(2)心得体会

  作业1,我使用requests和BeautifulSoup来爬取大学排名网页。最开始不太熟悉网页标签的定位,在提取表格数据的时候反复调试,才把排名、学校名称、省市这些信息正确取出来。
  通过这次练习,我学会了查看网页源码,理解HTML表格结构,掌握了BeautifulSoup查找标签的方法。也体会到爬虫需要模拟浏览器请求,加上请求头才能正常拿到网页内容。这次实践让我对网页解析有了直观认识。

作业②基于requests+re正则的当当书包商品比价爬虫

  目标网页:当当网书包搜索结果页面。本程序下载当前搜索页HTML源码,使用正则表达式提取商品名称与价格,不使用BeautifulSoup解析页面。
  程序使用re正则匹配页面标签里的商品标题和价格文本,网页编码设置为gbk避免中文乱码。提取到的价格为字符串类型,如需价格排序还需要从字符串转换为数值后再排序。正则表达式在页面结构固定时比较直接,但依赖网页标签,网站改版时匹配就可能失效,所以“没有匹配结果”应当当作需要检查的问题,不是“商城没有书包”。

(1)代码呈现与运行结果

完整代码: bag_price_spider.py  

import requests
import re
def crawl_dangdang_bag():
    url = "https://search.dangdang.com/?key=书包"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
    }
    resp = requests.get(url, headers=headers)
    resp.encoding = "gbk" # 当当网页编码是gbk  
    html = resp.text
    # 正则1:提取商品名称
    pattern_name = re.compile(r'<a title="(.*?)" href', re.S)
    # 正则2:提取价格,匹配 &yen;数字.数字
    pattern_price = re.compile(r'<span class="price_n">&yen;([\d.]+)</span>', re.S)
    names = pattern_name.findall(html)
    prices = pattern_price.findall(html)
    print(f"{'序号':<5}{'价格':<8}{'商品名'}")
    # 取前10条结果,避免多余数据
    for i in range(min(len(names), len(prices), 10)):
        print(f"{i+1:<5}{prices[i]:<8}{names[i]}")
if __name__ == '__main__':
    crawl_dangdang_bag()

屏幕截图 2026-10-11 155754

(2)心得体会

  作业2要求只用requests和正则re来爬取当当网商品,和上一题的思路完全不一样。一开始写正则表达式很头疼,匹配商品名称和价格的时候,符号写错就提取不到数据,还踩了网页编码的坑,当当网页是gbk编码,不设置就会出现中文乱码。
  反复修改正则模板后,成功抓取到书包的名称与价格。我明白了正则适合直接对原始文本匹配,两种爬虫方式各有适用场景。

作业③爬取福大新闻页所有图片,保存到本地文件夹

  目标网页:福州大学新闻网影像福大栏目。本下载当前页HTML直接引用的JPG、JPEG和PNG图片,包括新闻缩略图、标志和图标;不进入新闻详情页,不递归抓取外部CSS,也不运行网页脚本。
  程序用BeautifulSoup提取图片地址,处理相对路径,用 urljoin() 补全完整链接,再对URL去重。判断格式时只检查URL的路径部分,所以 xxx.png?e=.png 不会因为查询参数而漏掉。保存采用二进制写入,并检查PNG/JPEG文件头,避免将错误页面误存成图片。

(1)代码呈现与运行结果

完整代码: image_download_spider.py   

import requests
from bs4 import BeautifulSoup
import os
def crawl_img():
    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/114.0.0.0 Safari/537.36"
    } # 创建保存图片文件夹
    folder = "fzu_images"
    if not os.path.exists(folder):
        os.mkdir(folder)
    resp = requests.get(url, headers=headers)
    resp.encoding = resp.apparent_encoding
    soup = BeautifulSoup(resp.text, "html.parser")
    imgs = soup.find_all("img")
    count = 0
    for img in imgs:
        src = img.get("src")
        if not src:
            continue     # 补全相对url
        if src.startswith("/"):
            src = "https://news.fzu.edu.cn" + src  # 判断图片后缀
        if src.endswith((".jpg",".jpeg",".png")):
            try:
                res = requests.get(src, headers=headers, timeout=5)
                save_path = os.path.join(folder, f"img_{count}.jpg")
                with open(save_path,"wb") as f:
                    f.write(res.content)
                print(f"已保存:{src} -> {save_path}")
                count += 1
            except Exception as e:
                print(f"图片下载失败:{src}")
    print(f"全部完成,共下载{count}张图片,保存在{folder}文件夹")
if __name__ == '__main__':
    crawl_img()

屏幕截图 2026-10-11 161211

(2)心得体会

  批量下载网页图片,难点在于图片链接有相对路径,需要手动拼接完整网址,还要判断图片后缀,只保存jpg和png格式。
  代码调试的时候遇到变量名错误导致程序崩溃,修好之后能自动新建文件夹并保存图片。
  这次实践让我学会处理图片二进制数据,同时意识到爬虫要做好异常捕获,防止个别图片链接失效直接终止程序。

posted @ 2026-10-11 16:34  WANGHAO2026  阅读(10)  评论(0)    收藏  举报