博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态网页抓取一
阅读量:3939 次
发布时间:2019-05-23

本文共 4674 字,大约阅读时间需要 15 分钟。

  • 抓取动态网页 网页分为动态和静态
  • 静态页面:
    非结构化数据: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音乐这个网站的歌单信息

我们来爬取一下周董的歌单
我们可以看到页面地址发生了改变
在这里插入图片描述
我们现在开始解析网页 我们可以看到 内容在span标签 属性为class='songlist__songname_txt’里面
在这里插入图片描述

from bs4 import  BeautifulSoupres = 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 requestsimprot 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函数多行写入Excelwb.save(name + '个人单曲排行前' + str(page * 20) + '清单.xlsx')print('下载成功')

更多openpyxl学习详情看文档

我们这可以看到已经保存成功了
在这里插入图片描述
总结 json是字典格式所以我们要转换成列表
然后在保存到Excel里
爬取动态网站比较难因为所要爬取的内容不在网页里面
需查看 XHR 一般需要使用json 格式如下

res = requests.get(url)

json = res.json()

list = json[‘’][‘’]…

关于数据存储可以使用scv文本保存也可以直接存入到数据库里面
更多内容 后面在讲

你可能感兴趣的文章
介绍个学习Linux的好网站
查看>>
Eclipse中jar包注释乱码问题的解决
查看>>
AIX 系统介绍
查看>>
Oracle的初学者入门心得
查看>>
精妙的SQL语句
查看>>
Sublime Text3 常用操作汇总
查看>>
浅谈JAVA ThreadPoolExecutor
查看>>
精炼口语短语446句
查看>>
Oracle千万条记录插入与查询小结
查看>>
JavaScript 对象总结
查看>>
JavaScript中的事件处理
查看>>
JavaScript中的对象化编程
查看>>
JavaScript框架编程
查看>>
JavaScript的Cookies
查看>>
107条Javascript的常用语句
查看>>
JavaScript网页特效5则
查看>>
DEDECMS BUG汇总
查看>>
Install Github for windows
查看>>
html5 常用
查看>>
node-webkit:开发桌面+WEB混合型应用的神器
查看>>