1. 程式人生 > >爬蟲實踐---悅音臺mv排行榜與簡單反爬蟲技術應用

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

代碼 int logs 1.8 mac for html req 3.5

由於要抓取的是悅音臺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排行榜與簡單反爬蟲技術應用