1、带参数请求数据
1-1、什么是带参数请求数据
以网址 https://y.qq.com/n/yqq/song/004Z8Ihr0JIu5s.html 为例,爬取用户的精彩评
论:
(1)确定数据所在页面
点开第0个请求(第0个请求一般都会是html),没有我们想要的评论信息。
那么就到 XHR 中查找(小 Tips:先把Network⾯板清空,再点击一下精彩评论的点击加
载更多,看看有没有多出来的新XHR,多出来的那一个,就应该是和评论相关)
【技巧总结】
(2)确定数据所在位置
点开这个请求的Preview,能够在 ['comment']['commentlist'] 里找到评论列表。列表的
每一个元素都是字典,字典里键 rootcommentcontent 对应的值,就是我们要找的评论。
(3)确定数据所在页面链接
点击请求的Headers栏:General中的Request URL,得到以下链接:https://c.y.qq.co
m/base/fcgi-bin/fcg_global_comment_h5.fcg?g_tk=5381&loginUin=0&hostUin=0&form
at=json&inCharset=utf8&outCharset=GB2312¬ice=0&platform=yqq.json&needNewC
ode=0&cid=205360772&reqtype=2&biztype=1&topid=102065756&cmd=6&needmusiccr
it=0&pagenum=1&pagesize=15&lasthotcommentid=song_102065756_3202544866_44
059185&domain=qq.com&ct=24&cv=10101010
显然,这样一个长链接,阅读体验非常之差。Network
面板提供了一个更友好的查看方式,我来带你看看它。
回到上面我们找到XHR的地方,选中Headers,保持General
打开,保持Response Headers
和Request Headers
关闭。我们点开Query String Parameters
。
它里面的内容有没有感觉眼熟?正是链接请求中所附带的参数,对吧!Query String Parameters,它的中文翻译是:查询字符串参数。
这个面板用类似字典的形式,呈现了各个参数的键值,阅读体验会好一些。我们可以常来此处看看。
1-2、如何带参数请求数据
点击精彩评论的点击加载更多按钮,此时Network会多加载出更多的XHR,主要关注
Name为 fcg_global_comment_h5… 的XHR。
image.png
分别点开它们的 Query String Parametres,会发现参数 pagenum 第一次点击加载更多
的值为 1,第二次第三次点击它的值就变成了 2 和 3 。
也就是说,pagenum=1 等于告诉服务器:我要歌曲信息列表第一页的数据;
pagenum=2:我要歌曲信息列表第二页的数据,以此类推 ...
我们只需要写一个循环,每次循环都去更改pagenum的值,这样就能实现爬取好多好多
精彩评论。
1-2-1、参数 params
requests模块里的requests.get()提供了一个参数叫params,可以让我们用字典的形式,
把参数传进去。
我们可以把Query String Parametres里的内容,直接复制下来,封装为一个字典,传递
给params。(注意:要给他们打引号,让它们变字符串)
import requests
# 引用requests模块
url = 'https://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg'
# 请求歌曲评论的url参数的前面部分
for i in range(5):
params = {
'g_tk':'5381',
'loginUin':'0',
'hostUin':'0',
'format':'json',
'inCharset':'utf8',
'outCharset':'GB2312',
'notice':'0',
'platform':'yqq.json',
'needNewCode':'0',
'cid':'205360772',
'reqtype':'2',
'biztype':'1',
'topid':'102065756',
'cmd':'6',
'needmusiccrit':'0',
'pagenum':str(i),
'pagesize':'15',
'lasthotcommentid':'song_102065756_3202544866_44059185',
'domain':'qq.com',
'ct':'24',
'cv':'10101010'
}
# 将参数封装为字典
res_comments = requests.get(url,params=params)
# 调用get方法,下载这个字典
json_comments = res_comments.json()
list_comments = json_comments['comment']['commentlist']
for comment in list_comments:
print(comment['rootcommentcontent'])
print('-----------------------------------')
2、项目:狂热粉丝
2-1、确定目标
(1)目标网站:https://y.qq.com/portal/search.html#page=1&searchid=1&remot
eplace=txt.yqq.top&t=song&w=周杰伦;
(2)项目目标:爬取周杰伦更多的歌曲信息。
2-2、过程分析
(1)确定数据所在页面
--> 点开第0个请求(第0个请求一般都会是html),没有我们想要的歌曲信息;
--> 那么就到 XHR 中查找
(小Tips:点击【歌词】,按 F5 刷新页面,再把 NetWork 面板清空,点击【单曲】,出来的就是我们要的单曲信息)。
image.png
(2)确定数据所在位置
点开这个请求的Preview,能够在 ['data']['song']['list'] 里找到评论列表。列表的每一个
元素都是字典,字典里的数据就是我们要找的歌曲信息。
image.png
(3)确定数据所在的页面链接
点击请求的Headers栏:General中的Request URL,得到以下链接:https://c.y.qq.co
m/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace
=txt.yqq.song&searchid=70663958815116982&t=0&aggr=1&cr=1&catZhida=1&lossless
=0&flag_qc=0&p=1&n=10&w=周杰伦&g_tk=5381&loginUin=0&hostUin=0&format=json&i
nCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0
(4)观察页面规律
①、先把 Network 面板清空;②、再修改 page 值按回车键;③、查看 Network 多出来
的新 XHR,也就是这个 client_search_cp ...
image.png
这个参数是 p,第 1 页XHR的参数p值为 1,第 2、3 ⻚XHR的参数 p 值则为 2 和 3,说
明在这个 client_search_cp.. 的请求中,代表⻚码的参数是 p(page 的缩写)
2-3、代码实现
# 直接运行代码就好
import requests
# 引用requests模块
url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp'
for x in range(5):
params = {
'ct':'24',
'qqmusic_ver': '1298',
'new_json':'1',
'remoteplace':'sizer.yqq.song_next',
'searchid':'64405487069162918',
't':'0',
'aggr':'1',
'cr':'1',
'catZhida':'1',
'lossless':'0',
'flag_qc':'0',
'p':str(x+1),
'n':'20',
'w':'周杰伦',
'g_tk':'5381',
'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:
# 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')
# 查找播放链接
3、Request Headers
3-1、什么是 Request Headers
每一个请求,都会有一个Requests Headers,我们把它称作请求头。它里面会有一些关
于该请求的基本信息,比如:这个请求是从什么设备什么浏览器上发出?这个请求是从哪个页面跳转而来?
image.png
- user-agent(中文:用户代理)会记录你电脑的信息和浏览器版本(如我的,就是
windows10的64位操作系统,使用谷歌浏览器); - origin(中文:源头)和referer(中文:引用来源)则记录了这个请求,最初的起源是来
自哪个页面。它们的区别是referer会比origin携带的信息更多些。
如果我们想告知服务器,我们不是爬虫是一个正常的浏览器,就要去修改user-agent。
倘若不修改,那么这里的默认值就会是Python,会被浏览器认出来。而对于爬取某些特定信
息,也要求你注明请求的来源,即origin或referer的内容。
3-2、如何添加 Request Headers
添加 Request Headers 需要封装一个字典就好了。
image.png
而修改origin或referer也和此类似,一并作为字典写入headers就好。就像这样:
import requests
url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp'
headers = {
'origin':'https://y.qq.com',
# 请求来源,本案例中其实是不需要加这个参数的,只是为了演示
'referer':'https://y.qq.com/n/yqq/song/004Z8Ihr0JIu5s.html',
# 请求来源,携带的信息比“origin”更丰富,本案例中其实是不需要加这个参数的,只是为了演示
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
# 标记了请求从什么设备,什么浏览器上发出
}
# 伪装请求头
params = {
'ct':'24',
'qqmusic_ver': '1298',
'new_json':'1',
'remoteplace':'sizer.yqq.song_next',
'searchid':'64405487069162918',
't':'0',
'aggr':'1',
'cr':'1',
'catZhida':'1',
'lossless':'0',
'flag_qc':'0',
'p':1,
'n':'20',
'w':'周杰伦',
'g_tk':'5381',
'loginUin':'0',
'hostUin':'0',
'format':'json',
'inCharset':'utf8',
'outCharset':'utf-8',
'notice':'0',
'platform':'yqq.json',
'needNewCode':'0'
}
# 将参数封装为字典
res_music = requests.get(url,headers=headers,params=params)
# 发起请求,填入请求头和参数
鉴于这个代码你已经写过也运行过,所以在这里我们不再做练习。 只需要记得Request Headers
(请求头)的含义和用法就好。
如果有一天,你真的需要爬取一万多条信息,将for循环执行成百上千次。
那么,你最好将自己的爬虫伪装成真实的浏览器(填写请求头)—— 因为在那种情况下,服务器很可能拒绝爬虫访问。甚至有的网站,一开始就不允许爬虫访问。如,知乎、猫眼电影。
网友评论