数据采集与融合技术实践第一次作业

作业1

## 代码以及相关图片

点击查看代码
import requests
from bs4 import BeautifulSoup

#原本想把第一个页面设为base_url,之后以此为根据跳转其他页面的(获取排名31之后的学校信息),可惜未能做到
base_url = 'http://www.shanghairanking.cn/rankings/bcur/2020'
response = requests.get(base_url)#用get方法发出请求
response.encoding = 'utf-8'#此处是为了避免乱码现象

# 把页面信息变成bs4对象
page = BeautifulSoup(response.text, 'html.parser')
#爬取学校排名所在的表格,并存储在table中
table = page.find('table', class_='rk-table')
tbody = table.find('tbody')
#取出表格中每一行的信息,存储在trs中
trs = tbody.find_all('tr')


result = []
result_num = 0
#遍历表格的每一行
for tr in trs:
    result.append([])

    j = 1
    i = 1
    #遍历一行中每一个单元格
    for td in tr.find_all('td'):
        if j > 5:
            break
        if j == 1:
            ranking = 'ranking top' + str(i)
            i += 1
            #把排名号码存储在结果列表里
            result[result_num].append(tr.find('div', class_='ranking').text.strip())
        elif j == 2:
            #把学校名称存储在结果列表里
            result[result_num].append(tr.find('span', class_='name-cn').text.strip())
        elif j == 3:
            # 把学校所在地存储在结果列表里
            result[result_num].append(td.text.strip())
        elif j == 4:
            # 把学校类型存储在结果列表里
            result[result_num].append(td.text.strip())
        elif j == 5:
            #把学校总分存储在结果列表里
            result[result_num].append(td.text.strip())
        j += 1
    result_num += 1

#通过列表的方式输出结果
for num in result:
    print(num)

代码运行截图:

image

## 作业心得体会
通过这次作业我了解到了很多前端的知识,明白了网上那么多好看的网页是怎么制作出来的,以及我还学到了爬取网页信息最基本的知识,明白了bs4模块的工作原理。

作业2

## 代码以及相关图片

点击查看代码
import requests
import re
#这里是当当网的url
url = "https://search.dangdang.com/?key=%CA%E9%B0%FC&act=input"

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0'
}
resp = requests.get(url,headers=headers)

#为正则表达式创建一个容器
pattern = re.compile(r'<li ddt-pit.*?<a title="(?P<name>.*?)".*?<span class="price_n">(?P<price>.*?)</span>',re.S)
#html是网页源代码
html = resp.text
#创建一个迭代器
result = re.finditer(pattern,html)
#创建一个名为goods的列表,用于存放商品的名称和对应的价格
goods = []
i = 0
#遍历迭代器,并把爬取到的商品信息放进goods列表里
for match in result:
    goods.append([match.group('name')])
    goods[i].append(match.group('price')[5:])
    i += 1
#一行行地输出商品信息
for good in goods:
    print(good)

代码输出结果:
image

## 作业心得体会
通过这一次的作业,我学到了re模块和正则表达式的用法,并且可以独立用正则表达式爬取网页信息,但是通过这次作业我发现很多网站的反爬机制真的很强大,很难爬取到,因此我们要学习的爬虫相关知识还是有很多。

作业3

## 代码以及相关图片

点击查看代码
import os
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin

# 导入福州大学新闻网相关网页的url
url = "https://news.fzu.edu.cn/yxfd.htm"
# 设置图片保存目录
save_dir = "homework1.3.images"

# 判断图片保存目录是否存在,若不存在就要自己创建
if not os.path.exists(save_dir):
    os.makedirs(save_dir)

resp = requests.get(url) # 网页未设置反爬手段,因此不需要headers
resp.encoding = 'utf-8' # 此处的编码格式若不设置会出现乱码
html = resp.text # html中保存网页代码
# print(html) # 这里把try的步骤改成了直接测试
page = BeautifulSoup(html, 'html.parser')   #把网页内容转换成bs4对象

imgs = page.find_all('img') # 获取页面中所有的图片,并存在imgs中

count = 0
# 一个个遍历爬取到的图片
for img in imgs:
    img_src = img.get('src') #获取图片连接
    if not img_src: # 若遇到没有连接的图片直接跳过
        continue
    # 把相对路径转换为绝对路径
    full_img_src = urljoin(url, img_src)

    # 检查图片格式是否为JPEG、JPG或PNG,如果不是直接跳过
    if not (full_img_src.lower().endswith(('.jpg', '.jpeg', '.png'))):
        continue

    # 开始下载图片
    img_response = requests.get(full_img_src, timeout=10)

    # 获取图片扩展名
    if full_img_src.lower().endswith('.png'):
        ext = '.png'
    else:  # jpg或jpeg
        ext = '.jpg'

    # 保存图片
    img_name = f"image_{count}{ext}"
    img_path = os.path.join(save_dir, img_name)
    count += 1 # 计算总共保存了多少张图片

    with open(img_path, 'wb') as f:
        f.write(img_response.content)

    print(f"已保存: {img_name} ({full_img_src})")

print(f'总共保存了{count}张图片')

运行结果:
image

## 作业心得体会
通过这一次的作业我学会了从网上爬取图片的方法以及原理。

posted @ 2025-10-26 21:16  bishanbu  阅读(0)  评论(0)    收藏  举报