今天早上闲着没事,看看qq音乐的评论爬取,当然我也没有具体的爬取哪些内容,只是分析了他的请求网址。
我总结出爬取网页信息的几个方式。首先直接查看网页源代码,查看网页源代码是否有你想要的信息,如果有的话直接请求网页然后解析就行了,这是最简单的方式。不过大多数的网站都是异步加载,这时候就需要使用谷歌或者火狐浏览器的开发者模式(f12),查看请求,然后找到相应的请求网址,这样的请求一般都会有请求参数,js加密。如果前两种方式都没有找到自己想要的数据源,直接ctrl+shift+f进行全局搜索,截取自己想要数据一部分进行搜索,这样一般会找到相应的数据,js解密就需要这样找到加密参数所在的js文件。这次qq音乐评论就是这样的一个请求方式。评论没有在源码,也没有在f12找到,全局搜索才找到的。
这三个方式基本上可以找到大多数的信息,知道昨天遇到了个是这三种都没有的,它是直接在网页源代码里js生成数据,这样肯定是找不到数据的,对于实在是找不到在哪里的,直接selenium,这样所有的都可以获得,简单粗暴,不过时间比较长,对于爬取信息较少的可以采取这种方式,特别是爬取视频的时候,大多数小视频的播放地址都会通过f12在查看元素的时候找到。
昨天晚上试验了一下scrapy-splash这个,确实获取js加载之后的内容,比如爬取京东,淘宝商品信息的时候,普通的请求是啥都没用的,渲染之后会将商品信息渲染出来,我准备试试能不能将视频的地址也给渲染出来,发现其他的都能出来,就是视频地址没用出现,可能是我脚本不够全面,我也不会写那个lua脚本,只是在网上找了一个实验一下。
(1)找到信息请求:
前面的简述上,直接采用全局搜索直接寻找评论所在的请求:
我以这首歌https://y.qq.com/n/yqq/song/001Q3Rlo428b8g.html为例
随便找个评论,随便截取一小段话就ok,然后全局搜素
这就找到了相应的请求,然后复制url,到记事本上进行分析
https://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg?
g_tk=5381&jsonpCallback=jsoncallback6258181076352154&loginUin=0&hostUin=0&format=jsonp
&inCharset=utf8&outCharset=GB2312¬ice=0&platform=yqq&needNewCode=0&cid=205360772
&reqtype=2&biztype=1&topid=217264557&cmd=8&needmusiccrit=0&pagenum=0
&pagesize=25&lasthotcommentid=&callback=jsoncallback6258181076352154
&domain=qq.com&ct=24&cv=101010
这是一个很长很长很长的url,不过里面大多数的参数是没有用的,这就需要你耐心的寻找参数。
简化之后:
https://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg?
g_tk=5381&reqtype=2&biztype=1&topid={歌曲id}&cmd=8&needmusiccrit=0&pagenum={页数}&
pagesize=25&domain=qq.com&ct=24&cv=101010
是否可以继续简化我也不知道,你们可以再试试,主要变化的是两个参数,歌曲的id和页码的变换,页码可以简单的构造,但是歌曲的id我们不知道,我们要先找到歌曲id,首先查看网页源代码里是否有,发现
这就找到了,再试试其他的歌曲id能否成功,很显然是可以的。
代码很简陋,毕竟我只是讲解分析的过程,至于详细的抓取那些,读者可以自己进行改进。qq音乐评论还是很简单的,没有加密参数,网易云的就比较难。
import random
import json
import requests
def get_html(song_id,num):
user_agent = [
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0",
"Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; rv:11.0) like Gecko",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
"Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
"Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11",
"Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)",
"Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
"Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
"Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
"Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
"MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
"Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/build-1107180945; U; en-GB) Presto/2.8.149 Version/11.10",
"Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
"Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en) AppleWebKit/534.1+ (KHTML, like Gecko) Version/6.0.0.337 Mobile Safari/534.1+",
"Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.0; U; en-US) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/233.70 Safari/534.6 TouchPad/1.0",
"Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/20.0.019; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.18124",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Titan)",
"UCWEB7.0.2.37/28/999",
"NOKIA5700/ UCWEB7.0.2.37/28/999",
"Openwave/ UCWEB7.0.2.37/28/999",
"Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/999",
"Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25",
]
url='https://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg?g_tk=5381&reqtype=2&biztype=1&topid={id}&cmd=8&needmusiccrit=0&pagenum={num}&pagesize=25&domain=qq.com&ct=24&cv=101010'.format(id=song_id,num=num)
headers={
'user_agent':random.choice(user_agent)
}
h=requests.get(url=url,headers=headers)
info=json.dumps(h.text)
with open('./comment/qqmusic_comments{}.json'.format(num),'w',encoding='utf-8') as f:
f.write(info)
if __name__ == '__main__':
for i in range(100):
print("正在抓取第",i,"页")
get_html('217264557',i)