腾讯视频爬虫

作者: LEONYao | 来源:发表于2016-11-15 00:38 被阅读6862次

    其实事情是这样的,上个礼拜我去面试一家公司,工作是做爬虫。然后有了以下对话。
    面试官:你是自学的,我有一些问题问你,python的浅拷贝和深拷贝是什么?
    我:呵呵
    面试官:额。。。你能不能说一说你是怎么理解python的面向对象编程?
    我:呵呵
    面试官:额。。。。好吧,我不问你基础了。你有没有爬过动态的网页?
    我:有啊,我爬过豆瓣啊。
    面试官:那我让你爬视频网站你怎么爬?F12里查看器是看不到视频地址的!
    我:看不到么?
    面试官:嗯!
    我:不知道。。。。。
    面试官:额。。。。你这样让我很为难的,要不你去试试爬腾讯视频。
    我:好啊好啊!
    面试官:你不要想用那些模拟浏览器来渲染JS哦!直接抓包!

    结果我回到家一看!!什么鬼!!!!

    QQ截图20161114234015.png QQ截图20161114233935.png

    真的什么地址都没有啊!!!
    怎么办?抓包?什么是抓包啊!!!
    我只会用selenium加火狐浏览器来模拟爬动态网页啊。。。这工作是没希望了么?
    我是个不会放弃的人!!然后就去百度了:
    如何用python抓包
    如何用python爬JS
    后来经人指点我才明白抓包就是去F12里的network找包。。。。
    然后我又百度了:
    如何用python爬AJAX
    仍然没个吊用!
    不过我在简书搜索爬腾讯视频时候学会了直接用chrome的模拟手机浏览器可以登录移动端的视频网站,可以直接看到视频的地址链接。
    但是。。。。。怎么用代码爬啊??

    好了废话到此为止,大家也不想听下去了。我直接进入正题吧!
    经过三天的学习,我首先弄清楚了对于这种动态网站的爬取方法。
    首先,用network找到一个专门接收请求的真实地址,或者后门网址。


    QQ截图20161114234944.png

    就是这个,只要在网址里加入参数,它就会返回数据。拉下去,我们可以看道参数


    QQ截图20161114235117.png
    这里的参数有很多并不是必须的。我先在这里提前说一下,最后我们是要根据观察来找出规律重构出这个网址,因为我们做爬虫的不可能上网站开F12来找信息的。
    我们看下网址打开后有什么
    This XML file does not appear to have any style information associated with it. The document tree is shown below.
    <root>
    <exem>0</exem>
    <hs>0</hs>
    <ls>0</ls>
    <tm>1479138997</tm>
    <dltype>1</dltype>
    <preview>135</preview>
    <sfl>
    <cnt>0</cnt>
    
    </sfl>
    
    <fl>
    <cnt>3</cnt>
    <fi>
    <sl>0</sl>
    <br>64</br>
    <id>10703</id>
    <name>sd</name>
    <lmt>0</lmt>
    <sb>1</sb>
    <cname>标清;(270P)</cname>
    <fs>4795182</fs>
    
    </fi>
    
    <fi>
    <fs>8435750</fs>
    <sl>1</sl>
    <br>235</br>
    <id>10712</id>
    <name>hd</name>
    <lmt>0</lmt>
    <sb>1</sb>
    <cname>高清;(480P)</cname>
    
    </fi>
    
    <fi>
    <lmt>0</lmt>
    <sb>1</sb>
    <cname>超清;(720P)</cname>
    <fs>17133689</fs>
    <sl>0</sl>
    <br>650</br>
    <id>10701</id>
    <name>shd</name>
    
    </fi>
    
    </fl>
    
    <s>o</s>
    <vl>
    <vi>
    <br>60</br>
    <fst>5</fst>
    <vh>480</vh>
    <dm>0</dm>
    <targetid>1619695007</targetid>
    <fclip>1</fclip>
    <ul>
    <ui>
    <vt>200</vt>
    <dt>2</dt>
    <dtc>10</dtc>
    <url>http://222.84.158.26/vhot2.qqvideo.tc.qq.com/</url>
    
    </ui>
    
    <ui>
    <dtc>10</dtc>
    <url>http://222.84.158.27/vhot2.qqvideo.tc.qq.com/</url>
    <vt>200</vt>
    <dt>2</dt>
    
    </ui>
    
    <ui>
    <url>http://222.84.158.28/vhot2.qqvideo.tc.qq.com/</url>
    <vt>200</vt>
    <dt>2</dt>
    <dtc>10</dtc>
    
    </ui>
    
    <ui>
    <vt>0</vt>
    <dt>2</dt>
    <dtc>10</dtc>
    <url>http://video.dispatch.tc.qq.com/96405217/</url>
    
    </ui>
    
    </ul>
    
    <st>2</st>
    <videotype>23</videotype>
    <hevc>0</hevc>
    <dsb>0</dsb>
    <ch>0</ch>
    <drm>0</drm>
    <enc>0</enc>
    <vid>q0345aui4cn</vid>
    <lnk>q0345aui4cn</lnk>
    <fn>q0345aui4cn.p712.mp4</fn>
    <fs>8435750</fs>
    <fvkey>
    79487AB1BD24866699D881C26FC8E62D2131609CE05CC1F18B76EC6481957C2416C28CAE6B21FEE56DCB157706205BC52F3928F51CC08EE79AF4E3157C4940870340CFB9B9407A55FF02A8EA1B560B00A3ADC310709553ED9AC0E8E67705AE5D4097A5370B4BF1AB75B444A3A2EB7F51
    </fvkey>
    
    <level>0</level>
    <td>135.722</td>
    <fmd5>9cac5ea26dbf008bce792704b6d67c97</fmd5>
    <ct>21600</ct>
    <sp>0</sp>
    <cl>
    <fc>1</fc>
    <ci>
    <idx>1</idx>
    <cs>8435748</cs>
    <cd>135.722</cd>
    <cmd5>40a954202d9f663ac2443372afde8d4b</cmd5>
    <keyid>q0345aui4cn.10712.1</keyid>
    
    </ci>
    
    </cl>
    
    <share>1</share>
    <type>9</type>
    <vst>2</vst>
    <iflag>0</iflag>
    <ti>健忘症老人同一问题连问17次!这名耐心的医生火了</ti>
    <vw>848</vw>
    <logo>1</logo>
    <pl>
    <cnt>2</cnt>
    <pd>
    <url>http://video.qpic.cn/video_caps/0/</url>
    <cd>2</cd>
    <c>10</c>
    <h>45</h>
    <w>80</w>
    <r>10</r>
    <fn>q1</fn>
    <fmt>40001</fmt>
    
    </pd>
    
    <pd>
    <fmt>40002</fmt>
    <url>http://video.qpic.cn/video_caps/0/</url>
    <cd>2</cd>
    <c>5</c>
    <h>90</h>
    <w>160</w>
    <r>5</r>
    <fn>q2</fn>
    
    </pd>
    
    </pl>
    
    </vi>
    
    <cnt>1</cnt>
    
    </vl>
    
    </root>
    

    先不管,我们再打开另一个叫做getkey的网址看看里面的东西

    <root>
    <ct>21600</ct>
    <keyid>q0345aui4cn.10712.1</keyid>
    <key>
    50C099826174CDA1036AC3F8BB82BEC4A6E91005384153F81E3EF477C719CBF0B442C8D533F36402878D2B7C639318CD3078DEFC435C8C865813DBEB689F66D789F410D5115A745C3019F6ABAEBFF53258F4F524A9FE978D26595B6B1732F25992A33CB6F3F2C792FA22CAC171C7087C
    </key>


    62154.61</br>
    <sp>0</sp>
    <sr>0</sr>
    <level>0</level>
    <s>o</s>
    <filename>q0345aui4cn.p712.mp4</filename>
    <levelvalid>1</levelvalid>

    </root>

    这么多,我们怎么知道爬虫需要哪些东西呢?
    network里是可以直接找到video的,我们看一下视频的真实地址
    `
    http://183.60.171.154/vhot2.qqvideo.tc.qq.com/q0345aui4cn.p712.1.mp4?sdtfrom=v1090&type=mp4& 
    vkey=E1B062FA0354A56228FFE25100D1B41F83FEBC012471446999AA386A8FC8A8273AE07BFF6092B4F4AABCE8D98E7F622D71AF44C88B5D3F63A6ED4BFE45457ED0D95E67CA930861F396967521A97ED4154449A61DD95F24A7945262EEB481C3BAC8FE53A2B186F1FC111CE8D32FFBB8C1
    &level=0&platform=11&br=60&fmt=hd&sp=0&guid=ED20EE2DB93337F04708204D247CB34A&locid=f9aa455a-6a68-4fd9-a4dd-0dcf179bd6b3&size=8435748&ocid=2535331244
    `
    很长很复杂对吧!让我们来精简一下,看能把哪些参数删掉。我下面就直接放出我爬虫爬到的精简版的地址吧
    `
    http://222.84.158.29/vhot2.qqvideo.tc.qq.com/q0345aui4cn.p701.1.mp4?vkey=46994EBB71F530AC11AB11EFA265508534036712DA0187B3939F9FDE9062FBA7B5C37F0C80D72626AEEB3CD87A15B19CB064817D98C4DD0D43D113804FE8F50F67DE15DD2FC48CC06FA9AE67678FD2CE9363358A1AC9BBCDB831B1AF79E7B105
    `
    首先我们看到 两个地址的IP,VKEY是不一样的。IP这个好解释,视频源不一样,地址不一样。然后Vkey它是一直在变化的,每次打开getkey这个页面都在变。我分析下一个视频地址精简后需要哪些东西
    Ip=http://222.84.158.29/vhot2.qqvideo.tc.qq.com/(getinfo页面中有)
    filenname=VID +P701.1.MP4(`P701其实由getinfo中的ID的1701去掉10,改为P获得。而.1.MP4是属于后缀.2.mp4应该也能播放,只要有这个视频源`)
    vkey=46994EBB71F530AC11AB11EFA265508534036712DA0187B3939F9FDE9062FBA7B5C37F0C80D72626AEEB3CD87A15B19CB064817D98C4DD0D43D113804FE8F50F67DE15DD2FC48CC06FA9AE67678FD2CE9363358A1AC9BBCDB831B1AF79E7B105(`这个在getkey页面中获得`)
    
    好了所以我们来重新整理下思路吧!
    我要在一开始的视频页面获得vid(`这个我不想解释自己开F12查看器`)
    然后在getinfo页面获得ID,拼接filename
    在getkey页面获得Vkey
    最后拼接成我们的视频url
    这里我放出我精简过了的getinfo和getkey网址,只要更换vid,filename就额可以打开了
    `getinfo='http://vv.video.qq.com/getinfo?vids={vid}&otype=xlm&defaultfmt=fhd'`
    `getkey='http://vv.video.qq.com/getkey?format={id}&otype=xml&vt=150&vid={vid}&ran=0%2E9477521511726081\\\\&charge=0&filename={filename}&platform=11'`
    这里我得强调,getkey的参数是由getinfo中获得的!
    分析得差不多了,我们开始写爬虫把!!
    

    from urllib.request import Request, urlopen
    from urllib.error import URLError,HTTPError
    from bs4 import BeautifulSoup
    import re

    print('https://v.qq.com/x/page/h03425k44l2.html\\n \\
    https://v.qq.com/x/cover/dn7fdvf2q62wfka/m0345brcwdk.html\\n \\
    http://v.qq.com/cover/2/2iqrhqekbtgwp1s.html?vid=c01350046ds')
    web = input('请输入网址:')
    if re.search(r'vid=',web) :
    patten =re.compile(r'vid=(.*)')
    vid=patten.findall(web)
    vid=vid[0]

    else:
    newurl = (web.split("/")[-1])
    vid =newurl.replace('.html', ' ')

    从视频页面找出vid

    getinfo='http://vv.video.qq.com/getinfo?vids={vid}&otype=xlm&defaultfmt=fhd'.format(vid=vid.strip())
    def getpage(url):
    req = Request(url)
    user_agent = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit'
    req.add_header('User-Agent', user_agent)
    try:
    response = urlopen(url)
    except HTTPError as e:
    print('The server couldn\\'t fulfill the request.')
    print('Error code:', e.code)
    except URLError as e:
    print('We failed to reach a server.')
    print('Reason:', e.reason)
    html = response.read().decode('utf-8')
    return(html)

    打开网页的函数

    a = getpage(getinfo)

    soup = BeautifulSoup(a, "html.parser")
    for e1 in soup.find_all('url'):
    ippattent = re.compile(r"((?:(2[0-4]\\d)|(25[0-5])|([01]?\\d\\d?))\\.){3}(?:(2[0-4]\\d)|(255[0-5])|([01]?\\d\\d?))")
    if re.search(ippattent,e1.get_text()):
    ip=(e1.get_text())
    for e2 in soup.find_all('id'):
    idpattent = re.compile(r"\\d{5}")
    if re.search(idpattent,e2.get_text()):
    id=(e2.get_text())
    filename=vid.strip()+'.p'+id[2:]+'.1.mp4'

    找到ID和拼接FILENAME

    getkey='http://vv.video.qq.com/getkey?format={id}&otype=xml&vt=150&vid={vid}&ran=0%2E9477521511726081\\
    &charge=0&filename={filename}&platform=11'.format(id=id,vid=vid.strip(),filename=filename)

    利用getinfo中的信息拼接getkey网址

    b = getpage(getkey)

    key=(re.findall(r'<key>(.*)<\\/key>',b))

    videourl=ip+filename+'?'+'vkey='+key[0]

    print('视频播放地址 '+videourl)

    完成了

    
    ![`IZ`)%W(BYA9I6~H%@_GE(5.png](http:https://img.haomeiwen.com/i2577034/c71f4f57d83efd57.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    
    
    然后我就把爬虫上传到github发给面试官了,满心欢喜的等着上班结束讨饭生活!
    但素!!
    面试官:嗯,不错!居然真的做出来了!你的期望薪酬是多少?
    我:嗨,这个吗我没经验。你随便给我个六七千打发我就可以了!
    面试官:嗯,你没有经验我们是只能按应届生标准给你薪酬的。
    我:没事没事,薪酬不重要。最重要先让我进这个行业积累经验!
    过了一会
    面试官:其实。。。。我们老大说你基础太差了,虽然你自学能力不错。但是你懂数据结构与算法吗?
    我:不会。。。。
    面试官:其实爬虫我们已经开发好了,接下来要做的是日志分析和推荐系统开发。
    我:。。。。。。
    
    所以,我没拿到offer,继续要饭。。。。
    我又不看腾讯视频,爬腾讯也没用,把源码放上来大家学习下吧。谁爱爬自己爬,还可以免广告。
     o(╥﹏╥)o 我什么时候才能找到工作啊???
    算了,明天我就学前端去,争取年底前当个切图仔!!

    相关文章

      网友评论

      • f08aadbfb177:LZ,腾讯的视频限速了解过咩? you-get下载在程序运行龟速,在CMD里还是正常速度。
      • 1f0717ca409f:厉害,这个可以下载视频吗。
        zBk9cN:有地址了,就可以下载啊
      • 10a1b542da78:楼主哥哥,评论中看到你有写到已经转行找到工作,敢问转的什么行呢,我现在是应届毕业生,很迷茫 想学点什么东西再找工作
        aaa9e3f02bc6: @喂_31f9 我毕业一年 做了一年开发 现在转行刚找到工作,也很迷茫
        LEONYao:@喂_31f9 开发
      • FengZai8:朋友目前还在关注腾讯视频的爬取吗,最新web端分段给出的视频连接了,你的vkey的获取是app端抓包看到的吗
        FengZai8:@LEONYao 我在研究,有限速,但成功破解
        LEONYao:@FengZai8 具体不记得了,现在已经没关注腾讯视频了
      • mundane:博主能贴个github地址吗
      • fireup:付费的视频也可以爬过来吗
      • VB过得VB:这个厉害👍👍
      • 一颗剽悍的种子:去面试,说自学,不用什么证书吗
      • Adolph_zhao:那如果视频源文件加密了、爬下来不解密的怎么办?
        NiceBlueChai:@Adolph_zhao 如果视频加密了肯定是本地js解密,自己去js里找就行啦,不过不可能加密的,国内视频网站加载的就比较慢,加密解密的话加载视频会更慢,用户体验会很差
        Adolph_zhao:@LEONYao 我们公司的视频都是加密的、对源文件件m3u8切片、就算每个切片下载下来、没解密都是花屏、想问一下咋处理
        LEONYao:@Kitzhao 这个问题还没遇到过,不知道呢
      • 昔往矣:“喜欢你的文字风格”这样的评论我觉得没有一点诚意,其实是觉得你自学很强
        LEONYao:@昔往矣 :joy:谢谢啊!
      • 57c4e0896953:LZ应届生吗
        LEONYao:@AndersWang 毕业三年了。。。中途转行,已经找到工作了
      • 北魏逍遥太监:小白膜拜大神
      • 产品手札:上海么?如果是上海可以私聊
        产品手札: @沧海刑天 乐视爬虫又不难,简历丢我瞅瞅
        Anoyi:@黑厚道人 已破解乐视,可以开多少工资,应届生,上海
        LEONYao:@黑厚道人 不是上海呢,不过谢谢你啊

      本文标题:腾讯视频爬虫

      本文链接:https://www.haomeiwen.com/subject/amjkpttx.html