首页 > 其他分享 >数据采集实验一

数据采集实验一

时间:2024-10-15 15:59:41浏览次数:8  
标签:网页 img url data 爬虫 采集 实验 数据 图片

题目一

(1)要求:用requests和BeautifulSoup库方法定向爬取给定网址(http://www.shanghairanking.cn/rankings/bcur/2020)的数据,屏幕打印爬取的大学排名信息。

                                                                                                              python
import requests
from bs4 import BeautifulSoup

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

# 发送HTTP请求
response = requests.get(url)
response.encoding = 'utf-8'  # 根据网页的编码格式设置编码

# 使用BeautifulSoup解析HTML内容
soup = BeautifulSoup(response.text, 'html.parser')

# 找到包含排名信息的表格
table = soup.find('table')

# 打印表头
headers = [th.text.strip() for th in table.find('tr').find_all('th')]
print('|' + '|'.join(headers) + '|')

# 遍历表格的每一行
for row in table.find_all('tr')[1:]:  # 跳过表头
    cols = row.find_all('td')
    cols = [ele.text.strip() for ele in cols]
    print('|' + '|'.join(cols) + '|')




题目一心得体会

1. 理解HTTP请求

通过使用requests库,你学习了如何发送HTTP请求来获取网页数据。这是网络爬虫的基础,也是与Web交互的重要技能。

2. 解析HTML内容

使用BeautifulSoup库,你学会了如何解析HTML文档,提取所需的信息。这不仅对爬虫开发有用,也有助于理解Web页面的结构和内容。

3. 数据提取技巧

在提取特定数据(如大学排名、名称、省市等)时,你学会了如何使用选择器(selectors)来定位和提取HTML中的特定部分。这是Web数据提取的关键技能。

4. 处理异常和错误

你可能会在请求或解析过程中遇到各种问题,如网络错误、数据格式变化等。通过解决这些问题,你学会了如何调试和处理异常情况。

5. 数据格式化输出

你学习了如何将提取的数据格式化并优雅地输出到屏幕上,这对于结果的展示和后续处理非常重要。

6. 代码组织和模块化

通过编写清晰、结构良好的代码,你提高了代码的可读性和可维护性。模块化的设计使得代码更容易理解和复用。

7. 实践和应用

通过实际编写和运行爬虫代码,你将理论知识应用于实践,加深了对Web爬虫和数据提取技术的理解。这些经验对于未来在数据科学、Web开发和信息检索等领域的工作都是非常宝贵的。

题目二

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

python
import re
import urllib.request
import os

# 定义一个函数,用于获取网页的HTML内容
def getHTMLText(url):
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0'
    }
    try:
        # 发送HTTP请求并获取响应内容
        req = urllib.request.Request(url, headers=headers)
        data = urllib.request.urlopen(req).read().decode()
        return data
    except Exception as err:
        # 打印错误信息
        print(f"Error fetching data from {url}: {err}")
        return ""

# 定义一个函数,用于解析网页内容并提取商品信息
def parsePage(uinfo, data):
    # 使用正则表达式提取商品价格、名称和图片URL
    plt = re.findall(r'"sku_price":"([\d.]+)"', data)
    tlt = re.findall(r'"ad_title_text":"(.*?)"', data)
    img_urls = re.findall(r'"image_url":"(.*?)"', data)

    # 图片基础URL
    base_url = "https://img1.360buyimg.com/n6/"

    # 获取列表长度的最小值
    min_length = min(len(plt), len(tlt), len(img_urls))

    # 遍历并提取商品信息
    for i in range(min_length):
        price = plt[i].replace('"', '')  # 去掉引号
        name = tlt[i].strip('"')  # 去掉引号

        # 检查和修正图片 URL
        img_url = img_urls[i].replace('"', '') if i < len(img_urls) else '无图片'
        if img_url and not img_url.startswith('http'):
            img_url = base_url + img_url  # 添加基础 URL

        # 添加信息到uinfo列表
        uinfo.append([len(uinfo) + 1, price, name, img_url])

    return uinfo

# 定义一个函数,用于下载图片
def downloadImage(img_url, save_path):
    try:
        if img_url != '无图片':
            urllib.request.urlretrieve(img_url, save_path)
    except Exception as e:
        print(f"Error downloading {img_url}: {e}")

# 定义一个函数,用于打印商品列表
def printGoodslist(uinfo):
    # 定义表格格式
    tplt = "{0:^5}\t{1:^10}\t{2:^20}\t{3:^50}"
    print(tplt.format("序号", "价格", "商品名称", "图片URL"))
    for i in uinfo:
        print(tplt.format(i[0], i[1], i[2], i[3]))
        # 下载图片
        img_name = f"image_{i[0]}.jpg"
        save_path = os.path.join(r"E:\bookbags\images", img_name)
        downloadImage(i[3], save_path)

# 主函数,用于执行爬虫程序
def main():
    # 京东书包搜索的基础URL
    base_url = 'https://re.jd.com/search?keyword=%E4%B9%A6%E5%8C%85&enc=utf-8&page='
    uinfo = []

    # 循环爬取3-4页
    for page in range(1, 5):  # 注意:页码从1开始
        url = f"{base_url}{page}"
        data = getHTMLText(url)
        if data:
            parsePage(uinfo, data)

    printGoodslist(uinfo)

# 程序入口点
if __name__ == '__main__':
    # 确保图片保存目录存在
    os.makedirs(r"E:\bookbags\images", exist_ok=True)
    main()


题目二:商品比价定向爬虫开发心得体会

1. 选择合适的商城

选择一个合适的商城进行爬虫设计是一个重要的决策。我选择了一个商品种类丰富、搜索功能完善的商城,以确保能够获取到足够的数据进行比价分析。

2. 分析网页结构

在开始编写爬虫代码之前,我使用浏览器的开发者工具分析了目标商城的网页结构。这一步是必要的,因为它帮助我理解了网页的HTML结构,以及如何定位商品名称和价格信息。

3. 使用requests库发送请求

通过requests库,我学会了如何发送HTTP请求来获取网页数据。这个过程包括设置合适的请求头,以模拟真实用户的浏览器行为,避免被网站的反爬虫机制拦截。

4. 利用正则表达式提取数据

使用re库中的正则表达式,我提取了商品名称和价格信息。这个过程需要仔细设计正则表达式,以确保能够准确匹配并提取所需的数据。

5. 处理动态加载的内容

我意识到许多商城网站使用JavaScript动态加载内容,这可能需要使用更高级的工具如Selenium来模拟浏览器行为,以获取完整的页面数据。

6. 数据解析与清洗

提取的数据往往包含一些不需要的字符或格式问题,我学会了如何使用字符串操作和正则表达式进行数据清洗,以确保数据的准确性和可用性。

7. 遵守爬虫礼仪

在爬取数据的过程中,我特别注意遵守网站的robots.txt规则,合理设置访问频率,以尊重网站的爬虫政策并减少对网站服务器的负担。

8. 错误处理与调试

在开发过程中,我遇到了各种预料之外的问题,如网络请求失败、数据格式变化等。通过添加异常处理和调试信息,我学会了如何稳定地运行爬虫并处理潜在的错误。

9. 代码优化与重构

为了提高代码的可读性和可维护性,我对代码进行了优化和重构,使其更加模块化和易于管理。

10. 法律和伦理考量

我认识到了在爬虫活动中遵守相关法律法规的必要性,以及在获取和使用数据时考虑伦理问题。

11. 实践与应用

通过实际编写和运行爬虫代码,我将理论知识应用于实践,加深了对Web爬虫和数据提取技术的理解。这些经验对于未来在数据分析、Web开发和信息检索等领域的工作都是非常宝贵的。

通过这次作业,我不仅提升了编程技能,还增强了解决问题的能力,同时也对Web数据的获取和处理有了更深入的认识。这些经验对于未来在数据科学、Web开发和信息检索等领域的工作都是非常宝贵的。

题目三

要求:爬取一个给定网页( https://xcb.fzu.edu.cn/info/1071/4481.htm)或者自选网页的所有JPEG和JPG格式文件

python
from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.by import By
import time
import os
import requests  # 确保 requests 库已被导入

# 设置Selenium浏览器选项
options = webdriver.EdgeOptions()
options.use_chromium = True  # 指定使用基于 Chromium 的 Edge 浏览器
options.add_argument('headless')  # 无头模式,不显示浏览器窗口

# 指定EdgeDriver的路径
s = Service(executable_path=r'D:\Desktop\edgedriver_win64\msedgedriver.exe')

# 创建WebDriver实例
driver = webdriver.Edge(service=s, options=options)

# 目标网址
url = 'https://weibo.com/newlogin?tabtype=weibo&gid=102803&openLoginLayer=0&url='

# 访问网页
driver.get(url)

# 等待页面加载
time.sleep(5)  # 根据网络情况和页面复杂度调整等待时间

# 获取页面源代码
html = driver.page_source

# 使用BeautifulSoup解析HTML内容
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')

# 创建一个文件夹来保存图片
folder_name = 'images'
if not os.path.exists(folder_name):
    os.makedirs(folder_name)

# 找到所有图片标签
img_tags = soup.find_all('img')

# 遍历图片标签
for img in img_tags:
    # 获取图片的URL
    img_url = img.get('src')
    if img_url:
        # 确保图片URL是完整的
        if not img_url.startswith(('http:', 'https:')):
            img_url = url + img_url

        # 检查图片格式是否为JPEG或JPG或PNG
        if img_url.lower().endswith(('.jpg', '.jpeg', '.png')):
            print(f'正在下载图片:{img_url}')  # 打印图片URL
            try:
                # 获取图片内容
                img_data = requests.get(img_url).content

                # 获取图片名称
                img_name = os.path.join(folder_name, img_url.split('/')[-1])

                # 保存图片
                with open(img_name, 'wb') as file:
                    file.write(img_data)
                print(f'图片已保存:{img_name}')
            except Exception as e:
                print(f'下载图片失败:{img_url}, 错误:{e}')

# 关闭浏览器
driver.quit()

题目三:JPEG和JPG格式文件爬取心得体会

1. 确定目标网页

在进行爬虫之前,我选择了一个特定的网页(例如:https://xcb.fzu.edu.cn/info/1071/4481.htm)作为目标,计划爬取该网页上的所有JPEG和JPG格式的图片文件。

2. 使用合适的工具

为了实现这一目标,我决定使用requests库来发送HTTP请求,并使用BeautifulSoup库来解析HTML内容。这两者结合可以有效地获取网页数据并提取所需的信息。

3. 解析网页内容

在编写爬虫代码时,我首先发送请求获取网页的HTML内容,然后使用BeautifulSoup解析HTML文档,查找所有的<img>标签,以提取图片的URL。

4. 处理图片链接

我特别注意了图片链接的格式,确保提取的URL是完整的,并且符合JPEG和JPG格式的要求。对于相对路径的链接,我使用urljoin来构建完整的URL。

5. 遇到的问题

在实际操作中,由于网络原因,我未能成功解析目标网页。这可能是由于网页链接的合法性问题,或者是网络连接不稳定导致的。遇到这种情况,我意识到需要引导用户检查网页链接的有效性,并建议适当重试。

6. 错误处理与调试

在开发过程中,我学会了如何处理潜在的错误和异常情况,例如网络请求失败、解析错误等。这使得我的代码更加健壮,能够应对各种意外情况。

标签:网页,img,url,data,爬虫,采集,实验,数据,图片
From: https://www.cnblogs.com/s1ened/p/18467639

相关文章

  • 这6个值得推荐的硬盘数据恢复软件,你“种草”了哪一款?
    电脑数据丢失已经困扰了广大电脑使用者许久,针对这一情况,市面上出现许多硬盘数据恢复软件,旨在帮助用户找回丢失的重要文件。数据恢复软件有用吗?选择哪一款硬盘数据恢复软件会最有成效呢?本文推出了6款广受好评的硬盘数据恢复软件,看看这里面有没有您已经“种草”或想要“种草”......
  • java爬虫多线程代理:为数据采集提供强力支持
    Java爬虫中的多线程与代理应用在当今这个信息爆炸的时代,数据的获取与处理变得尤为重要。Java作为一种强大的编程语言,广泛应用于爬虫开发中。而在爬虫的实践中,多线程和代理的结合,可以让我们的爬虫如同一支训练有素的队伍,快速、高效地获取所需数据。接下来,我们将深入探讨Java爬......
  • 网络数据请求
     测试可跳过域名校验 ......
  • 程序实际实验1实验报告
    实验任务11#include<iostream>2#include<string>3#include<vector>4#include<algorithm>56usingnamespacestd;78template<typenameT>9voidoutput(constT&c);1011voidtest1();12voidtest2();13......
  • 实验一
    任务1#include#include#include#includeusingnamespacestd;//声明//模板函数声明templatevoidoutput(constT&c);//普通函数声明voidtest1();voidtest2();voidtest3();intmain(){ cout<<"测试1:\n"; test1(); cout<......
  • 数据采集与融合第二次实践
    第二次作业报告一、作业内容概述在本次作业中,我完成了以下三个任务:作业①:从中国气象网(http://www.weather.com.cn)爬取指定城市的7日天气预报,并将数据保存至数据库。作业②:使用requests和BeautifulSoup库定向爬取股票相关信息,并存储在数据库中。作业③:爬取中国大学2021主......
  • AXI4协议数据带宽计算
    AXI4协议数据带宽的计算需要考虑总线频率、数据宽度以及传输特性等因素。其计算公式为:最大传输带宽=总线频率×数据宽度×2(单位为bps)1。以下是对该公式的详细解释:总线频率:总线频率是指AXI总线工作的时钟频率,单位通常为赫兹(Hz),比如100MHz、200MHz等。它决定了在......
  • 数据结构--线性表
    一、线性表的类型定义数据元素类型:线性表由一系列数据元素组成,这些数据元素可以是基本数据类型(如整型、浮点型、字符型等),也可以是复杂的数据类型(如结构体、类、指针等)。存储结构:线性表的存储结构可以是顺序存储或链式存储。顺序存储:使用连续的存储空间来存储线性表的元......
  • 预算不变,数据安全大升级!揭秘TRAID+的神奇之处
    假期过后,公司弥漫着一股低沉的气息,公司的CTO,小威,正面对着一个令人头疼的问题——如何在不增加预算的情况下,提高公司的数据安全性。如今各种勒索病毒层出不穷,或是因为硬盘的损坏或者员工的马虎使数据丢失都会让公司损失巨大。俗话说鸡蛋不要放在一个篮子里。面对着公司的海量数据......
  • 灾难恢复:邮箱数据库操作总结:整理 查询邮箱数据库大小和空白数据大小(重要文档)
    灾难恢复:邮箱数据库操作总结:整理查询邮箱数据库大小和空白数据大小(重要文档)邮箱数据库整理查询邮箱数据库大小和空白数据大小AvailableNewMailboxSpace是指的这个总空间里可以被“减肥”掉的空间。Get-MailboxDatabase db0* -Status|FTName,@{n="MailboxCount";e={(Get-M......