数据采集第一次作业
数据采集第一次作业
作业①:requests+BeautifulSoup爬取软科中国大学排名
1)实验实现
实验说明:使用requests库获取网页源码,BeautifulSoup解析HTML,定向提取排名、学校名称、省市、学校类型、总分信息并格式化输出。
import requests
from bs4 import BeautifulSoup
def get_page_html(url):
"""获取网页源码,带请求头防止反爬"""
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"
}
try:
resp = requests.get(url, headers=headers, timeout=15)
resp.raise_for_status()
resp.encoding = "utf-8"
return resp.text
except Exception as e:
print(f"网页请求失败:{e}")
return ""
def parse_university_rank(html):
"""使用BeautifulSoup解析大学排名数据"""
soup = BeautifulSoup(html, "html.parser")
table_rows = soup.select("table.rk-table tbody tr")
result_list = []
for row in table_rows:
tds = row.find_all("td")
if len(tds) < 5:
continue
rank = tds[0].get_text(strip=True)
school_name = tds[1].get_text(strip=True)
city = tds[2].get_text(strip=True)
school_type = tds[3].get_text(strip=True)
score = tds[4].get_text(strip=True)
result_list.append([rank, school_name, city, school_type, score])
return result_list
def print_rank_table(data):
"""格式化打印表格"""
print(f"{'排名':<6}{'学校名称':<12}{'省市':<8}{'学校类型':<10}{'总分':<8}")
for item in data:
print(f"{item[0]:<6}{item[1]:<12}{item[2]:<8}{item[3]:<10}{item[4]:<8}")
if __name__ == "__main__":
target_url = "[https://www.shanghairanking.cn/rankings/bcur/2020](https://www.shanghairanking.cn/rankings/bcur/2020)"
html_text = get_page_html(target_url)
rank_data = parse_university_rank(html_text)
print_rank_table(rank_data)

2)心得体会
本次实验我学习了BeautifulSoup解析网页的基础流程。首先通过requests带上UA请求头模拟浏览器访问网页,拿到HTML文本,再通过css选择器定位表格行标签,提取每个单元格文本。我认识到网页结构的稳定性对爬虫很重要,如果网站修改了table的class,选择器就会失效。同时学会了设置超时、捕获异常,避免程序直接崩溃。对比正则,BeautifulSoup更加直观,适合结构化的表格数据提取,也理解了定向爬虫就是只抓取我们需要的特定字段,而不是下载整个页面全部内容。
作业②:requests+re正则 商城书包比价爬虫
1)实验实现
实验说明:利用requests获取搜索页面源码,使用正则表达式re库匹配商品名称和价格,实现比价定向爬虫,按序号、价格、商品名输出。
import requests
import re
def get_html(url):
"""获取网页源码"""
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"
}
try:
resp = requests.get(url, headers=headers, timeout=15)
resp.raise_for_status()
# ========== 修改这里!当当搜索页是gbk编码,不是utf-8 ==========
resp.encoding = "gbk"
return resp.text
except Exception as e:
print(f"请求异常:{e}")
return ""
def parse_goods_by_re(html):
"""正则表达式提取商品名称和价格,适配当当页面标签"""
pattern = re.compile(
r'<span class="price_n">¥([\d\.]+)</span>.*?<p class="name" name="title"[^>]*>.*?title="([^"]+)"',
re.DOTALL
)
goods_result = re.findall(pattern, html)
return goods_result
def print_goods_table(goods_list):
"""打印商品表格"""
print(f"{'序号':<6}{'价格':<8}{'商品名'}")
for idx, (price, name) in enumerate(goods_list, start=1):
print(f"{idx:<6}{price:<8}{name}")
if __name__ == "__main__":
search_url = "https://search.dangdang.com/?key=书包"
html_content = get_html(search_url)
goods_data = parse_goods_by_re(html_content)
print_goods_table(goods_data)


2)心得体会
这个实验使用正则re库来提取数据,和上一个BeautifulSoup形成对比。正则适合简单的文本匹配,不需要解析完整DOM树,但是正则表达式可读性差,写的时候很容易出错,一点符号写错就匹配不到内容。商城页面的HTML结构复杂、换行多,需要加上re.DOTALL让.匹配换行。我也发现电商网站反爬机制更强,频繁访问容易被限制。通过这次实验,我明白了两种解析方式的适用场景:结构清晰的网页优先BS,简单文本片段提取可以用正则,同时爬虫一定要遵守robots协议,仅用于课程学习。
作业③:网页图片批量下载爬虫
1)实验实现
实验说明:爬取福大新闻网页,筛选jpg、jpeg、png格式图片,自动创建文件夹,拼接图片完整链接并保存到本地。
import requests
from bs4 import BeautifulSoup
import os
from urllib.parse import urljoin
def download_images(url, save_dir="download_img"):
"""
爬取网页所有jpg/jpeg/png图片,保存到指定文件夹
:param url: 目标网页
:param save_dir: 图片保存目录
"""
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"
}
# 创建保存文件夹
if not os.path.exists(save_dir):
os.mkdir(save_dir)
try:
resp = requests.get(url, headers=headers, timeout=15)
resp.raise_for_status()
resp.encoding = "utf-8"
soup = BeautifulSoup(resp.text, "html.parser")
img_tags = soup.find_all("img")
count = 0
for img in img_tags:
src = img.get("src")
if not src:
continue
# 拼接完整图片url
full_img_url = urljoin(url, src)
# 判断后缀,只保存jpg,jpeg,png
suffix = full_img_url.lower()
if suffix.endswith((".jpg", ".jpeg", ".png")):
try:
img_resp = requests.get(full_img_url, headers=headers, timeout=10)
img_resp.raise_for_status()
# 生成文件名
filename = os.path.basename(full_img_url).split("?")[0]
save_path = os.path.join(save_dir, filename)
with open(save_path, "wb") as f:
f.write(img_resp.content)
count += 1
print(f"已保存第{count}张图片:{filename}")
except Exception as e:
print(f"图片下载失败 {full_img_url}, err:{e}")
print(f"任务完成!一共下载 {count} 张图片,保存在【{save_dir}】文件夹")
except Exception as e:
print(f"页面访问失败:{e}")
if __name__ == "__main__":
target_page = "[https://news.fzu.edu.cn/yxfd.htm](https://news.fzu.edu.cn/yxfd.htm)"
download_images(target_page)

2)心得体会
本次图片爬虫实验,重点理解了相对路径和绝对路径的问题,很多img的src是相对地址,需要urljoin拼接成完整链接才能访问。图片是二进制数据,写入文件时要使用wb二进制模式。同时增加后缀过滤,只保留jpg、png图片,过滤gif等不需要的资源。实验中遇到部分图片链接失效、防盗链导致下载失败的情况,通过异常捕获跳过失败链接保证程序继续运行。我掌握了文件目录创建、二进制资源下载的思路,也意识到网页图片防盗链、跨域是爬虫经常遇到的难点。
总结
本次爬虫三个实验分别练习了BeautifulSoup解析表格、re正则匹配文本、二进制图片资源下载,覆盖了定向爬虫的常见场景,熟悉了requests库的使用方法,理解爬虫的基本原理,同时树立了合规爬虫的意识。
浙公网安备 33010602011771号