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

码云链接:数据采集与融合技术-码云
代码链接:gitee代码链接

作业①:

(1)实验过程

代码实现
import urllib.request
from bs4 import BeautifulSoup

# 目标网址
url = "http://www.shanghairanking.cn/rankings/bcur/2020"  

# 使用urllib.request获取网页内容
response = urllib.request.urlopen(url)
html_content = response.read()

# 使用BeautifulSoup解析HTML
soup = BeautifulSoup(html_content, 'html.parser')
# 找到包含排名信息的表格
table = soup.find('table')

# 打印标题
print("排名    学校名称    省市    学校类型  总分")

# 找到所有的行(tr元素)
rows = table.find_all('tr')

# 跳过表头,从第二行开始遍历
for row in rows[1:]:
    # 找到行中的所有单元格(td元素)
    cols = row.find_all('td')
    if cols:
        # 提取排名、学校名称、省市、学校类型、总分
        rank = cols[0].text.strip()
        school_name = cols[1].text.strip()
        province = cols[2].text.strip()
        type_of_university = cols[3].text.strip()
        total_score = cols[4].text.strip()
        
        # 打印信息
        print(f"{rank}                  {school_name}      {province}    {type_of_university}           {total_score}")
结果展示

image

(2)心得体会

通过本次作业,我学习到了如何使用BeautifulSoup库来解析HTML文档。这涉及到如何定位HTML中的特定元素,提取所需数据。掌握HTML解析对于数据抓取、网页自动化测试等领域至关重要。而且,我可以将所学知识应用到实际问题中,加深了理解;而且我发现在实际操作中,可能会遇到预料之外的问题,这锻炼了我解决问题的能力。

作业②:

  • 要求:用requests和re库方法设计某个商城(自已选择)商品比价定向爬虫,爬取该商城,以关键词“书包”搜索页面的数据,爬取商品名称和价格。
  • 输出信息:
    image

(1)实验过程

代码实现
import urllib.request
from bs4 import UnicodeDammit, BeautifulSoup
import re
import urllib.parse
import sqlite3

class ProductDB:
    def openDB(self):
        self.con = sqlite3.connect(r"D:\\shujuwajue\\products.db")
        self.cursor = self.con.cursor()
        try:
            self.cursor.execute("CREATE TABLE IF NOT EXISTS products (id INTEGER PRIMARY KEY AUTOINCREMENT, name varchar(64), price varchar(64))")
        except:
            self.cursor.execute("DELETE FROM products")

    def closeDB(self):
        self.con.commit()
        self.con.close()

    def insert(self, name, price):
        try:
            self.cursor.execute("INSERT INTO products (name, price) VALUES (?,?)", (name, price))
        except Exception as err:
            print(err)

    def show(self):
        self.cursor.execute("SELECT * FROM products")
        rows = self.cursor.fetchall()
        print("%-16s%-32s%-16s" % ("id", "name", "price"))
        for row in rows:
            print("%-16s%-32s%-16s" % (row[0], row[1], row[2]))

db = ProductDB()
db.openDB()
keyword = "书包"
url = f"http://search.dangdang.com/?key={urllib.parse.quote(keyword)}&act=input&page_index=1" 

request = urllib.request.Request(url)
response = urllib.request.urlopen(request)
html = response.read()

# 使用 UnicodeDammit 来确定编码并转换为 Unicode
dammit = UnicodeDammit(html, ["utf-8"])
data = dammit.unicode_markup

# 编写正则表达式来提取商品名称和价格
pattern = re.compile(r'<a[^>]*title="([^"]*)"[^>]*>.*?<span class="price_n">([^<]+)</span>', re.S)
matches = pattern.findall(data)
# 打印结果
for title, price in matches:
    print("价格:", price.strip())
    print("商品名称:", title.strip())
    print("------")
    db.insert(title, price)

db.show()
db.closeDB()
代码结果

image

(2)心得体会

通过这次作业,我加深了对正则表达式的理解和应用,这对于文本处理非常有用。同时,这个任务提高了我的编程实践能力,让我更加熟悉Python语言。而且,通过使用requests库,我学会了如何发送HTTP请求,包括GET和POST请求。总的来说,这次的作业令我收获颇丰,不仅提高我的编程能力也提高了我解决问题的能力。

作业③:

(1)实验过程

代码实现
import os
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin

# 指定要爬取的网页
url = "https://news.fzu.edu.cn/yxfd.htm"

# 创建文件夹以保存图片,使用绝对路径
folder_name = r"D:\shujuwajue\shijian1.3"
if not os.path.exists(folder_name):
    os.makedirs(folder_name)

# 获取网页内容
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')

# 查找所有JPEG和JPG文件
for img in soup.find_all('img'):
    img_url = img.get('src')
    if img_url and (img_url.endswith('.jpg') or img_url.endswith('.jpeg')):
        # 获取完整的图片URL
        full_url = urljoin(url, img_url)
        
        # 下载图片
        try:
            headers = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
            }
            img_response = requests.get(full_url, headers=headers, verify=False)
            img_name = os.path.join(folder_name, os.path.basename(full_url))
            with open(img_name, 'wb') as f:
                f.write(img_response.content)
            print(f"Downloaded: {img_name}")
        except Exception as e:
            print(f"Failed to download {full_url}: {e}")
代码结果

image
只有三张图片满足JPEG和JPG格式,符合实验要求。其他都为PNG格式,不符合实验要求。

(2)心得体会

通过这次作业我学会了如何确保下载的图片数据是完整的,通过添加异常处理来捕获和处理可能发生的错误。在实现过程中,我遇到了如何处理相对路径的图片链接的挑战。通过使用urljoin函数,我成功地将相对路径转换为绝对路径,确保了图片链接的有效性。