• 元宇宙:本站分享元宇宙相关资讯,资讯仅代表作者观点与平台立场无关,仅供参考.

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

  • AI科技大本营
  • 2022年2月08日09时

作者 | 黄伟呢

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

1. 页面分析

我爬取的页面是腾讯体育,链接如下:
https://nba.stats.qq.com/player/list.htm
观察上图:左边展示的分别是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个编号。
只要是涉及到“腾讯”二字,基本都是动态网页,我之前碰到过好多次。基础方法根本获取不到数据,不信可以查看网页源码试试:点击鼠标右键——>点击查看网页源代码。
部分截图如下
接着,将网页中的某个数据(你要获取的)复制,然后再源代码页面中,点击crtl + f,调出“搜索框”,将复制的数据粘贴进去。如果和上图一样,出现0条记录,则基本可以判断该网页属于动态网页,直接获取源码,一定找不到你要的数据。
因此如果你想要获取页面中的数据,使用selenuim自动化爬虫,是其中一种办法。

2. 数据爬取

我喜欢用xpath,对于本文数据的获取,我都将使用它。关于xpath的使用,那就是另一篇文章了,这里就不详细讲述。
说了这么多,咋们直接上代码吧!
fromseleniumimportwebdriver

#创建浏览器对象,该操作会自动帮我们打开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.textforiinchinese_names]

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

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

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

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

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

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

#获取球员球龄
qiu_lings=browser.find_elements_by_xpath('//div[@class="players"]//tr[@class="show"]/td[9]')
qiu_lings_list=[i.textforiinqiu_lings_list]
这里只爬取了一支球队,剩下29支球队球员数据的爬取任务交给你们。整个代码部分,基本上大同小异,我写了一个,你们照葫芦画瓢。【就一个循环,还不简单呀!】

3. 存储至txt

将数据保存到txt文本的操作非常简单,txt几乎兼容所有平台,唯一的缺点就是不方便检索。要是对检索和数据结构要求不高,追求方便第一的话,请采用txt文本存储。
注意:txt中写入的是str字符串。
txt文档写入数据的规则是这样的:从头开始,从左至右一直填充。当填充至最右边后,会被挤到下一行。因此,如果你想存入的数据规整一点,可以自动填入制表符“\t”和换行符“\n”。
以本文为例,将获取到的数据,存储到txt文本中。
foriinzip(chinese_names_list,english_names_list,numbers_list,locations_list,heights_list,weights_list,ages_list,qiu_lings_list):
withopen("NBA.txt","a+",encoding="utf-8")asf:
#zip函数,得到的是一个元组,我们需要将它转换为一个字符串
f.write(str(i)[1:-1])
#自动换行,好写入第2行数据
f.write("\n")
f.write("\n")
部分截图如下:

4. 存储至excel

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

#一定要学会组织数据
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)
结果如下:

5. 存储至mysql

MySQL是一个关系型数据库,数据是采用类excel的二维表来保存数据的,即行、列组成的表,每一行代表一条记录,每一列代表一个字段。
关于Python操作MySQL数据库,我曾经写了一篇博客,大家可以参考以下:
blog.csdn.net/weixin_41261833/article/details/103832017
为了让大家更明白这个过程,我分布为大家讲解:
① 创建一个表nba
我们想要往数据库中插入数据,首先需要建立一张表,这里命名为nba。
importpymysql

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

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

#建表语句;
sql="""
createtableNBA(
chinese_names_listvarchar(20),
english_names_listvarchar(20),
numbers_listvarchar(20),
locations_listvarchar(20),
heights_listvarchar(20),
weights_listvarchar(20),
ages_listvarchar(20),
qiu_lings_listvarchar(20)
)charset=utf8
"""

#执行sql语句;
cursor.execute(sql)

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

#1.组织数据
data_list=[]
foriinzip(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='insertintonba(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()
结果如下:

资讯

谷歌使出禁用2G大招

技术

干货满满的python实战项目!

技术

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

技术

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


分享

点收藏

点点赞

点在看

WX

AI科技大本营文章

WEB3.0相关文章

Copyright © 2021.Company 元宇宙YITB.COM All rights reserved.元宇宙YITB.COM