本文共 4674 字,大约阅读时间需要 15 分钟。
处理方式:正则表达式,xpath, beautifulsoup4
静态页面中的数据都包含在网页的HTML中(一般都是get请求)
所以可以直接在网页的HTML中提取数据
关键词一般都以查询字符串的方式拼接在URL中
分析URL的变化可以进行多页爬取处理方式:直接转化为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¬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函数多行写入Excelwb.save(name + '个人单曲排行前' + str(page * 20) + '清单.xlsx')print('下载成功')
更多openpyxl学习详情看文档
我们这可以看到已经保存成功了 总结 json是字典格式所以我们要转换成列表 然后在保存到Excel里 爬取动态网站比较难因为所要爬取的内容不在网页里面 需查看 XHR 一般需要使用json 格式如下res = requests.get(url)
json = res.json()
list = json[‘’][‘’]…
关于数据存储可以使用scv文本保存也可以直接存入到数据库里面 更多内容 后面在讲