博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
爬虫实践---悦音台mv排行榜与简单反爬虫技术应用
阅读量:5233 次
发布时间:2019-06-14

本文共 3017 字,大约阅读时间需要 10 分钟。

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

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

网站结构:

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

首先 排行榜分为,内地、港台、欧美、韩国、日本五个地区

分别将其点开能够观察到url的变化为在最尾部加了一个参数:area=地区参数

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

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

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

完整代码:

import requestsfrom bs4 import BeautifulSoupimport randomdef 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 fakeheaderdef 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 fakepxsdef 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()

输出结果:

转载于:https://www.cnblogs.com/Lovebugs/p/7244682.html

你可能感兴趣的文章
Excel vlookup筛选两列的重复项
查看>>
CentOS7 SSH免密码登录
查看>>
配置了BFD MAD, 在IRF正常情况下的 BFD状态是不是 down?
查看>>
SQL server 2012定期的备份数据库--完整+差异+事物
查看>>
C语言 - 可变参数再stm32中的应用
查看>>
vscode + platformIO开发stm32f4
查看>>
最新SSM框架整合2019
查看>>
LinkedList的线程安全解决办法
查看>>
eclipse调整控制台长度
查看>>
jsonp和ajax
查看>>
EAS 之F7控件实现多选择并保存
查看>>
S-HR之用户行政范围查询
查看>>
eas之动态调用Ui界面,并在UI之间传递变量
查看>>
开源协议许可
查看>>
S-HR之导入模板指向实现类配置
查看>>
eas之设置是否在调入列表之前先出过滤框
查看>>
eas之设置单据分录单元格式
查看>>
eas之手工发送消息
查看>>
eas之F7专用选择界面设置
查看>>
eas之删除类别时刷新当前结点的父结点,并定位到当前结点的父结点。
查看>>