好像自从会了Python之后!我就没有再续费过会员了!解析爱奇艺!
程序员文章站
2022-06-26 10:47:56
正文 废话不多说,现在开始进入正题。 做爬虫,网络请求是必不可少的,那么现在我们就先写一个网络数据请求的方法出来。 网络请求方法 那么就可以把获取视频类型的方法给写出来: 通过这个方法,组装了各个分类视频需要的一些参数,这里把他们打印出来,根据需要再调用下面的方法获取各个视频。 获取视频列表 有了视 ......
正文
废话不多说,现在开始进入正题。
做爬虫,网络请求是必不可少的,那么现在我们就先写一个网络数据请求的方法出来。
网络请求方法
def getHttpData(url): req = urllib2.Request(url) try: reponse = urllib2.urlopen(req) httpData = reponse.read() except: print "get http data error" return "" return httpData
那么就可以把获取视频类型的方法给写出来:
def rootList(): for name, id in CHANNEL_LIST: u = sys.argv[0] + "?mode=1&name=" + urllib.quote_plus(name) + "&id=" + urllib.quote_plus( id) + "&cat=" + urllib.quote_plus("") + "&area=" + urllib.quote_plus("") + "&year=" + urllib.quote_plus( "") + "&order=" + urllib.quote_plus("11") + "&page=" + urllib.quote_plus( "1") + "&paytype=" + urllib.quote_plus("0") print name print u
通过这个方法,组装了各个分类视频需要的一些参数,这里把他们打印出来,根据需要再调用下面的方法获取各个视频。
电影/Users/*****/iqiyi_custom.py?mode=1&name=%E7%94%B5%E5%BD%B1&id=1&cat=&area=&year=&order=11&page=1&paytype=0电视剧/Users/*****/iqiyi_custom.py?mode=1&name=%E7%94%B5%E8%A7%86%E5%89%A7&id=2&cat=&area=&year=&order=11&page=1&paytype=0......
获取视频列表
有了视频分类列表,那么下一步就是获取你需要的视频列表以及每个视频所对应的播放页面地址了,先看代码吧,这里时主要来获取电影分类的,解析原理请看代码中的注释:
# id c1 c2 c3 c4 c5 c11 c12 c14# 电影 1 area cat paytype year order# 电视剧 2 area cat paytype year order# 纪录片 3 cat paytype order# 动漫 4 area cat ver age paytype order# 音乐 5 area lang cat grp paytype order# 综艺 6 area cat paytype order# 娱乐 7 cat area paytype order# 旅游 9 cat area paytype order# 片花 10 area cat paytype order# 教育 12 cat paytype order# 时尚 13 cat paytype orderdef progList(name, id, page, cat, area, year, order, paytype): c1 = '' c2 = '' c3 = '' c4 = '' if id == '7': # 娱乐 c3 = area elif id in ('9', '10'): # 旅游&片花 c2 = area elif id != '3': # 非纪录片 c1 = area if id in ('3', '9'): # 纪录片&旅游 c1 = cat elif id in ('5', '10'): # 音乐&片花 c4 = cat elif id == '12': # 教育 c3 = cat elif id == '13': # 时尚 c5 = cat else: c2 = cat # 根据分类信息组装url url = 'http://list.iqiyi.com/www/' + id + '/' + c1 + '-' + c2 + '-' + c3 + '-' + c4 + '-------' + paytype + '-' + year + '--' + order + '-' + page + '-1-iqiyi--.html' print url currpage = int(page) # 抓取网页数据 link = getHttpData(url) # 根据 data-key=<数字> 这个标记字符串来获取页数,匹配出来多少项就有多少页 match1 = re.compile('data-key="([0-9]+)"').findall(link) if len(match1) == 0: totalpages = 1 else: totalpages = int(match1[len(match1) - 1]) # <div class="wrapper-piclist 和 <!-- 页码 开始 --> 中间的内容是有关视频列表的内容,用正则匹配获取相关内容 match = re.compile('<div class="wrapper-piclist"(.+?)<!-- 页码 开始 -->', re.DOTALL).findall(link) if match: # 匹配前面内容中的 <li> </li>列表项,匹配多少项代表当前页有多少个视频 # 正则表达式里面的 <li[^>]*> 中[^>]*非>字符的0个或多个字符,防止<li>标签内带一些属性值 match = re.compile('<li[^>]*>(.+?)</li>', re.DOTALL).findall(match[0]) print '-------' for i in range(0, len(match)): # 匹配alt=""冒号内的字符串,代码视频名称 p_name = re.compile('alt="(.+?)"').findall(match[i])[0] # 匹配src = ""冒号内的字符串,代表视频海报地址,s* 代表0个或多个空白字符 p_thumb = re.compile('srcs*=s*"(.+?)"').findall(match[i])[0] # 匹配href="([^"]*)"冒号内非"的0个或多个字符串,代表视频的播放界面,这个是后面解析视频播放地址的基础 p_id = re.compile('href="([^"]*)"').search(match[i]).group(1) try: # 根据 data-qidanadd-episode 是否为1来判断是否是多集的影视剧 p_episode = re.compile('data-qidanadd-episode="(d)"').search(match[i]).group(1) == '1' except: p_episode = False # 匹配 <span class="icon-vInfo"> 和 </span>中间的内容 match1 = re.compile('<span class="icon-vInfo">([^<]+)</span>').search(match[i]) if match1: # 去掉匹配内容的空格 msg = match1.group(1).strip() if (msg.find('更新至') == 0) or (msg.find('共') == 0): # 如果内容里面有'更新至' 或者 '共' 这样字符,表示是连续剧 p_episode = True if p_episode: # 如果是连续剧 mode 设置为2 mode = 2 # 获取视频id p_id = re.compile('data-qidanadd-albumid="(d+)"').search(match[i]).group(1) else: # 否则 mode 设置为3,进入progList 方法 mode = 3 # 组装url u = sys.argv[0] + "?mode=" + str(mode) + "&name=" + urllib.quote_plus(p_name) + "&id=" + urllib.quote_plus( p_id) + "&thumb=" + urllib.quote_plus(p_thumb) print p_name print u
def getVMS(tvid, vid): t = int(time.time() * 1000) src = '76f90cbd92f94a2e925d83e8ccd22cb7' key = 'd5fb4bd9d50c4be6948c97edd7254b0e' sc = hashlib.md5(str(t) + key + vid).hexdigest() vmsreq = 'http://cache.m.iqiyi.com/tmts/{0}/{1}/?t={2}&sc={3}&src={4}'.format(tvid, vid, t, sc, src) print 'vms地址' print vmsreq return simplejson.loads(getHttpData(vmsreq))def PlayVideo(name, id, thumb): id = id.split(',') if len(id) == 1: try: if ("http:" in id[0]): link = getHttpData(id[0]) tvId = re.compile('data-player-tvid="(.+?)"', re.DOTALL).findall(link)[0] videoId = re.compile('data-player-videoid="(.+?)"', re.DOTALL).findall(link)[0] else: url = 'http://cache.video.qiyi.com/avlist/%s/' % (id[0]) link = getHttpData(url) data = link[link.find('=') + 1:] json_response = simplejson.loads(data) tvId = str(json_response['data']['vlist'][0]['id']) videoId = json_response['data']['vlist'][0]['vid'].encode('utf-8') except: print '未能获取视频地址' return else: tvId = id[0] videoId = id[1] # 根据一定规则获取视频流信息 info = getVMS(tvId, videoId) if info["code"] != "A00000": print '无法播放此视频' return vs = info["data"]["vidl"] sel = selResolution([x['vd'] for x in vs]) if sel == -1: return # 根据分辨率获取对应地址 video_links = vs[sel]["m3u"] print '视频播放url' print video_links
http://dx.data.video.qiyi.com/videos/v0/20171214/02/26/d2c83af6c58ccbd91525ef8eee950886.ts?qdv=1&qypid=870139400_04022000001000000000_4&start=0&end=334466&hsize=2161&tag=0&v=&contentlength=285384&qd_uid=&qd_vip=0&qd_src=3_31_312&qd_tm=1521816060630&qd_ip=0e7bff72&qd_p=0e7bff72&qd_k=95668376716c9dcf32e2fbd6597c6f40&sgti=&dfp=&qd_sc=947aee71a7bc4e65d241aeb5a4657439······
好了,关于爱奇艺视频爬虫就介绍到这里。
get到了嘛?进群:125240963 即可获取数十本PDF书籍资料!