爬虫案例之2023中国最好学科排名

1.引言

1.1主题

本博客旨在通过一个具体的案例——2023年中国最好学科排名的数据爬取,来展示网络爬虫技术的实际应用。我们将探索如何使用爬虫技术来自动收集、处理和分析网络上的公开数据,以及如何将这些数据转化为有价值的信息。

2.爬虫技术简介

2.1爬虫定义

爬虫,也称为网络蜘蛛(Spider),是一种自动化的软件程序,用于在互联网上浏览和检索信息。它通过模拟用户浏览网页的行为,访问网站并获取网页内容,然后从中提取有用的数据。

2.2 工作原理

  1. 起始URL: 爬虫从一个或多个起始URL开始工作,这些URL可以是网站首页或任何其他页面。
  2. 请求网页: 爬虫向服务器发送请求,获取网页的HTML代码。
  3. 解析内容: 爬虫使用HTML解析器解析网页内容,识别和提取网页上的链接以及其他所需数据。
  4. 链接跟踪: 爬虫识别网页中的链接,并将其添加到待访问的URL列表中。
  5. 重复过程: 爬虫继续访问新的URL,重复请求、解析和链接跟踪的过程,直到达到预设的条件,如访问的页面数量、时间限制或特定关键词的出现。
  6. 数据存储: 在爬取过程中,爬虫将提取的数据存储在本地文件、数据库或其他存储系统中,以便后续分析和使用。
  7. 遵守规则: 为了尊重网站所有者的权益和减轻服务器负担,爬虫通常会遵守网站的robots.txt文件中的规则,该文件定义了爬虫可以访问的页面范围。
  8. 用户代理(User Agent): 爬虫在请求网页时会发送一个用户代理字符串,以标识自己的身份,这有助于网站服务器识别请求来源。
  9. 错误处理: 爬虫需要能够处理各种网络错误,如404错误(页面未找到)、503错误(服务不可用)等,并适当地记录这些事件。
  10. 反爬虫策略: 许多网站会实施反爬虫措施,如验证码、IP封锁等,以防止爬虫过度访问。爬虫需要设计相应的策略来应对这些挑战。

3.数据来源

url:https://www.shanghairanking.cn/rankings/bcsr/2023

4.准备工作

4.1编程语言

Python是一种高级编程语言,以其简洁的语法和强大的库支持而闻名。它非常适合初学者和专业开发者。

4.2库和模块

在这里插入图片描述
在这里插入图片描述

5.数据提取

def get_data(url):
    """
    抓取网页数据。

    参数:
    url (str): 需要抓取数据的网址。

    返回:
    list: 包含抓取数据的列表,如果请求失败则返回None。
    """
    # 初始化序号计数器
    counter = 1
    # 发送GET请求
    response1 = requests.get(url, headers, timeout=3)
    # 打印响应码
    print(f"响应码:{response1.status_code}")
    # 如果请求成功
    if response1.status_code == 200:
        # 解码HTML内容
        html_content1 = response1.content.decode()
        # 解析HTML
        html1 = etree.HTML(html_content1)

        # 获取所有的subject-item div元素
        subject_items = html1.xpath("//div[@class='subject-item']")
        # 遍历每个subject-item
        for i, subject_item in enumerate(subject_items):
            # 获取一级分类代码和标题
            subject_code = subject_item.xpath("./div[@class='subject-category']/span[@class='subject-code']/text()")[0]
            subject_title = subject_item.xpath("./div[@class='subject-category']/div[@class='subject-title']/text()")[0]
            primary_classification = f"{subject_code} {subject_title}"

            # 遍历二级分类列表
            for j, subject_list in enumerate(subject_item.xpath("./div[@class='subject-list']/div")):
                # 获取二级分类的链接和代码、标题
                subject_link = subject_list.xpath("./a/@href")[0]
                subject_list_code = subject_list.xpath("./a[@class='subj-link']/span/text()")[0]
                subject_list_title = subject_list.xpath("./a[@class='subj-link']/span/text()")[1]
                secondary_classification = f'{subject_list_code} {subject_list_title}'
                complete_url = 'https://www.shanghairanking.cn' + subject_link

                # 发送GET请求获取二级分类页面数据
                response2 = requests.get(complete_url, headers, timeout=3)
                # 打印当前抓取页面
                print(f'正在抓取{complete_url}页面数据...')
                # 解析HTML
                html_content2 = response2.content.decode()
                html2 = etree.HTML(html_content2)
                # 获取排名表格中的前五行数据
                five_tr_items = html2.xpath(
                    "//table[@class='rk-table']/tbody[@data-v-68a1907c='']/tr[@data-v-68a1907c='']")[0:5]

                # 遍历每行数据,提取所需信息
                for k, item in enumerate(five_tr_items):
                    rk_2023 = html2.xpath("//div[@class='ranking']/text()")[k]
                    cleaned_rk_2023 = ''.join(rk_2023.split())
                    rk_2022 = html2.xpath("//span[not(@class)][@data-v-6c038bb7=''][@data-v-68a1907c='']/text()")[k]
                    ratio = html2.xpath("//td[@data-v-68a1907c='']/text()")[2 * k]
                    cleaned_ratio = ''.join(ratio.split())
                    logo_url = html2.xpath("//img[@class='univ-logo']/@src")[k]
                    univ_name = html2.xpath("//span[@class='name-cn']/text()")[k]
                    cleaned_univ_name = ''.join(univ_name.split())
                    score = html2.xpath("//td[@data-v-68a1907c='']/text()")[2 * k + 1]
                    cleaned_score = ''.join(score.split())
                    # 将提取的数据添加到全局数据列表

                    data.append({'序号':counter,'一级分类': primary_classification, '二级分类': secondary_classification,
                                 '2023年排名': cleaned_rk_2023, '2022年排名': rk_2022, '层次比例': cleaned_ratio,
                                 'logo图片地址': logo_url, '学校名称': cleaned_univ_name, '总分': cleaned_score})
                    counter += 1
        # 暂停1秒,防止请求过于频繁
        time.sleep(1)
        return data
    else:
        print("请求失败")
        return None

6.数据保存

def save_data(data):
    """
    将数据保存到CSV文件。

    参数:
    data (list): 包含要保存数据的列表。
    """
    # 将数据转换为DataFrame
    df = pd.DataFrame(data)
    # 保存到CSV文件
    df.to_csv('subject_rank.csv', index=False, encoding='utf-8')

7.主函数

if __name__ == '__main__':
    # 定义目标URL
    url = 'https://www.shanghairanking.cn/rankings/bcsr/2023'
    # 抓取数据
    data = get_data(url)
    # 保存数据
    save_data(data)
    # 打印成功信息
    print("采集数据成功")

8.运行结果

运行结果如下图在这里插入图片描述

9.总结

在本博客中,我们探讨了网络爬虫的基本概念、工具和编程语言,并通过一个具体的案例——2023年中国最好学科排名的数据爬取,展示了爬虫技术的实际应用。我们学习了如何设计和实现一个爬虫项目,包括数据的抓取、清洗、存储和分析。此外,我们还讨论了在进行爬虫活动时需要遵守的法律法规和伦理标准。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值