爬蟲實踐---悅音臺mv排行榜與簡單反爬蟲技術應用

因爲要抓取的是悅音臺mv的排行榜,這個排行榜是實時更新的,若是要求不停地抓取,這將有可能致使悅音臺官方採用反爬蟲的技術將ip給封掉。因此這裏要應用一些反爬蟲相關知識。html

目標網址http://vchart.yinyuetai.com/vchart/trends?area=MLdom

網站結構:ide

上面紅線圈出來的地方都是須要注意的小細節:網站

首先 排行榜分爲,內地、港臺、歐美、韓國、日本五個地區
分別將其點開可以觀察到url的變化爲在最尾部加了一個參數:area=地區參數url

很容易的就能知道參數列表:['ML','HT','US','JP','KR'] 分別對應着內地、香港、歐美、日本、以及韓國。發現這個規律以後,只要經過簡單的對url的變化就能屢次請求,篩選出想要的信息。spa

其次 能夠發現,有的mv分數是呈現上升趨勢,有的mv的分數是成降低趨勢,這在網頁的代碼結構稍有不一樣。代理

最後,能夠看到 這裏mv的排行榜數據是實時更新的,因此爬蟲程序要不停的在後臺運行才能保證得到的數據是最新的,這樣就會引發官方人員的注意,他們的反爬蟲技術有可能就會將爬蟲的IP封掉。rest

完整代碼:code

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()

輸出結果:xml

相關文章
相關標籤/搜索