好,现在这么多东西了,我就直接跟你说要的东西就在这里面,你要怎么找?一个一个点开吗?你会发现很多都是传一些边角料,再然后,你会发现那些边角料都比目标文案要小很多,所以就直接找size最大的那个点进去就好。
咱也不绕弯子了,进去之后直接点Preview。
好,Preview点进去之后自己玩一玩,看看里面都是些啥。
看完之后,回来,跟我点开旁边的Headers。
好,看到了什么?一个网址是吧,复制它,打开它,是不是和Preview里面的一模一样,只是排版乱了些。
我就不贴了啊,密集恐惧症就别点开了。
这说明什么?这说明我们要爬的网址其实是这个。
注:如果这个网址打不开,那就不用爬了,人家并不想让你爬。
那么,对于这份XHR来说:这个XHR是一个字典,键data对应的值也是一个字典;在该字典里,键song对应的值也是一个字典;在该字典里,键list对应的值是一个列表;在该列表里,一共有20个元素;每一个元素都是一个字典;在每个字典里,键name的值,对应的是歌曲名。
会不会乱?我觉得不会啊,除非你没有一步一步实操跟进。
讲到这里还没有讲到 json串 啊,你先把这个网页爬出来,打印出来看看,是一个又有点像字典,又有点像字符串的玩意儿。
这玩意儿就是json串了。
答案很简单,因为不是所有的编程语言都能读懂Python里的数据类型(如,列表/字典),但是所有的编程语言,都支持文本(比如在Python中,用字符串这种数据类型来表示文本)这种最朴素的数据类型。
如此,json数据才能实现,跨平台,跨语言工作。
而json和XHR之间的关系:XHR用于传输数据,它能传输很多种数据,json是被传输的一种数据格式。就是这样而已。
我们总是可以将json格式的数据,转换成正常的列表/字典,也可以将列表/字典,转换成json。
how json?方法很简单,请求到数据之后,使用json()方法即可成功读取。接下来的操作,就和列表/字典相一致。
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=67818388354301120&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=10&w=林志炫&g_tk_new_20200303=5381&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对象,转为列表/字典
print(json_music)
# 打印json_music的数据类型
12345678
所以接下来怎么办呢?
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=67818388354301120&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=10&w=林志炫&g_tk_new_20200303=5381&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')
# 查找播放链接
123456789101112131415161718
小爬虫又来啦
这回,通过我们的一顿操作猛如虎,可算是找对了网址啊:
https://blog.csdn.net/phoenix/web/v1/comment/list/108858689?page=1&size=10&commentId=
这是第一页的评论网址。
好极,我们开始吧。
import requests
res = requests.get('https://blog.csdn.net/phoenix/web/v1/comment/list/108858689?page=1&size=10&commentId=')
# 发起请求,填入请求头和参数
print(res.status_code)
print(res.text)
12345678
好极,就试了下水就让人给怼回来了。。。
莫非今天还真爬不过去了?
不知道,再说吧。。
易容术:请求头Request Headers
服务器可能会对我们这些“投机取巧”的爬虫做限制处理。一来可以降低服务器的访问压力,毕竟成千上万次的访问对代码来说就是一个for循环的事儿;二来可以拦截那些想要通过爬虫窃取数据的竞争者。
那这就有一个问题,服务器怎么判断访问者是一个普通的用户(通过浏览器),还是一个爬虫者(通过代码)呢?
这需要我们回到浏览器中,重新认识一个新的信息栏:请求头Request Headers。
什么是Request Headers看下面这张图