• 爬虫实践---悦音台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()

    输出结果:

  • 相关阅读:
    mac idea 更换主题
    记一次Sonarqube踩坑实录
    Mysql 常用数据类型
    Spring Cloud 整合分布式链路追踪系统Sleuth和ZipKin实战,分析系统瓶颈
    git clone克隆github仓库慢,问题解决
    SpringBoot 解决跨域问题
    Android 中的敏感信息泄露
    Drozer 测试 APP
    Drozer 安装踩坑日记
    安卓测试笔记--工具安装
  • 原文地址:https://www.cnblogs.com/Lovebugs/p/7244682.html
Copyright © 2020-2023  润新知