学习一下如何网站爬虫,绝对够细,嘿嘿,也就会一些普通的数据爬取,像什么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)