在使用urllib2或者requests爬取网页时,碰到了问题,网页的数据是通过Ajax方式加载的,返回的html代码和网页开发者调试中显示的内容不一致,类似于下面这样
上面第一张是开发者选项中的源码,下面这是requests返回的html代码,明显不同。所以通过requests是无法准确筛选出我们需要的信息。
这时候我们就需要通过POST方式获取到服务器发送的json信息,然后进行筛选。如何获取,这里以获取网页版网易云音乐中的
see you again 的第一页的热评和评论为例:
(1) 首先,我们进入网页版网易云搜索 see you again,打开开发者选项,发现html文档是GET方式获取的,获取URL是http://music.163.com/ 这和我们使用requests获取到的html是一样的,这里面没有我们需要的数据。:
(2) 我们需要的是服务器返回的json数据,所以需要找到POST方式的数据报,最后在一个叫R_SO_4_30953009?csrf_token=的报文中找到了我们需要的东西:
(3) 在这里可以找到我们需要请求的url:https://music.163.com/weapi/v1/resource/comments/R_SO_4_30953009?csrf_token=
(4) 找到POST方式所需要的data参数中的参数:
(5) 这样就可以开始写代码了,首先是构造请求头headers(User-Agent在开发者选项中,可以很容易找到)
headers = {
'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36'
}(6) 接下来就是构造data参数了(使用urllib.urlencode()函数):
formdata = {'params':'fEUAM7XX0lBilMwQFedL8FRIJbth4aTXb59CZr1B5aS8pKCELUyngAxNoKXx6H1a1I8ApupuvkyShet/JMqYeWVg24t6piN+WEqnFw+X1xG4spx0KDY9vLxqCX1r9rsnav97P+cwtbHt4+bR3K4gzOmnQ05ljaR1lrKborwWQpw0Q+mURh1NUKr95FpWLJXm',
'encSecKey':'63cfc4cbe30dadd4f7b0e0f431a3ea86461487cf6385a7f475cf2423e735d7e588fea80f4b4cdbfc2a157038d88aa42507b8571609388f2df8cfe6b5f7385e01cc7ce2053f29e9b620bf3ffa44fb6372e6c9a5bd75018de415f83e24cf3ac51be5f1289cbbfe3f79aa6a3d8a90a6409e6597881fafbb978513814a919bea6188'}
data = urllib.parse.urlencode(formdata).encode()(7) 最后上代码(一个很简单的代码,只是获取了第一页的热评和评论):
import urllib.request as urllib2
import urllib
import json
#构造url,headers,data参数
url = 'https://music.163.com/weapi/v1/resource/comments/R_SO_4_30953009?csrf_token='
headers = {
'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36'
}
formdata = {'params':'fEUAM7XX0lBilMwQFedL8FRIJbth4aTXb59CZr1B5aS8pKCELUyngAxNoKXx6H1a1I8ApupuvkyShet/JMqYeWVg24t6piN+WEqnFw+X1xG4spx0KDY9vLxqCX1r9rsnav97P+cwtbHt4+bR3K4gzOmnQ05ljaR1lrKborwWQpw0Q+mURh1NUKr95FpWLJXm',
'encSecKey':'63cfc4cbe30dadd4f7b0e0f431a3ea86461487cf6385a7f475cf2423e735d7e588fea80f4b4cdbfc2a157038d88aa42507b8571609388f2df8cfe6b5f7385e01cc7ce2053f29e9b620bf3ffa44fb6372e6c9a5bd75018de415f83e24cf3ac51be5f1289cbbfe3f79aa6a3d8a90a6409e6597881fafbb978513814a919bea6188'}
data = urllib.parse.urlencode(formdata).encode()
#发送POST请求
req = urllib2.Request(url,data = data, headers=headers)
response =urllib2.urlopen(req).read().decode()
#使用loads进行反序列化
json_dict = json.loads(response)
#获取热评和评论
hot_comments_list = json_dict['hotComments']
comment_list = json_dict['comments']
num = 0
#打印热评
print('热评: ')
for i in hot_comments_list:
num+=1
print(str(num)+': '+i['content'])
#打印评论
print()
print('评论: ')
for i in comment_list:
num+=1
print(str(num)+': '+i['content'])
(8) 结果是这样的:
版权声明:本文为chibuqikendeji原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。