Python爬虫+数据可视化+存入数据库(1)

        学习一下如何网站爬虫,绝对够细,嘿嘿,也就会一些普通的数据爬取,像什么vip类似的数据的访问是被隐藏,当然技术够深也可以去尝试,但请遵守相关法律法规。其思想就,获取浏览器的信息,来模拟用户访问网站,再通过手法提取信息。

一、获取网站信息

        这里我们选择qq音乐的官网,登录一下,更好去爬:https://y.qq.com/n/ryqq/toplist/62

获取相关请求头信息

         我们使用python爬取数据过程中,需要一些信息模拟一个浏览器访问,而这些信息每个人的不一定相同,所以我们需要去获取。一般笔记本电脑使用快捷键Fn+F12,或者浏览器设置-->更多工具-->开发人员工具:

      1.先找到网络一栏,

      2.找一个页面能够查找User-Agent等信息

      3.点击标头

      4.粘贴复制

具体代码:

import requests

# 获取请求头信息,并定义一个字典为其进行存储,一般一个User-Agent就可以了,加一个cookie是为了降低网站拒绝访问的概率,也可以添加其他更多信息,模拟一个用户。

headers = {
		'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Mobile Safari/537.36 Edg/113.0.1774.35',
		'cookie' :'ptcz=6d2a7bcf0c658e1001e746d236f462b5dd97cf708332405dc4fd47352b4da897; RK=2otBczRsNr; eas_sid=l1S7M2L1C2T9R3m7N4F7d740k9; LW_sid=n1Y7I2c1c2f9X3H7P590K9h9w7; LW_uid=y1Z7x2d1R2x9f317x5r0d9t9p8; pgv_pvid=3751495580; fqm_pvqid=f95764f3-fa80-498c-b515-cf7de7f2d99d; fqm_sessionid=1968a848-8e96-4315-a457-949143aa5550; pgv_info=ssid=s5467148524; ts_uid=7810833049; _qpsvr_localtk=0.7545134021278037; login_type=1; wxopenid=; qqmusic_key=Q_H_L_63k3NdbQE3sNy0Yar28HGEzp7V_3s00FQHUXEWtO95XONEjPNQmZQL3FzwbcLWIbjLsN4hLH9xzddiawqq-g; music_ignore_pskey=202306271436Hn@vBj; wxrefresh_token=; tmeLoginType=2; psrf_qqrefresh_token=1EAEA9F5377370645118F628CC9800CF; euin=oK4koi-F7enPoz**; psrf_qqopenid=901D50A63BE4ADB644C944B0D6D760FD; qm_keyst=Q_H_L_63k3NdbQE3sNy0Yar28HGEzp7V_3s00FQHUXEWtO95XONEjPNQmZQL3FzwbcLWIbjLsN4hLH9xzddiawqq-g; psrf_musickey_createtime=1721477030; psrf_access_token_expiresAt=1729253030; uin=1553284043; psrf_qqaccess_token=1BA82A4E1431F9141338286AD53A04F3; wxunionid=; psrf_qqunionid=4780E6A6A3196E17D9EF4E385AABA028; ts_last=y.qq.com/n/ryqq/toplist/62; ts_refer=www.baidu.com/'
}

# 输入要爬取的网址
url = 'https://y.qq.com/n/ryqq/toplist/62'

# 开始爬取
res = requests.get(url, headers=headers)
print(res.text)

运行结果:

补充,如果要保存音乐,视频等,需要相应下载链接,以下是主要代码:

# 文件写、读常用库
import os

response = requests.get(链接)

with open('想要保存到的电脑文件地址', 'wb') as f:
        f.write(response.content)
 

二、整理数据

1.获取分列数据

(1)获取的数据是杂乱无章的,我们可以分步打印每一列数据前端来看看,使用快捷键Fn+F12,或者浏览器设置-->更多工具-->开发人员工具,先去点击元素,然后用鼠标放在(不要点击)每一个标签对查看左边阴影部分显示情况,最终我们发现songlist__item刚好涵盖我们所要提取的信息,然后没必要再继续下去查找。

(2)代码如下:

# 数据提取主要用这个库
from bs4 import BeautifulSoup

"""
获取网站信息的代码块
"""

# 将获取的信息放入一个池中
soup = BeautifulSoup(res.text, 'html.parser')

# 通过select 选择刚才查找到标签对名(这样标签对不止一个,所以我们要迭代查询)
for music in soup.select('.songlist__item'):
	print(music)
	print('***'*30)

(3)运行结果:

2.标签对信息再细化

标签对的信息还是杂乱无章,我们可以进一步分类

(1)使用select方法,我们可以获取到标签里面的内容,select('name')里面的name:当使用class定义用 .name ,id定义用#name,标签名定义直接用本名。也可以迭代使用,用空格隔开,如select('.text p'),访问的就是class标签对里面的标签对p里面的内容。

(2)使用select获取所需数据

from bs4 import BeautifulSoup

"""
获取网站信息的代码块
"""

soup = BeautifulSoup(res.text, 'html.parser')
for music in soup.select('.songlist__item'):
# 排行榜
	topNo = music.select('.songlist__number')[0].text   # tag类型需要转化为text, 否则无法使用text属性
# 歌名
	songName = music.select('.songlist__songname span a')[0]['title']
# 歌链接,因为直接获取的地址不全,所以我们需要+'https://y.qq.com/{}'.format()
	href = 'https://y.qq.com/{}'.format(music.select('.songlist__songname span a')[0]['href'])

# 歌手
	singer = music.select('.songlist__artist')[0].text

# 时长
	time = music.select('.songlist__time')[0].text
	print(topNo+'   '+songName+'   '+href+ '   '+singer +'   '+time)

(3)实现结果

3.信息录入csv

        通过第二步获取的数据只能在控制台,那么我们需要一个文件来保存这些信息,这里我们采用csv文件

(1)定义几个列表,然后存储数据

(2)每次迭代过程中,利用append()添加到列表中

topNos.append(topNo)
songNames.append(songName)
hrefs.append(href)
singers.append(singer)
times.append(time)

(3)将列表数据存入csv中,这里需要Pandas来构建数据表

import pandas as pd
df = pd.DataFrame()
df['排行'] = topNos
df['歌名'] = songNames
df['地址'] = hrefs
df['歌手'] = singers
df['时长'] = times
df.to_csv('排行榜.csv', encoding='utf_8_sig')

(4)在文件夹里面会有这个文件打开可以查看,也可以去电脑相关地址去查看,类似excel表格

三、最终代码

只需要改一下请求头就可以爬取了

import requests
import pandas as pd
from bs4 import BeautifulSoup

topNos = []
songNames = []
hrefs= []
singers = []
times = []

headers = {
		'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Mobile Safari/537.36 Edg/113.0.1774.35',
		'cookie' :'ptcz=6d2a7bcf0c658e1001e746d236f462b5dd97cf708332405dc4fd47352b4da897; RK=2otBczRsNr; eas_sid=l1S7M2L1C2T9R3m7N4F7d740k9; LW_sid=n1Y7I2c1c2f9X3H7P590K9h9w7; LW_uid=y1Z7x2d1R2x9f317x5r0d9t9p8; pgv_pvid=3751495580; fqm_pvqid=f95764f3-fa80-498c-b515-cf7de7f2d99d; fqm_sessionid=1968a848-8e96-4315-a457-949143aa5550; pgv_info=ssid=s5467148524; ts_uid=7810833049; _qpsvr_localtk=0.7545134021278037; login_type=1; wxopenid=; qqmusic_key=Q_H_L_63k3NdbQE3sNy0Yar28HGEzp7V_3s00FQHUXEWtO95XONEjPNQmZQL3FzwbcLWIbjLsN4hLH9xzddiawqq-g; music_ignore_pskey=202306271436Hn@vBj; wxrefresh_token=; tmeLoginType=2; psrf_qqrefresh_token=1EAEA9F5377370645118F628CC9800CF; euin=oK4koi-F7enPoz**; psrf_qqopenid=901D50A63BE4ADB644C944B0D6D760FD; qm_keyst=Q_H_L_63k3NdbQE3sNy0Yar28HGEzp7V_3s00FQHUXEWtO95XONEjPNQmZQL3FzwbcLWIbjLsN4hLH9xzddiawqq-g; psrf_musickey_createtime=1721477030; psrf_access_token_expiresAt=1729253030; uin=1553284043; psrf_qqaccess_token=1BA82A4E1431F9141338286AD53A04F3; wxunionid=; psrf_qqunionid=4780E6A6A3196E17D9EF4E385AABA028; ts_last=y.qq.com/n/ryqq/toplist/62; ts_refer=www.baidu.com/'
}
url = 'https://y.qq.com/n/ryqq/toplist/62'
res = requests.get(url, headers=headers)

soup = BeautifulSoup(res.text, 'html.parser')
for music in soup.select('.songlist__item'):
	topNo = music.select('.songlist__number')[0].text
	songName = music.select('.songlist__songname span a')[0]['title']
	href = 'https://y.qq.com/{}'.format(music.select('.songlist__songname span a')[0]['href'])
	singer = music.select('.songlist__artist')[0].text
	time = music.select('.songlist__time')[0].text
	topNos.append(topNo)
	songNames.append(songName)
	hrefs.append(href)
	singers.append(singer)
	times.append(time)
df = pd.DataFrame()
df['排行'] = topNos
df['歌名'] = songNames
df['地址'] = hrefs
df['歌手'] = singers
df['时长'] = times
df.to_csv('排行榜.csv', encoding='utf_8_sig')

暂时就更新到这里,有时间再去更新

针对有python基础再去尝试学习爬虫,当然没基础可以去推荐以下网站(免费使用,无需登录):           Python3 教程 | 菜鸟教程 (runoob.com)

### Python 爬虫数据分析项目概述 在构建一个整合了Python爬虫MySQL存储、Echarts可视化、百度地图API以及预测算法并在Flask中实现的项目时,可以遵循以下架构设计[^1]。 #### 架构组件详解 - **数据采集层** 使用`requests`库发起HTTP请求并结合`BeautifulSoup4`解析网页内容。通过编写特定规则来抓取目标网站的数据,并将其保存到本地文件或直接存入数据库。 - **数据持久化层** 利用`Flask-SQLAlchemy`作为ORM工具连接至MySQL数据库完成数据模型定义及增删改查操作。确保每次爬取的新鲜数据能够被有效记录下来以便后续处理分析。 - **业务逻辑层** 应用机器学习库如`scikit-learn`实施预测建模工作流,包括但不限于特征工程、训练测试集划分、模型评估等环节。此部分负责核心计算任务并将结果反馈给前端展示模块。 - **交互呈现层** 结合`Flask`框架搭建Web应用服务器端接口服务;采用`ECharts`图表库渲染动态图形界面供用户直观理解数据趋势变化情况;调用第三方地理信息服务提供商——百度地图开放平台所提供的各类API接口增强位置感知能力。 ```python from flask import Flask, render_template import pymysql from bs4 import BeautifulSoup import requests import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression import echarts.options as opts from echarts.charts import Line app = Flask(__name__) @app.route('/') def index(): # 进行数据查询... c = ( Line() .add_xaxis(['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']) .add_yaxis("series0", [120, 200, 150, 80, 70, 110, 130]) .set_global_opts(title_opts=opts.TitleOpts(title="Line Chart")) ) return render_template('index.html', myechart=c.render_embed(), host='https://cdn.jsdelivr.net/npm/echarts@latest/dist') ``` 上述代码片段展示了如何利用Flask创建简单的路由函数返回包含Echarts图标的HTML页面[^2]。 对于地理位置相关的功能,则可以通过向百度地图API发送GET请求获取JSON响应体中的坐标信息用于标记点位显示或其他空间分布统计用途。 ```python url = f"http://api.map.baidu.com/geocoding/v3/?address={formatted_address}&output=json&ak={your_api_key}" response = requests.get(url).json() if response['status'] == 0: location_data = response['result']['location'] else: print(f"Error occurred: {response}") ``` 以上示例说明了怎样借助外部API资源扩充应用程序的功能特性集合[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值