整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          騰訊視頻 Python 爬蟲項目實戰

          | yangrq1018 編輯 | EarlGrey

          推薦 | 編程派公眾號(ID:codingpy)

          做了一些小項目,用的技術和技巧會比較散比較雜,寫一個小品文記錄一下,幫助熟悉。

          需求:經常在騰訊視頻上看電影,在影片庫里有一個"豆瓣好評"板塊。我一般會在這個條目下面挑電影。但是電影很多,又缺乏索引,只能不停地往下來,讓js加載更多的條目。然而前面的看完了,每次找新的片就要拉很久。所以用爬蟲將"豆瓣好評"里的電影都爬下來整理到一個表中,方便選片。

          項目地址:https://github.com/yangrq1018/vqq-douban-film

          依賴

          需要如下Python包:

          • requests

          • bs4 - Beautiful soup

          • pandas

          就這些,不需要復雜的自動化爬蟲架構,簡單而且常用的包就夠了。

          爬取影片信息

          首先觀察電影頻道,發現是異步加載的。可以用Firefox(Chrome也行)的inspect中的network這個tab來篩選查看可能的api接口。很快發現接口的URL是這個格式的:

          1. base_url = 'https://v.qq.com/x/bu/pagesheet/list?_all=1&append=1&channel=movie&listpage=2&offset={offset}&pagesize={page_size}&sort={sort}'

          其中 offset是請求頁開始的位置,pagesize是每頁請求的數量,sort是類型。在這里sort=21指我們需要的"豆瓣好評"類型。pagesize不能大于30,大于30也只會返回三十個元素,低于30會返回指定數量的元素。

          1. # 讓Pandas完整到處過長的URL,后面會需要

          2. pd.set_option('display.max_colwidth', -1)


          3. base_url = 'https://v.qq.com/x/bu/pagesheet/list?_all=1&append=1&channel=movie&listpage=2&offset={offset}&pagesize={page_size}&sort={sort}'


          4. # 豆瓣最佳類型

          5. DOUBAN_BEST_SORT = 21


          6. NUM_PAGE_DOUBAN = 167

          寫一個小小的循環就可以發現,豆瓣好評這個類型總共有167頁,每頁三十個元素。

          我們使用 requests這個庫來請求網頁,get_soup會請求第page_idx頁的元素,用Beautifulsoup來解析response.content,生成一個類似DOM,可以很方便地查找我們需要的element的對象。我們返回一個list。每個電影條目是包含在一個叫list_item的div里的,所以寫一個函數來幫助我們提取所有的這樣的div

          1. def get_soup(page_idx, page_size=30, sort=DOUBAN_BEST_SORT):

          2. url = base_url.format(offset=page_idx * page_size, page_size=page_size, sort=sort)

          3. res = requests.get(url)

          4. soup = bs4.BeautifulSoup(res.content.decode('utf-8'), 'lxml')

          5. return soup


          6. def find_list_items(soup):

          7. return soup.find_all('div', class_='list_item')

          我們遍歷每一頁,返回一個含有所有的被 bs4過的條目元素的HTML的list

          1. def douban_films:

          2. rel =

          3. for p in range(NUM_PAGE_DOUBAN):

          4. print('Getting page {}'.format(p))

          5. soup = get_soup(p)

          6. rel += find_list_items(soup)

          7. return rel

          這是其中的一部電影的HTML代碼:

          1. <div __wind="" class="list_item">

          2. <a class="figure" data-float="j3czmhisqin799r" tabindex="-1" target="_blank" title="霸王別姬">

          3. <img alt="霸王別姬" class="figure_pic" onerror="picerr(this,'v')" src="http://puui.qpic.cn/vcover_vt_pic/0/j3czmhisqin799rt1444885520.jpg/220"/>

          4. <img alt="VIP" class="mark_v" onerror="picerr(this)" src="http://i.gtimg.cn/qqlive/images/mark/mark_5.png" srcset="http://i.gtimg.cn/qqlive/images/mark/mark_5@2x.png 2x"/>

          5. <div class="figure_caption"></div>

          6. <div class="figure_score">9.6</div>

          7. </a>

          8. <div class="figure_detail figure_detail_two_row">

          9. <a class="figure_title figure_title_two_row bold" target="_blank" title="霸王別姬">霸王別姬</a>

          10. <div class="figure_desc" title="主演:張國榮 張豐毅 鞏俐 葛優">主演:張國榮 張豐毅 鞏俐 葛優</div>

          11. </div>

          12. <div class="figure_count"><svg class="svg_icon svg_icon_play_sm" height="16" viewbox="0 0 16 16" width="16"><use xlink:href="#svg_icon_play_sm"></use></svg>4671萬</div>

          13. </div>

          不難發現,霸王別姬這部電影,名稱、播放地址、封面、評分、主演,是否需要會員和播放量都在這個 div中。在ipython這樣的interactive環境中,可以方便地找出怎么用bs來提取他們的方法。我試用的一個技巧是,可以打開一個spyder.py文件,在里面編寫需要的函數,將ipython的自動重載模組的選項打開,然后就可以在console里debug之后將代碼復制到文件里,然后ipython中的函數也會相應的更新。這樣的好處是會比在ipython中改動代碼方便許多。具體如何打開ipython的自動重載:

          1. %load_ext autoreload

          2. %autoreload 2 # Reload all modules every time before executing Python code

          3. %autoreload 0 # Disable automatic reloading

          這個 parse_films函數用bs中的兩個常用方法提取信息:

          • find

          • find_all

          因為豆瓣的API已經關閉了檢索功能,爬蟲又會被反爬蟲檢測到,本來想檢索到豆瓣的評分添加上去這個功能就放棄了。

          OrderedDict可以接受一個由(key, value)組成的list,然后key的順序會被記住。這個在之后我們導出為pandas DataFrame的時候很有用。

          1. def parse_films(films):

          2. '''films is a list of `bs4.element.Tag` objects'''

          3. rel =

          4. for i, film in enumerate(films):

          5. title = film.find('a', class_="figure_title")['title']

          6. print('Parsing film %d: ' % i, title)

          7. link = film.find('a', class_="figure")['href']

          8. img_link = film.find('img', class_="figure_pic")['src']


          9. # test if need VIP

          10. need_vip = bool(film.find('img', class_="mark_v"))

          11. score = getattr(film.find('div', class_='figure_score'), 'text', None)

          12. if score: score = float(score)

          13. cast = film.find('div', class_="figure_desc")

          14. if cast:

          15. cast = cast.get('title', None)

          16. play_amt = film.find('div', class_="figure_count").get_text


          17. # db_score, db_link = search_douban(title)

          18. # Store key orders

          19. dict_item = OrderedDict([

          20. ('title', title),

          21. ('vqq_score', score),

          22. # ('db_score', db_score),

          23. ('need_vip', need_vip),

          24. ('cast', cast),

          25. ('play_amt', play_amt),

          26. ('vqq_play_link', link),

          27. # ('db_discuss_link', db_link),

          28. ('img_link', img_link),

          29. ])


          30. rel.append(dict_item)


          31. return rel

          導出

          最后,我們調用寫好的函數,在主程序中運行。

          被解析好,list of dictionaries格式的對象,可以直接傳給DataFrame的constructor。按照評分排序,最高分在前面,然后將播放鏈接轉換成HTML的鏈接標簽,更加美觀而且可以直接打開。

          注意,pandas生成的csv文件一直和excel有兼容性問題,在有中文字符的時候會亂碼。解決方法是選擇utf_8_sig這個encoding,就可以讓excel正常解碼了。

          Pickle是一個Python十分強大的serialization庫,可以保存Python的對象為文件,再從文件中加載Python的對象。我們將我們的DataFrame保存為.pkl。調用DataFrameto_html方法保存一個HTML文件,注意要將escape設置為False不然超鏈接不能被直接打開。

          1. if __name__ == '__main__':

          2. df = DataFrame(parse_films(douban_films))

          3. # Sorted by score

          4. df.sort_values(by="vqq_score", inplace=True, ascending=False)

          5. # Format links

          6. df['vqq_play_link'] = df['vqq_play_link'].apply(lambda x: '<a href="{0}">Film link</a>'.format(x))

          7. df['img_link'] = df['img_link'].apply(lambda x: '<img src="{0}">'.format(x))


          8. # Chinese characters in Excel must be encoded with _sig

          9. df.to_csv('vqq_douban_films.csv', index=False, encoding='utf_8_sig')

          10. # Pickle

          11. df.to_pickle('vqq_douban_films.pkl')

          12. # HTML, render hyperlink

          13. df.to_html('vqq_douban_films.html', escape=False)

          項目管理

          代碼部分就是這樣。那么寫完了代碼,就要把它歸檔保存,也便于分析。選擇放在Github上。

          那么,其實Github是提供了一個命令行工具的(不是 git,是git的一個擴展),叫做hub。macOS用戶可以這樣安裝

          1. brew install hub

          hub有許多比git更簡練的語法,我們這里主要用

          1. hub create -d "Create repo for our proj" vqq-douban-film

          來直接從命令行創建repo,是不是很酷!根本不用打開瀏覽器。然后可能會被提示在Github上登記一個你的SSH公鑰(驗證權限),如果沒有的話用 ssh-keygen生成一個就好了,在Github的設置里把.pub的內容復制進去。

          項目目錄里,可能會有 __pycache__.DS_Store這樣你不想track的文件。手寫一個.gitignore又太麻煩,有沒有工具呢,肯定有的!Python有一個包

          1. pip install git-ignore

          2. git-ignore python # 產生一個python的template

          3. # 手動把.DS_Store加進去

          只用命令行,裝逼裝到爽。

          來源:https://segmentfault.com/a/1190000019421255

          回復下方「關鍵詞」,獲取優質資源

          回復關鍵詞「 pybook03」,立即獲取主頁君與小伙伴一起翻譯的《Think Python 2e》電子版

          回復關鍵詞「pybooks02」,立即獲取 O'Reilly 出版社推出的免費 Python 相關電子書合集

          回復關鍵詞「書單02」,立即獲取主頁君整理的 10 本 Python 入門書的電子版

          印度小伙寫了套深度學習教程,Github上星標已經5000+

          GitHub熱榜第四!這套Python機器學習課,免費獲取還易吸收

          《流暢的 Python》到底好在哪?

          如何系統化學習 Python ?

          GitHub標星2.6萬!Python算法新手入門大全

          使用 Vue.js 和 Flask 實現全棧單頁面應用

          Python 實現一個自動化翻譯和替換的工具

          使用 Python 制作屬于自己的 PDF 電子書

          12步輕松搞定Python裝飾器

          200 行代碼實現 2048 游戲

          題圖:pexels,CC0 授權。

          行環境

          IDE:pycharm

          python:3.6.5

          實現目的

          實現對騰訊視頻目標url的解析與下載,由于第三方vip解析,只提供在線觀看,隱藏想實現對目標視頻的下載

          實現思路

          首先拿到想要看的騰訊電影url,通過第三方vip視頻解析網站進行解析,通過抓包,模擬瀏覽器發送正常請求,通過拿到緩存ts文件,下載視頻ts文件,最后通過轉換為mp4文件,即可實現正常播放

          學習從來不是一個人的事情,要有個相互監督的伙伴,工作需要學習python或者有興趣學習python的伙伴可以私信回復小編“學習” 領取全套免費python學習資料、視頻()裝包

          源碼

          import re
          import os,shutil
          import requests,threading
          from urllib.request import urlretrieve
          from pyquery import PyQuery as pq
          from multiprocessing import Pool
          class video_down():
           def __init__(self,url):
           # 拼接全民解析url
           self.api='https://jx.618g.com'
           self.get_url = 'https://jx.618g.com/?url=' + url
           #設置UA模擬瀏覽器訪問
           self.head = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
           #設置多線程數量
           self.thread_num=32
           #當前已經下載的文件數目
           self.i = 0
           # 調用網頁獲取
           html = self.get_page(self.get_url)
           if html:
           # 解析網頁
           self.parse_page(html)
           def get_page(self,get_url):
           try:
           print('正在請求目標網頁....',get_url)
           response=requests.get(get_url,headers=self.head)
           if response.status_code==200:
           #print(response.text)
           print('請求目標網頁完成....\n 準備解析....')
           self.head['referer'] = get_url
           return response.text
           except Exception:
           print('請求目標網頁失敗,請檢查錯誤重試')
           return None
           def parse_page(self,html):
           print('目標信息正在解析........')
           doc=pq(html)
           self.title=doc('head title').text()
           print(self.title)
           url = doc('#player').attr('src')[14:]
           html=self.get_m3u8_1(url).strip()
           #self.url = url + '800k/hls/index.m3u8'
           self.url = url[:-10] +html
           print(self.url)
           print('解析完成,獲取緩存ts文件.........')
           self.get_m3u8_2(self.url)
           def get_m3u8_1(self,url):
           try:
           response=requests.get(url,headers=self.head)
           html=response.text
           print('獲取ts文件成功,準備提取信息')
           return html[-20:]
           except Exception:
           print('緩存文件請求錯誤1,請檢查錯誤')
           def get_m3u8_2(self,url):
           try:
           response=requests.get(url,headers=self.head)
           html=response.text
           print('獲取ts文件成功,準備提取信息')
           self.parse_ts_2(html)
           except Exception:
           print('緩存文件請求錯誤2,請檢查錯誤')
           def parse_ts_2(self,html):
           pattern=re.compile('.*?(.*?).ts')
           self.ts_lists=re.findall(pattern,html)
           print('信息提取完成......\n準備下載...')
           self.pool()
           def pool(self):
           print('經計算需要下載%d個文件' % len(self.ts_lists))
           self.ts_url = self.url[:-10]
           if self.title not in os.listdir():
           os.makedirs(self.title)
           print('正在下載...所需時間較長,請耐心等待..')
           #開啟多進程下載
           pool=Pool(16)
           pool.map(self.save_ts,[ts_list for ts_list in self.ts_lists])
           pool.close()
           pool.join()
           print('下載完成')
           self.ts_to_mp4()
           def ts_to_mp4(self):
           print('ts文件正在進行轉錄mp4......')
           str='copy /b '+self.title+'\*.ts '+self.title+'.mp4'
           os.system(str)
           filename=self.title+'.mp4'
           if os.path.isfile(filename):
           print('轉換完成,祝你觀影愉快')
           shutil.rmtree(self.title)
           def save_ts(self,ts_list):
           try:
           ts_urls = self.ts_url + '{}.ts'.format(ts_list)
           self.i += 1
           print('當前進度%d/%d'%(self.i,len(self.ts_lists)))
           urlretrieve(url=ts_urls, filename=self.title + '/{}.ts'.format(ts_list))
           except Exception:
           print('保存文件出現錯誤')
          if __name__ == '__main__':
           #電影目標url:狄仁杰之四大天王
           url='https://v.qq.com/x/cover/r6ri9qkcu66dna8.html'
           #電影碟中諜5:神秘國度
           url1='https://v.qq.com/x/cover/5c58griiqftvq00.html'
           #電視劇斗破蒼穹
           url2='https://v.qq.com/x/cover/lcpwn26degwm7t3/z0027injhcq.html'
           url3='https://v.qq.com/x/cover/33bfp8mmgakf0gi.html'
           video_down(url2)```
          

          視頻緩存ts文件

          這里都是一些緩存視頻文件,每個只有幾秒鐘播放,最后需要合并成一個mp4格式的視頻,就可以正常播放,默認高清下載

          注意這里的進度因為使用多進程下載,進度僅供參考,沒有確切顯示進度,可以進文件夾查看正常進度,可以理解為顯示一次進度,下載一個ts文件

          實現效果

          代,皇帝派東廠督主高德海率艦隊前往東海尋求不老泉。誰料途中遭遇蛟龍襲擊,不慎沉船,艦隊誤入荒島冒險,錦衣衛侍衛嚴烈偶遇了“世間最后一個鮫人”—美麗善良的汐音,并和汐音相愛。點擊觀看精彩預告:https://v.qq.com/x/cover/mzc00200wgk8h15/r3062i731dn.html

          這部奇幻愛情電影《東海人魚傳》將于2月21日在騰訊視頻獨家首播,奇幻驚險,“人魚戀”蕩氣回腸,千萬不要錯過。

          “錦衣衛探險隊”誤入孤島險喪命 “人魚戀”甜煞人

          東廠錦衣衛在幫皇帝尋找不老泉的過程中被蛟龍襲擊,一眾人流落蓬萊島,錦衣衛嚴烈離奇邂逅了鮫人“汐音”,汐音首次遇到“懼水無鰭,走地千里”的陸人,甚是興奮,沒想到后來就被狠毒的錦衣衛抓獲,將她作為尋找不老泉的誘餌,誰知在相處的過程中,嚴烈和汐音暗生情愫。

          錦衣衛督主高德海心狠手辣,一心只想尋求長生不老泉,稱汐音為“畜生”,一心只想利用汐音。汐音身為鮫人,不懂人類社會的人情世故,不知什么是 “男女授受不親”,仿佛“天真蘿莉”;嚴烈雖然是行事果決的錦衣衛,但心地善良有原則,他被汐音相救,并被她的善良和天真打動,一個人類,一個鮫人,就這樣相愛了。感情發展的過程,完全是曖昧中的“歡喜冤家”,一舉一動都很甜膩,發糖發到停不下來。

          俊男靚女上陣十分養眼 詮釋最動人愛情悲歌

          《東海人魚傳》這部電影的主線是嚴烈和汐音的愛情故事,講述的是“雖然人心險惡,惡龍難纏,但愛情依舊永垂不朽”的悲歌。主演梁霆煒和邱詩媛這對“熒幕情侶”因為出眾的外形和靈動的演技,讓人大呼“登對”。其中,可愛善良的“人魚”汐音的飾演者邱詩媛更是給大家留下了深刻的印象。其實,這不是邱詩媛第一次和“人魚”結緣,在2017年,邱詩媛就曾在騰訊視頻的綜藝《星星美人魚》中表現出色,并獲得和電影《美人魚2》導演周星馳見面的機會,可以說和“人魚”緣份很深。還曾在大熱綜藝《奔跑吧》中擔任體育解說員,因為擅長體育解說,2014年世界杯期間邱詩媛還被評為“pptv四小花旦”之一,是頗具人氣和潛力的女藝人。

          本片由深圳市大唐星禾文化傳媒有限公司、廈門淘夢銀河文化科技有限公司、北京熊孩子傳媒科技責任有限公司出品,陜西盧卡影業有限公司、廣東精鷹傳媒股份有限公司、霍爾果斯創維酷開文化傳媒有限公司、深圳市和鳴文化傳媒有限公司、深圳聚光繪影文化傳媒有限公司聯合出品,天津淘夢銀漢天河網絡技術有限公司獨家宣發,崔炎龍執導,梁霆煒、邱詩媛、王欽等主演,2月21日,騰訊視頻獨家首播,記得準時收看。


          主站蜘蛛池模板: 日本在线视频一区| 久久亚洲综合色一区二区三区| 日韩一区二区久久久久久| 国产精品视频一区二区三区不卡| av无码精品一区二区三区四区| 精品一区二区三区高清免费观看 | 久久99久久无码毛片一区二区| 国产精品无码AV一区二区三区| 久久国产视频一区| 成人丝袜激情一区二区| 久久精品国产一区二区电影| 日韩精品中文字幕无码一区| 成人丝袜激情一区二区| 影院无码人妻精品一区二区| 久久久久人妻精品一区| 成人H动漫精品一区二区| 成人区精品人妻一区二区不卡| 国产精品一区视频| 一区二区三区91| 91福利视频一区| 国产一区二区精品久久91| 无码精品一区二区三区在线| 日本一区二区三区精品视频| 无码少妇精品一区二区免费动态| 大帝AV在线一区二区三区| 国内国外日产一区二区| 精品国产一区二区三区免费看| 一夲道无码人妻精品一区二区| 美日韩一区二区三区| 久久中文字幕一区二区| 免费在线视频一区| 亚洲美女视频一区| 超清无码一区二区三区| 亚洲AV无码一区二区三区电影| 在线观看午夜亚洲一区| 免费无码AV一区二区| 国产成人精品第一区二区| 亚洲av无码不卡一区二区三区 | 国产免费一区二区三区| 日本精品高清一区二区| 国产一区二区免费在线|