详解 Python 如何将爬取到的数据分别存储到 txt、excel、mysql 中!

4bd033ed6b7fffcf270e62b24d226686.gif

作者 | 黄伟呢

来源 | 数据分析与统计学之美

1. 页面分析

我爬取的页面是腾讯体育,链接如下:

https://nba.stats.qq.com/player/list.htm

0ef9781c96c344306af55709d63daad6.png

观察上图:左边展示的分别是NBA的30支球队,右边就是每只球队对应球员的详细信息。

此时思路就很清晰了,我们每点击一支球员,右侧就会出现该球队的球员信息。

整个爬虫思路简化如下:

  • ① 获取每支球员页面的url;

  • ② 利用Python代码获取每个网页中的数据;

  • ③ 将获取到的数据,存储至不同的数据库;

那么,现在要做的就是找到每支球员页面的url,去发现它们的关联

我们每点击一支球队,复制它的url,下面我复制了三支球队的页面url,如下所示:

# 76人
https://nba.stats.qq.com/player/list.htm#teamId=20

# 火箭
https://nba.stats.qq.com/player/list.htm#teamId=10

# 热火
https://nba.stats.qq.com/player/list.htm#teamId=14

观察上述url,可以发现:url基本一模一样,除了参数teamId对应的数字不一样,完全可以猜测出,这就是每支球队对应的编号,30支球队30个编号。

只要是涉及到“腾讯”二字,基本都是动态网页,我之前碰到过好多次。基础方法根本获取不到数据,不信可以查看网页源码试试:点击鼠标右键——>点击查看网页源代码。

d92013813272583094e4aaa02acb001e.png

部分截图如下

接着,将网页中的某个数据(你要获取的)复制,然后再源代码页面中,点击crtl + f,调出“搜索框”,将复制的数据粘贴进去。如果和上图一样,出现0条记录,则基本可以判断该网页属于动态网页,直接获取源码,一定找不到你要的数据。

因此如果你想要获取页面中的数据,使用selenuim自动化爬虫,是其中一种办法。

2. 数据爬取

我喜欢用xpath,对于本文数据的获取,我都将使用它。关于xpath的使用,那就是另一篇文章了,这里就不详细讲述。

db174e80c72a0178274069d1a71a32ff.png

说了这么多,咋们直接上代码吧!

from selenium import webdriver

# 创建浏览器对象,该操作会自动帮我们打开Google浏览器窗口
browser = webdriver.Chrome()

# 调用浏览器对象,向服务器发送请求。该操作会打开Google浏览器,并跳转到“百度”首页
browser.get("https://nba.stats.qq.com/player/list.htm#teamId=20")

# 最大化窗口
browser.maximize_window()

# 获取球员中文名
chinese_names = browser.find_elements_by_xpath('//div[@class="players"]//tr[@class="show"]/td[2]/a')
chinese_names_list  = [i.text for i in chinese_names]

# 获取球员英文名
english_names = browser.find_elements_by_xpath('//div[@class="players"]//tr[@class="show"]/td[3]/a')
english_names_list = [i.get_attribute('title') for i in english_names] # 获取属性

# 获取球员号码
numbers = browser.find_elements_by_xpath('//div[@class="players"]//tr[@class="show"]/td[4]')
numbers_list = [i.text for i in numbers]

# 获取球员位置
locations = browser.find_elements_by_xpath('//div[@class="players"]//tr[@class="show"]/td[5]')
locations_list = [i.text for i in locations]

# 获取球员身高
heights = browser.find_elements_by_xpath('//div[@class="players"]//tr[@class="show"]/td[6]')
heights_list = [i.text for i in heights]

# 获取球员体重
weights = browser.find_elements_by_xpath('//div[@class="players"]//tr[@class="show"]/td[7]')
weights_list = [i.text for i in weights]

# 获取球员年龄
ages = browser.find_elements_by_xpath('//div[@class="players"]//tr[@class="show"]/td[8]')
ages_list = [i.text for i in ages_list]

# 获取球员球龄
qiu_lings = browser.find_elements_by_xpath('//div[@class="players"]//tr[@class="show"]/td[9]')
qiu_lings_list = [i.text for i in qiu_lings_list]

这里只爬取了一支球队,剩下29支球队球员数据的爬取任务交给你们。整个代码部分,基本上大同小异,我写了一个,你们照葫芦画瓢。【就一个循环,还不简单呀!】

3. 存储至txt

将数据保存到txt文本的操作非常简单,txt几乎兼容所有平台,唯一的缺点就是不方便检索。要是对检索和数据结构要求不高,追求方便第一的话,请采用txt文本存储。

注意:txt中写入的是str字符串。

txt文档写入数据的规则是这样的:从头开始,从左至右一直填充。当填充至最右边后,会被挤到下一行。因此,如果你想存入的数据规整一点,可以自动填入制表符“\t”和换行符“\n”。

以本文为例,将获取到的数据,存储到txt文本中。

for i in zip(chinese_names_list,english_names_list,numbers_list,locations_list,heights_list,weights_list,ages_list,qiu_lings_list):
    with open("NBA.txt","a+",encoding="utf-8") as f:
        # zip函数,得到的是一个元组,我们需要将它转换为一个字符串
        f.write(str(i)[1:-1])
        # 自动换行,好写入第2行数据
        f.write("\n")
        f.write("\n")

部分截图如下:

970fdd0636a41b7a7a73dc47e4b835df.png

4. 存储至excel

excel有两种格式的文件,一种是csv格式,一种是xlsx格式。将数据保存至excel,当然是使用pandas库更方便。

import pandas as pd

# 一定要学会组织数据
df = pd.DataFrame({"中文名": chinese_names_list,
                   "英文名": english_names_list,
                   "球员号码": numbers_list,
                   "位置": locations_list,
                   "身高": heights_list,
                   "体重": weights_list,
                   "年龄": ages_list,
                   "球龄": qiu_lings_list})
 
# to_excel()函数
df.to_excel("NBA.xlsx",encoding="utf-8",index=None)

结果如下:

‍‍‍‍‍‍‍ca4535b7f4a2eca5977f225d6cfa5100.png

5. 存储至mysql

MySQL是一个关系型数据库,数据是采用类excel的二维表来保存数据的,即行、列组成的表,每一行代表一条记录,每一列代表一个字段。

关于Python操作MySQL数据库,我曾经写了一篇博客,大家可以参考以下:

blog.csdn.net/weixin_41261833/article/details/103832017

为了让大家更明白这个过程,我分布为大家讲解:

① 创建一个表nba

我们想要往数据库中插入数据,首先需要建立一张表,这里命名为nba。

import pymysql

# 1. 连接数据库
db = pymysql.connect(host='localhost',user='root', password='123456',port=3306, db='demo', charset='utf8')

# 2. 创建一个表
# 创建一个游标对象;
cursor = db.cursor()
 
# 建表语句;
sql = """
        create table NBA(
            chinese_names_list varchar(20),
            english_names_list varchar(20),
            numbers_list varchar(20),
            locations_list varchar(20),
            heights_list varchar(20),
            weights_list varchar(20),
            ages_list varchar(20),
            qiu_lings_list varchar(20)
        )charset=utf8
      """
# 执行sql语句;
cursor.execute(sql)

# 断开数据库的连接;
db.close()
② 往表nba中插入数据
import pymysql

# 1. 组织数据
data_list = []
for i in zip(chinese_names_list,english_names_list,numbers_list,locations_list,heights_list,weights_list,ages_list,qiu_lings_list):
    data_list.append(i)

# 2. 连接数据库
db = pymysql.connect(host='localhost',user='root', password='123456',port=3306, db='demo', charset='utf8')

# 创建一个游标对象;
cursor = db.cursor()

# 3. 插入数据
sql = 'insert into nba(chinese_names_list,english_names_list,numbers_list,locations_list,heights_list,weights_list,ages_list,qiu_lings_list) values(%s,%s,%s,%s,%s,%s,%s,%s)'

try:
    cursor.executemany(sql,data_list)
    db.commit()
    print("插入成功")
except:
    print("插入失败")
    db.rollback()
db.close()

结果如下:

be5b9b032c8ce50b722fbeba9d3259f5.png

bfde0e02daa1471a31a98fe8ea01138b.gif

资讯

谷歌使出禁用2G大招

技术

干货满满的python实战项目!

技术

Python写了一个网页版的P图软件

技术

11款可替代top命令的工具!

c8ea46f2ced66cb7bf8c9355c11bb570.png

分享

e0e7bd914a2bc80f235864c9006637cb.png

点收藏

1b6ee6973dcead79feb4b7886cd1bf27.png

点点赞

0412031f856cead6de3b765028cbb9b3.png

点在看

  • 10
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个基于新冠肺炎疫情数据的项目创建代码代码详解: 1. 爬取数据 首先,我们需要从网站上爬取新冠肺炎疫情数据。这里我们以丁香园的实时疫情数据为例。可以使用Python的requests库进行网页爬取,然后使用正则表达式或BeautifulSoup等库进行解析和数据提取。 ```python import requests from bs4 import BeautifulSoup # 爬取数据 url = 'https://ncov.dxy.cn/ncovh5/view/pneumonia' response = requests.get(url) soup = BeautifulSoup(response.content, 'html.parser') # 解析数据 data = [] for area in soup.find_all('div', class_='areaBlock1'): name = area.find('span', class_='areaBlock1_title').text.strip() confirmed = area.find('span', class_='areaBlock1_number').text.strip() suspected = area.find('span', class_='areaBlock2_number').text.strip() cured = area.find('span', class_='areaBlock3_number').text.strip() dead = area.find('span', class_='areaBlock4_number').text.strip() data.append((name, confirmed, suspected, cured, dead)) ``` 2. 将数据发送给Spark 接下来,我们需要将数据发送给Spark进行处理。首先需要安装PySpark,并创建一个SparkContext对象。 ```python from pyspark import SparkContext, SparkConf # 初始化Spark conf = SparkConf().setAppName("covid19_analysis") sc = SparkContext(conf=conf) # 创建RDD rdd = sc.parallelize(data) ``` 接着,我们可以对RDD进行转换和操作,比如筛选出某个地区的数据、计算累计确诊人数等。 ```python # 筛选出国地区的数据 china_rdd = rdd.filter(lambda x: x[0] == '国') # 计算累计确诊人数 confirmed_sum = china_rdd.map(lambda x: int(x[1])).reduce(lambda x, y: x + y) ``` 3. 将处理后的数据存储MySQL 最后,我们需要将处理后的数据存储MySQL数据库。可以使用PythonMySQL库(如PyMySQL)进行数据库连接和数据插入。 ```python import pymysql # 将数据存储MySQL connection = pymysql.connect(host='localhost', user='username', password='password', db='database_name') cursor = connection.cursor() for row in processed_data: cursor.execute("INSERT INTO covid19_data (name, confirmed, suspected, cured, dead) VALUES (%s, %s, %s, %s, %s)", row) connection.commit() connection.close() ``` 以上就是一个简单的基于新冠肺炎疫情数据的项目,包括数据爬取、Spark处理和MySQL存储。当然,实际的项目可能会更复杂,比如增加数据清洗、可视化等功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值