数据采集作业1

作业1

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

点击查看代码
import requests
from bs4 import BeautifulSoup
# 发起请求,获取页面内容
url = "http://www.shanghairanking.cn/rankings/bcur/2020"
response = requests.get(url)
response.encoding = response.apparent_encoding  # 设置正确的编码
# 解析页面内容
soup = BeautifulSoup(response.text, 'html.parser')
# 定位包含排名信息的表格
table = soup.find('table')
# 初始化列表存储排名数据
rankings = []
# 查找表格中所有行
for row in table.find_all('tr')[1:]:  # 跳过表头
    columns = row.find_all('td')
    # 如果行中有列数据,则提取信息
    if len(columns) >= 5:
        rank = columns[0].text.strip()
        name = columns[1].text.strip()
        province = columns[2].text.strip()
        category = columns[3].text.strip()
        total_score = columns[4].text.strip()
        # 添加到排名列表
        rankings.append((rank, name, province, category, total_score))
# 打印排名信息
print("排名\t学校名称\t省市\t学校类型\t总分")
for rank_info in rankings:
    print("\t".join(rank_info))

效果截图

2.心得体会
在这次数据采集实验中,我学习到了如何使用Python的requests和BeautifulSoup库来爬取网页数据。通过这个过程,我了解到了HTTP请求的基本原理,以及如何解析HTML文档。我也体会到了网页结构的复杂性,以及在实际爬虫开发中可能遇到的挑战,比如如何处理编码问题、如何定位到正确的数据。总的来说,这次实验不仅提升了我的编程技能,也加深了我对网络爬虫和数据采集的理解。这是一个非常有价值的学习经历。

作业2

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

点击查看代码
import requests
import re
url = r'http://search.dangdang.com/?key=%CA%E9%B0%FC&act=input'
try:
    # 发送GET请求
    req = requests.get(url)
    req.raise_for_status()  # 确认请求是否成功
    req.encoding = req.apparent_encoding
except Exception as e:
    print("Error in request:", e)
    exit()
data = req.text
# 使用re.search查找商品列表
match = re.search(r'<ul class="bigimg cloth_shoplist".*?>(.*?)</ul>', data, re.S)
if not match:
    print("未找到商品列表")
    exit()
data = match.group(1)
# 打印标题
print("序号\t价格\t\t商品名称")
# 使用正则表达式匹配li标签
items = re.findall(r'<li.*?>(.*?)</li>', data, re.S)
i = 1
for item in items:
    # 查找价格以及商品名称
    price_match = re.search(r'<span class="price_n">&yen;(.*?)</span>', item)
    title_match = re.search(r'title="(.*?)"', item)
    if price_match and title_match:
        price = price_match.group(1).strip()
        name = title_match.group(1).strip()
        print(f"{i}\t{price}\t{name}")
        i += 1
    else:
        print(f"{i}\t未找到价格或名称")
        i += 1

效果截图

2.心得体会
技术学习与应用

  1. HTTP请求的发送:通过requests.get方法,我能够向当当网发送一个包含搜索关键词的GET请求。这个过程让我更深入地理解了HTTP协议的工作原理,以及如何在Python中实现网络通信。
  2. 编码处理:在处理返回的数据时,我遇到了编码问题。由于中文网页通常使用GBK或UTF-8编码,我需要确保正确设置响应的编码,以便正确解析中文字符。
  3. 正则表达式的编写:使用re库来提取商品名称和价格是这个项目的核心。我学习了如何编写正则表达式来匹配特定的HTML结构,并从中提取所需的信息。这个过程提高了我的正则表达式编写能力,也让我意识到了正则表达式在文本处理中的威力。
    挑战与解决方案
  4. 网页结构的变化:网页的结构经常变化,这可能导致原有的正则表达式失效。为了解决这个问题,我需要定期检查和更新我的正则表达式,以适应网页结构的变化。
  5. 反爬虫机制:当当网可能有反爬虫机制来阻止自动化的数据采集。为了应对这一点,我可能需要使用更复杂的技术,如设置合理的请求头、使用代理服务器或增加请求间隔时间。
  6. 数据的准确性:确保爬取的数据准确无误是一个挑战。我需要仔细检查正则表达式,确保它们能够正确匹配并提取商品名称和价格。
    在进行网络爬虫的开发时,我意识到了遵守法律法规和道德规范的重要性。我需要确保我的爬虫行为不会对当当网的正常运营造成影响,也不会违反版权或其他相关法律。这意味着我需要:
    总结
    通过这个项目,我不仅提升了自己的编程技能,也加深了对网络爬虫和数据采集的理解。我学会了如何使用requestsre库来实现一个简单的爬虫,同时也意识到了在实际开发中可能遇到的挑战和需要考虑的法律及道德问题。这次经历让我更加认识到了作为一个开发者,我们需要在技术实现和社会责任之间找到平衡。

作业3

1. 数据采集实验
要求:我爬取一个给定网页( https://xcb.fzu.edu.cn)的所有JPEG和JPG格式文件
示例代码

点击查看代码
import os
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin, urlparse
# 根网址
base_url = 'https://xcb.fzu.edu.cn'
# 创建一个目录保存图片
save_dir = 'downloaded_images'
os.makedirs(save_dir, exist_ok=True)
# 以集合形式追踪已经访问过的URL
visited_urls = set()
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"
}
def save_image(img_url):
    try:
        img_response = requests.get(img_url, headers=headers)
        img_response.raise_for_status()
        img_name = os.path.basename(urlparse(img_url).path)
        img_path = os.path.join(save_dir, img_name)
        with open(img_path, 'wb') as file:
            file.write(img_response.content)
        print(f"已保存 {img_name}")
    except requests.RequestException as e:
        print(f"下载 {img_url} 失败: {e}")
def scrape_images_from_page(url):
    try:
        response = requests.get(url, headers=headers)
        response.raise_for_status()
        soup = BeautifulSoup(response.text, 'html.parser')
        img_tags = soup.find_all('img')
        # 找到页面上所有JPEG和JPG的图片
        for img in img_tags:
            img_src = img.get('src')
            if img_src:
                img_url = urljoin(base_url, img_src)
                if img_url.lower().endswith(('.jpg', '.jpeg')):
                    if img_url not in visited_urls:
                        visited_urls.add(img_url)
                        save_image(img_url)
        # 寻找页面上的所有链接
        for link in soup.find_all('a'):
            link_href = link.get('href')
            if link_href:
                full_url = urljoin(base_url, link_href)
                if full_url.startswith(base_url) and full_url not in visited_urls:
                    visited_urls.add(full_url)
                    scrape_images_from_page(full_url)

    except requests.RequestException as e:
        print(f"请求失败: {e}")
# 从根网址开始爬取
scrape_images_from_page(base_url)

效果截图


2.心得体会
在尝试爬取一个给定网页(如福州大学新闻网 https://xcb.fzu.edu.cn)上的所有JPEG和JPG格式文件的过程中,我获得了许多宝贵的经验和深刻的认识。
首先,我意识到了网页结构的复杂性。不同的网站有着不同的布局和设计,这要求我在编写爬虫时必须具有灵活性和适应性。我学会了如何使用开发者工具来检查网页元素,定位到图片资源的URL,并理解了相对路径和绝对路径的区别。
其次,我学习了如何使用Python的requests库来发送HTTP请求,并获取网页内容。通过这个过程,我更加熟悉了HTTP协议的工作原理,包括请求头、响应码等重要概念。
在解析网页内容时,我使用了BeautifulSoup库,它让我能够轻松地定位到图片标签,并提取出图片的URL。我也学习了如何使用正则表达式来匹配JPEG和JPG格式的文件,这增强了我的文本处理能力。
这次爬虫项目不仅提升了我的编程技能,也加深了我对网络爬虫的理解。它让我学会了如何在技术实现和社会责任之间找到平衡,并且让我意识到了作为一个开发者,我们有责任以一种负责任的方式使用我们的技能。

posted @ 2024-10-15 16:35  布若  阅读(4)  评论(0编辑  收藏  举报