1.引言
1.1主题
本博客旨在通过一个具体的案例——2023年中国最好学科排名的数据爬取,来展示网络爬虫技术的实际应用。我们将探索如何使用爬虫技术来自动收集、处理和分析网络上的公开数据,以及如何将这些数据转化为有价值的信息。
2.爬虫技术简介
2.1爬虫定义
爬虫,也称为网络蜘蛛(Spider),是一种自动化的软件程序,用于在互联网上浏览和检索信息。它通过模拟用户浏览网页的行为,访问网站并获取网页内容,然后从中提取有用的数据。
2.2 工作原理
- 起始URL: 爬虫从一个或多个起始URL开始工作,这些URL可以是网站首页或任何其他页面。
- 请求网页: 爬虫向服务器发送请求,获取网页的HTML代码。
- 解析内容: 爬虫使用HTML解析器解析网页内容,识别和提取网页上的链接以及其他所需数据。
- 链接跟踪: 爬虫识别网页中的链接,并将其添加到待访问的URL列表中。
- 重复过程: 爬虫继续访问新的URL,重复请求、解析和链接跟踪的过程,直到达到预设的条件,如访问的页面数量、时间限制或特定关键词的出现。
- 数据存储: 在爬取过程中,爬虫将提取的数据存储在本地文件、数据库或其他存储系统中,以便后续分析和使用。
- 遵守规则: 为了尊重网站所有者的权益和减轻服务器负担,爬虫通常会遵守网站的robots.txt文件中的规则,该文件定义了爬虫可以访问的页面范围。
- 用户代理(User Agent): 爬虫在请求网页时会发送一个用户代理字符串,以标识自己的身份,这有助于网站服务器识别请求来源。
- 错误处理: 爬虫需要能够处理各种网络错误,如404错误(页面未找到)、503错误(服务不可用)等,并适当地记录这些事件。
- 反爬虫策略: 许多网站会实施反爬虫措施,如验证码、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年中国最好学科排名的数据爬取,展示了爬虫技术的实际应用。我们学习了如何设计和实现一个爬虫项目,包括数据的抓取、清洗、存储和分析。此外,我们还讨论了在进行爬虫活动时需要遵守的法律法规和伦理标准。