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

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

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/2024DataCollectionandFusiontechnology
码云作业gitee仓库 https://gitee.com/huang-yuejia/DataMining_project/tree/master/work1
学号 102202149
姓名 黄悦佳

一、作业内容

作业①:

1.爬取大学排名(作业1)

本作业源码链接:https://gitee.com/huang-yuejia/DataMining_project/blob/master/work1/work1.py

  • 结果展示:

  • 关键代码展示:
    输出爬取处理

# 检查请求是否成功
if response.status_code == 200:
    web_content = response.content.decode('utf-8')
    # 使用BeautifulSoup解析网页
    soup = BeautifulSoup(web_content, 'html.parser')
    # 查找包含大学排名信息的表格
    table = soup.find('table')
    # 准备保存到Excel的数据列表
    data = []
    if table:
        print("爬取到的大学排名信息:")
        for row in table.find_all('tr')[1:]:  # 跳过表头
            cols = row.find_all('td')
            if len(cols) >= 5:
                rank = cols[0].get_text(strip=True)
                name = cols[1].get_text(strip=True)
                location = cols[2].get_text(strip=True)
                type_ = cols[3].get_text(strip=True)
                score = cols[4].get_text(strip=True)

                # 将每行数据追加到列表
                data.append([rank, name, location, type_, score])

2.心得体会

  • 通过BeautifulSoup库解析HTML内容,结合开发者工具找到具体的数据位置。利用find()和find_all()方法,逐步缩小搜索范围,提取出表格中的排名、学校名称等关键信息实现简单的数据爬取和分析处理,提取所需要的信息。

作业②:

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

    1.爬取当当网书包名称及价格信息(作业2)

本作业源码链接:https://gitee.com/huang-yuejia/DataMining_project/blob/master/work1/work2.py

  • 结果展示:

  • 关键代码展示:

正则表达式处理数据

web_content = response.text

    # 使用正则表达式提取商品名称和价格
    # 商品名称的正则匹配
    name_pattern = re.compile(r'<a.*?class="name".*?title="(.*?)".*?>')
    # 商品价格的正则匹配
    price_pattern = re.compile(r'<p.*?class="price".*?>(.*?)</p>')

    # 获取商品名称和价格
    names = name_pattern.findall(web_content)
    prices = price_pattern.findall(web_content)

    # 清理价格数据
    cleaned_prices = [price.replace('<span class="price_n">&yen;', '').replace('</span>', '元').strip() for price in prices]

2.心得体会

  • 通过本次练习,强化了对正则表达式的理解与使用,进一步了解了如何处理爬取到的网页内容,尤其是在应对HTML标签嵌套及数据清理时的策略。同时也学习了如何通过清理网页中的多余标签来获取干净的数据。

作业③:

1.爬取下载福大新闻官网.jpg/.jpeg图片(作业3)

  • 结果展示:

  • 关键代码展示:
    获取图片下载地址

# 获取图片链接,过滤jpg和jpeg格式
    for img in img_tags:
        img_url = img.get('src')
        if img_url:
            # 处理相对路径和绝对路径
            if img_url.startswith('//'):
                img_url = 'https:' + img_url  # 补全协议
            elif img_url.startswith('/'):
                img_url = 'https://news.fzu.edu.cn' + img_url  # 补全域名

            # 仅保留 jpg 和 jpeg 格式的图片
            if img_url.lower().endswith(('.jpg', '.jpeg')):
                img_urls.append(img_url)

下载图片

# 下载图片
def download_image(url, image_num):
    try:
        print(f"Downloading image {image_num} from {url}...")
        response = requests.get(url, stream=True)
        response.raise_for_status()  # 确保请求成功
        file_path = os.path.join(save_folder, f'image_{image_num}.jpg')
        with open(file_path, 'wb') as f:
            for chunk in response.iter_content(1024):
                f.write(chunk)
        print(f"Successfully downloaded image {image_num}: {file_path}")
    except Exception as e:
        print(f"Error downloading image {image_num} from {url}: {e}")

2.心得体会

  • 图片下载涉及网络请求,如果串行执行会导致效率低下,使用多线程方式对图片等数据进行下载则可以有效的解决这个问题。
  • 网络请求容易受到外界因素影响,比如连接超时、断网等。因此需要在下载过程中实现的异常处理,避免程序崩溃或卡住。

二、作业总结

难点与挑战:

  • 网页结构复杂性:在三次作业中,解析不同网页的HTML结构是一个共同的挑战。无论是从大学排名页面提取表格信息、从当当网提取商品数据,还是从福州大学新闻页面获取图片,网页的结构都不尽相同,尤其是动态内容、嵌套标签和相对路径增加了处理的难度。
  • 数据提取准确性:无论是通过正则表达式还是使用BeautifulSoup解析网页,如何精确提取目标数据(如排名、价格、图片链接等)是核心问题。正则表达式处理复杂HTML结构时,编写和调试匹配规则较为繁琐,需要多次尝试和优化。
  • 并发处理与效率优化:在福州大学新闻图片下载作业中,如何提高下载效率是关键。单线程下载效率低下,需要通过多线程来加速。合理管理并发下载、处理网络请求中的异常也是重要的挑战。

解决思路:

  • 灵活应用网页解析工具:根据不同网页的复杂性,选择合适的解析方式。例如,对于结构清晰的网页,BeautifulSoup能很好地解析并提取数据。而对于页面元素较复杂的场景,正则表达式提供了更灵活的方式来精确匹配需要的数据。
  • 数据清理和格式转换:在数据提取过程中,往往会遇到无效数据或多余的HTML标签。通过适当的清理与转换,例如价格数据的清理、图片链接的补全、表格内容的提取,确保数据的完整性和准确性。
  • 并发与异常处理的结合:为了提升效率,使用ThreadPoolExecutor进行多线程并发处理,并结合try-except处理网络请求的失败情况。这样既提高了效率,又确保即使某个任务失败,也不会影响整体的执行。

新知识与收获:

  • 正则表达式的应用:在数据爬取中,学习了如何通过正则表达式从网页中提取有价值的信息,尤其是在处理复杂网页时,正则表达式比传统解析方法更灵活。
  • 多线程与并发处理:通过福州大学新闻图片下载的作业,进一步理解了Python多线程的应用场景和并发处理的优势。掌握了如何使用ThreadPoolExecutor进行多任务并行处理,并通过as_completed()管理任务结果。
  • 数据存储与持久化:在三次作业中,利用pandas和openpyxl将数据结构化保存到Excel文件中,熟悉了从数据提取到数据持久化的完整流程。通过pandas库轻松处理大规模数据,学会了如何清理、转换和保存数据。>
posted @ 2024-10-16 11:11  Dust4399  阅读(7)  评论(0编辑  收藏  举报