只会悲伤的芦苇

python3爬虫项目1. 找网易云音乐最多评论歌曲

网易云音乐有网页版,截图如下:


可以看到网址栏有个参数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)

评论
热度(2)

© 4cce1er | Powered by LOFTER