- 抓取动态网页 网页分为动态和静态
- 静态页面:
非结构化数据:HTML
处理方式:正则表达式,xpath, beautifulsoup4
静态页面中的数据都包含在网页的HTML中(一般都是get请求)
所以可以直接在网页的HTML中提取数据
关键词一般都以查询字符串的方式拼接在URL中
分析URL的变化可以进行多页爬取
- 动态页面
结构化数据:json,xml等
处理方式:直接转化为python类型
动态页面和静态页面最主要的区别就是当数据刷新的时候用了ajax技术,刷新时从数据库查询数据并重新渲染到前端页面
数据都存储在json中,爬取HTML是获取不到数据的
json数据提取技术(jsonpath)
动态页面都需要动态抓包来获取response中的json数据
刷新页面,打开开发者模式,点击Network,在点击XHR,找到获取json数据的URL
.json有4个方法(json.loads(), json.dumps())括号中接收字符串 (json.load(), json.dumps())括号中接收的是文件
loads: 将json数据转换成python数据 dumps: 将python数据转化成json数据
jsonpath的语法与xpath的语法很相似
$: 根节点 . : 下一级节点 通常用法: $…节点名
jsonpath中接收的参数必须是python类型的
例如: result_list = jsonpath(python_dict,"$…result")
可以在发送请求时使用.json()的方法获取python数据
本文来自转载
转载 地址
我们来抓取一下QQ音乐这个网站的歌单信息 QQ网址 我们来爬取一下周董的歌单
我们可以看到页面地址发生了改变
我们现在开始解析网页 我们可以看到 内容在span标签 属性为class='songlist__songname_txt’里面
from bs4 import BeautifulSoup
res = requests.get('https://y.qq.com/portal/search.html#page=1&searchid=1&remoteplace=&t=song&w=%E9%82%93%E7%B4%AB%E6%A3%8B')
bs = BeautifulSoup(res.text,'html.parser')
list = bs.find_all(class_='songlist__songname_txt')
for m in list:
#title为文本信息
print(m['title'])
print(list)
我们可以看到为空说明我们和往常一样已经获取不到信息了
我们响应里面看看
我们可以看到要数据的在这个xhr里面data 下的song下的list下的name是我们的歌单的信息
我们在来确认一下是不是我们要的数据复制一下里面的url地址看看
我们可以确定了url就在这个链接里面
开始获取数据和上述步骤一样
我们可以看到已经成功获取了歌单歌曲列表了
代码如下
import requests
improt json
# 引用requests库
res_music = requests.get('https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=60997426243444153&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=20&w=%E5%91%A8%E6%9D%B0%E4%BC%A6&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0')
# 调用get方法,下载这个字典
json_music = res_music.json()
# 使用json()方法,将response对象,转为列表/字典
list_music = json_music['data']['song']['list']
# 一层一层地取字典,获取歌单列表
for music in list_music:
# list_music是一个列表,music是它里面的元素
print(music['name'])
我们在来获取歌单名 专辑名 和播放链接
# import requests
# # 引用requests库
# res_music = requests.get\
# (
# 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=60997426243444153&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=20&w=%E5%91%A8%E6%9D%B0%E4%BC%A6&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0')
# # 调用get方法,下载这个字典
# json_music = res_music.json()
# # 使用json()方法,将response对象,转为列表/字典
# list_music = json_music['data']['song']['list']
# # 一层一层地取字典,获取歌单列表
# for music in list_music:
# # list_music是一个列表,music是它里面的元素
# print(music['name'])
# # 以name为键,查找歌曲名
# print('所属专辑:'+music['album']['name'])
# # 查找专辑名
# print('播放时长:'+str(music['interval'])+'秒')
# # 查找播放时长
# print('播放链接:https://y.qq.com/n/yqq/song/'+music['mid']+'.html\n\n')
# # 查找播放链接
大功告成
我们想保存怎么办呢?
我们用openpyxl这个模块
import requests
# 引用requests模块
import openpyxl
#引用openpyxl模块
wb=openpyxl.Workbook()
#创建工作薄
sheet=wb.active
#获取工作薄的活动表
sheet.title='song'
#工作表重命名
sheet['A1'] ='歌曲名' #加表头,给A1单元格赋值
sheet['B1'] ='所属专辑' #加表头,给B1单元格赋值
sheet['C1'] ='播放链接' #加表头,给C1单元格赋值
url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp'
name = input('你喜欢的歌手是谁呢?')
page = int(input('请输入需要查询的歌曲页数:'))
for x in range(page):
params = {
'ct':'24',
'qqmusic_ver': '1298',
'new_json':'1',
'remoteplace':'txt.yqq.song',
'searchid':'70717568573156220',
't':'0',
'aggr':'1',
'cr':'1',
'catZhida':'1',
'lossless':'0',
'flag_qc':'0',
'p':str(x+1),
n是偏移量每页是10个也就是每页的最大个数我这是里改成了20
所以每页的数量是20
'n':'20',
#w 是歌手 name定义的歌手名字
'w':name,
'g_tk':'714057807',
'loginUin':'0',
'hostUin':'0',
'format':'json',
'inCharset':'utf8',
'outCharset':'utf-8',
'notice':'0',
'platform':'yqq.json',
'needNewCode':'0'
}
# 将参数封装为字典
res_music = requests.get(url,params=params)
# 调用get方法,下载这个列表
json_music = res_music.json()
# 使用json()方法,将response对象,转为列表/字典
list_music = json_music['data']['song']['list']
# 一层一层地取字典,获取歌单列表
for music in list_music:
song_name = music['name']
# 以song_name为键,查找歌曲名,把歌曲名赋值给name
album = music['album']['name']
# 查找专辑名,把专辑名赋给album
link = 'https://y.qq.com/n/yqq/song/' + str(music['mid']) + '.html\n\n'
# 查找播放链接,把链接赋值给link
sheet.append([song_name, album, link])
# 把name、album和link写成列表,用append函数多行写入Excel
wb.save(name + '个人单曲排行前' + str(page * 20) + '清单.xlsx')
print('下载成功')
更多openpyxl学习详情看文档地址 我们这可以看到已经保存成功了
总结 json是字典格式所以我们要转换成列表
然后在保存到Excel里
爬取动态网站比较难因为所要爬取的内容不在网页里面
需查看 XHR 一般需要使用json 格式如下
res = requests.get(url)
json = res.json()
list = json[‘’][‘’]…
关于数据存储可以使用scv文本保存也可以直接存入到数据库里面
更多内容 后面在讲