网易云音乐有网页版,截图如下:
可以看到网址栏有个参数id=xxxxx,改变参数,就是不同的歌
F12看到请求方法是get,这就简单了,只要我们迭代id,拼接url,在伪造headers就可已访问
代码应该如此:
import urlib.request as URL
import re
import string
for id in range(xxxx,yyyy):
url='https://music.163.com/#/song?id='+str(id)
headers={'user-agent':'xxx','connection':'xxx'}
req=URL.Request(url,headers=headers)
pageCode=URL.urlopen(req)
得到pageCode后我们要用正则表达式找到歌曲名称,和它的id,还有评论数
不过要注意id=xxxxx可能出现这个页面是空的,实际看一下如下:
我们就需要忽略这个网页,同样用正则表达式匹配,
大功告成了,运行一下啊
咦,错了!!debug吧..1,2个小时后终于成功了!
解释一下
1.没有网站想身上满是爬虫,网易同样,于是玩了个小花招。
程序添加语句print(pageCode),保存程序命名为music163.py
~$ python music163.py | grep 'Only You' #歌名为only you
会发现下没有输出,奇怪,歌名不可能不在网页代码中阿,回去看第一张图,发现下面还有一个GET, song?id=xxxxxx,哎,为什么还有一个?....其实这才是真的完整的,查看一下
原来真正的url为 https://music.163.com/song?id=xxxxx没有中间的#
好的现在我们再试试grep 'Only You' 可以了
这下可以了吧?但是....还有得不到评论数
2.F12看到的源代码不是你真正得到的pagecode
哎,太懒了,就不发图了,依旧要print(pagecode),然后用grep '评论' '歌手' '歌名'
好了找到代码行,依据grep得到的代码来进行正则表达式.
最后贴上我的代码
# _*_ coding=utf-8 _*_
import urllib.request as URL
import re
import string
def getCode(url):
headers={'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:41.0) Gecko/20100101 Firefox/41.0','Connection':'keep-alive','Host':'music.163.com'}
request=URL.Request(url,headers=headers)
code=URL.urlopen(request).read().decode('utf-8')
str404='很抱歉'
pattern=re.compile(str404,re.S)
if not pattern.findall(code) :
return code
else :
print('这个页面没歌')
return '404'
def getNumber(code):
view='
.*?(.*?).*?评论.*?([\d]+).*?'
pattern=re.compile(view,re.S)
items=pattern.findall(code)
for item in items:
return int(item[1])
mnum=0
idnum=0
baseurl='https://music.163.com/song?id='
for i in range(10000000,10000100):#这里更改id值上下限
url=baseurl+str(i)
print(url)
code=getCode(url)
if code == '404' :
continue
else :
t=getNumber(code)
if t > mnum :
mnum=t
idnum=i
else :
continue
print('最多评论数的id: ',idnum,'评论数为: ',mnum)