爬虫实践---悦音台mv排行榜与简单反爬虫技术应用
2017-08-14 19:28
316 查看
由于要抓取的是悦音台mv的排行榜,这个排行榜是实时更新的,如果要求不停地抓取,这将有可能导致悦音台官方采用反爬虫的技术将ip给封掉。所以这里要应用一些反爬虫相关知识。
目标网址:
网站结构:
上面红线圈出来的地方都是需要注意的小细节:
首先 排行榜分为,内地、港台、欧美、韩国、日本五个地区
分别将其点开能够观察到url的变化为在最尾部加了一个参数:area=地区参数
很容易的就能知道参数列表:['ML','HT','US','JP','KR'] 分别对应着内地、香港、欧美、日本、以及韩国。发现这个规律之后,只要通过简单的对url的变化就能多次请求,筛选出想要的信息。
其次 可以发现,有的mv分数是呈现上升趋势,有的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排行榜与简单反爬虫技术应用
- 从零开始写Python爬虫 --- 1.9 爬虫实践:悦音台mv排行榜与反爬虫技术
- AJAX开发技术在PHP开发中的简单应用技巧
- 项目实践精解:C#核心技术应用开发
- Ajax技术在Asp.net中的简单应用
- 建立一个最简单的项目,实践cobertura在maven中应用
- 欢迎报名参加CSDN云计算俱乐部上海“hadoop技术开发与应用实践分享会”
- 应用ASP技术编写一个简单论坛(中)
- 后台开发:核心技术与应用实践(边写代码边读书才是最好的学习方式)
- php ob_start() ob_end_flush()缓存技术简单应用
- DotNET企业架构应用实践-系统架构与性能-缓存技术与ORM中的缓存查询技术
- 一起谈.NET技术,Microsoft NLayerApp案例理论与实践 - 多层架构与应用系统设计原则
- 业务、架构、技术,我们应该关注什么 Java和.Net的优势劣势简单看法 市场经济决定,商业之道即是软件之道,市场的需求决定着软件技术的发展 利益决定着选择应用新技术
- SegmentFault 技术周刊 Vol.11 - React 应用与实践
- 实践项目十:爬取百度百科Python词条相关1000个页面数据(慕课简单爬虫实战)
- 【weka应用技术与实践】过滤器
- 【安卓学习】4.碎片(Fragment)实践---一个简单的新闻应用。
- 状态栏框架-- 深入Android应用开发:核心技术解析与最佳实践
- 技术实践】Docker应用----1.Docker入门和环境搭建
- Docker学习总结(25)——阿里巴巴基于Java容器的多应用部署技术实践