爬虫实践---悦音台mv排行榜与简单反爬虫技术应用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爬虫实践---悦音台mv排行榜与简单反爬虫技术应用相关的知识,希望对你有一定的参考价值。

由于要抓取的是悦音台mv的排行榜,这个排行榜是实时更新的,如果要求不停地抓取,这将有可能导致悦音台官方采用反爬虫的技术将ip给封掉。所以这里要应用一些反爬虫相关知识。

目标网址http://vchart.yinyuetai.com/vchart/trends?area=ML

网站结构:

技术分享

上面红线圈出来的地方都是需要注意的小细节:

首先 排行榜分为,内地、港台、欧美、韩国、日本五个地区
分别将其点开能够观察到url的变化为在最尾部加了一个参数:area=地区参数

很容易的就能知道参数列表:[‘ML‘,‘HT‘,‘US‘,‘JP‘,‘KR‘] 分别对应着内地、香港、欧美、日本、以及韩国。发现这个规律之后,只要通过简单的对url的变化就能多次请求,筛选出想要的信息。

其次 可以发现,有的mv分数是呈现上升趋势,有的mv的分数是成下降趋势,这在网页的代码结构稍有不同。

最后,可以看到 这里mv的排行榜数据是实时更新的,所以爬虫程序要不停的在后台运行才能保证获得的数据是最新的,这样就会引起官方人员的注意,他们的反爬虫技术有可能就会将爬虫的IP封掉。

完整代码:

import requests
from bs4 import BeautifulSoup
import random

def get_html(url):
    try:
        r = requests.get(url,timeout=30)
        r.raise_for_status
        r.encoding = utf-8
        return r.text
    except:
        return error

def get_agent():
    ‘‘‘
    模拟header的user-agent字段,
    返回一个随机的user-agent字典类型的键值对
    ‘‘‘
    agents = [Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;,
              Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; 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,
              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; 360SE)]
    fakeheader = {}
    fakeheader[User-agent] = agents[random.randint(0, len(agents))]
    return fakeheader

def get_proxy():
    ‘‘‘
    简单模拟代理池
    返回一个字典类型的键值对,
    ‘‘‘
    proxy = ["http://116.211.143.11:80",
             "http://183.1.86.235:8118",
             "http://183.32.88.244:808",
             "http://121.40.42.35:9999",
             "http://222.94.148.210:808"]
    fakepxs = {}
    fakepxs[http] = proxy[random.randint(0, len(proxy))]
    return fakepxs

def get_content(url):
    # 先打印一下表头
    if url[-2:] == ML:
        print(内地排行榜)
    elif url[-2:] == HT:
        print(香港排行榜)
    elif url[-2:] == US:
        print(欧美排行榜)
    elif url[-2:] == KR:
        print(韩国排行榜)
    else:
        print(日本排行榜)

    html = get_html(url)
    soup = BeautifulSoup(html,lxml)
    li_list = soup.find_all(li,class_=vitem J_li_toggle_date )

    for li in li_list:
        content = {}
        try:
            # 判断分数升降
            if li.find(h3,class_=desc_score):
                content[分数] = li.find(h3,class_=desc_score).text
            else:
                content[分数] = li.find(h3,class_=asc_score).text

            content[排名] = li.find(div,class_=top_num).text
            content[名字] = li.find(a,class_=mvname).text
            content[发布时间] = li.find(p,class_=c9).text[5:]
            content[歌手] = li.find(a,class_=special).text
        except:
            return None

        print(content)

def main():
    base_url = http://vchart.yinyuetai.com/vchart/trends?area=
    suffix = [ML,HT,US,JP,KR]
    for suff in suffix:
        url = base_url + suff
        print()
        get_content(url)

if __name__ == __main__:
    main()

输出结果:

技术分享


以上是关于爬虫实践---悦音台mv排行榜与简单反爬虫技术应用的主要内容,如果未能解决你的问题,请参考以下文章

爬虫实践---电影排行榜和图片批量下载

反爬虫和抗DDOS攻击技术实践

爬虫实践---排行榜小说批量下载

反爬虫技术与“反”反爬虫技术

别瞎学了,我的爬虫与反爬虫学习之路(超详细超硬核系列-1)

大话爬虫的实践技巧