动态网页抓取一

  • 抓取动态网页 网页分为动态和静态
  • 静态页面:
    非结构化数据: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=txt.yqq.top&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&notice=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&notice=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文本保存也可以直接存入到数据库里面
更多内容 后面在讲

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值