当前位置: 首页 > news >正文

python爬虫初体验(三)——将网页数据导出csv和excel文件

1. 安装库

pip install requests
pip install pandas
pip install BeautifulSoup
  • requests 是一个非常流行的 Python 第三方库,用于简化 HTTP 请求。它允许你发送 HTTP/1.1 请求极其简单,而无需底层的socket库或urllib库。requests 库使得发起请求、处理响应变得非常容易,并且支持多种类型的HTTP请求(GET, POST, PUT, DELETE等)。

  • pandas主要用于数据分析和数据处理。它提供了大量的数据结构和数据操作功能,使得处理表格数据变得更加容易和高效。是目前比较常用的一款Python包。

  • BeautifulSoup4(通常简称 BeautifulSoup)是一个用于解析HTML和XML文档的Python库。它可以帮助开发者从网页中提取所需的数据,常用于Web爬虫项目、数据挖掘以及其他需要解析HTML或XML文档的场景。

2. 示例代码

# -*- coding: utf-8 -*-
import csv
import requests
import pandas as pd
from bs4 import BeautifulSoup# 目标URL
url = 'https://www.shanghairanking.cn/rankings/bcur/2024'
# 请求头,模拟浏览器行为,防止被服务器识别为爬虫。
headers = {'Connection': 'keep-alive','Cache-Control': 'no-store, no-cache, must-revalidate','User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Accept': '*/*','Accept-Encoding': 'gzip, deflate, br, zstd','Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8','Referer': 'https://www.shanghairanking.cn/rankings/bcur/2024',
}
# 创建一个会话对象,保持连接
session = requests.session()# 先访问一次首页,模拟用户行为
session.get('https://www.shanghairanking.cn')# 发送带有headers的GET请求并获取响应内容
resHtml = session.get(url, headers=headers).content.decode('utf-8')# 使用BeautifulSoup解析HTML内容
html_soup = BeautifulSoup(resHtml, 'html.parser')# 查找表格中的所有行
all_goods_li = html_soup.find('table').find_all('tr')def export_rank_csv():# 打开CSV文件准备写入with open('output.csv', 'wb') as csvfile:# 创建一个csv.writer对象csv_writer = csv.writer(csvfile)for row in all_goods_li:goods_info_list = []rank = row.find('div', class_="ranking")img_link = row.find('img')['src']name = row.find('span', class_='name-cn')tags = row.find('p', class_="tags")if name and img_link:goods_info_list.append(rank.get_text(strip=True).encode('utf-8'))goods_info_list.append(img_link)# 将name添加到列表中,并转换为UTF-8编码goods_info_list.append(name.get_text(strip=True).encode('utf-8'))goods_info_list.append(tags.get_text(strip=True).encode('utf-8'))csv_writer.writerow(goods_info_list)def export_rank_excel():school_info_list = []for row in all_school_li:rank = row.find('div', class_="ranking")img_link = row.find('img')['src']name = row.find('span', class_='name-cn')tags = row.find('p', class_="tags")if name and img_link:school_info_list.append([rank.get_text(strip=True).encode('utf-8'),img_link,name.get_text(strip=True).encode('utf-8'),tags.get_text(strip=True).encode('utf-8')])# 列名first_name = ["排名", "logo", "学校名称", "类型"]# 创建一个 DataFrame,列名为 first_name,数据为 school_info_listrank = pd.DataFrame(school_info_list, columns=first_name)# 将“排名”列转换为整数类型rank["排名"] = rank["排名"].astype(int)# 使用 openpyxl 作为写入引擎,将 DataFrame 写入 Excel 文件# 注意:这里使用了默认的 UTF-8 编码,通常不需要显式指定编码rank.to_excel(u"2024中国大学排名.xlsx", index=False)if __name__ == '__main__':# 导出csv文件export_rank_csv()

3. 注意事项

  • 编码问题:确保使用正确的编码处理非ASCII字符。
  • 虽然在 Python 2 中 encode(‘utf-8’) 有助于处理编码问题,但在将数据写入 Excel 文件时通常不需要显式指定编码。但是如果导出文件为乱码,在文件开头添加 # -*- coding: utf-8 -*- 以确保文件以 UTF-8 编码保存。
  • 依赖库:确保已经安装了 pandas 和 beautifulsoup4 库。
  • 创建 DataFrame:使用 pandas 创建 DataFrame,列名为 first_name,数据为 school_info_list。
  • 转换数据类型:将“排名”列的数据类型转换为整数。
  • 导出到 Excel 文件:使用 to_excel 方法将 DataFrame 导出到 Excel 文件,index=False 表示不导出索引列。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Zero-shot、One-shot、Few-shot 这三种学习分别是什么?
  • 8.11Zero Crossing Detection (零交叉检测)
  • python全栈学习记录(十七)logging、json与pickle、time与datatime、random
  • 大数据新视界 --大数据大厂之大数据实战指南:Apache Flume 数据采集的配置与优化秘籍
  • SSM+Vue共享单车管理系统
  • MySQL 生产环境性能优化
  • 【数据结构初阶】栈接口实现及经典OJ题超详解
  • 某易易盾验证码逆向
  • 10. 排序
  • 【表达式求值算法】拆解复杂问题:实现计算器
  • Rust调用tree-sitter解析C语言
  • 11 - TCPClient实验
  • 中断合并参数coalesce_params解释
  • StringReader 使用 JAXB自动将 XML 数据映射到 Java 对象
  • 3. 轴指令(omron 机器自动化控制器)——>MC_MoveVelocity
  • 【5+】跨webview多页面 触发事件(二)
  • 【node学习】协程
  • 0x05 Python数据分析,Anaconda八斩刀
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • angular学习第一篇-----环境搭建
  • classpath对获取配置文件的影响
  • create-react-app做的留言板
  • ECS应用管理最佳实践
  • es6
  • input实现文字超出省略号功能
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Java比较器对数组,集合排序
  • Linux链接文件
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • Redux系列x:源码分析
  • 突破自己的技术思维
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 06-01 点餐小程序前台界面搭建
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • mysql面试题分组并合并列
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • #include
  • #java学习笔记(面向对象)----(未完结)
  • #Linux(权限管理)
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • (LeetCode C++)盛最多水的容器
  • (Python第六天)文件处理
  • (回溯) LeetCode 40. 组合总和II
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (四) Graphivz 颜色选择
  • (四)进入MySQL 【事务】
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转载)CentOS查看系统信息|CentOS查看命令
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .Net CF下精确的计时器
  • .net core Swagger 过滤部分Api
  • .Net Core和.Net Standard直观理解