摘要:任務,它是對協程對象的進一步封裝,包含了任務的各個狀態。代表將來執行或還沒有執行的任務,實際上和沒有本質區別。
- 單線程、多線程
- 線程池
- 單協程、多協程
- headers中Refere的作用
- 異步模塊aiohttp使用
高性能異步爬蟲 :在爬蟲中使用異步實現高性能的數據爬取操作
傳統爬取數據的操作是順序操作,下面看一個實例
分析上述代碼可知 for循環中的get方法會阻塞程序,只有請求到的數據獲取后,才可以進行下一條url中對應的數據
上述可知,使用異步會提高爬蟲程序的數據獲取效率
- 多線程,多進程
好處:可以為相關阻塞的操作多帶帶開啟線程或進程,阻塞操作就可以異步進行
弊端:無法無限制的開啟多線程或者多進程- 線程池、進程池(適當的使用)
好處:我們可以降低系統對進程或者線程創建和銷毀的一個頻率,從而很好的降低系統的開銷
弊端:池中線程或進程的數量是有上限的。
import time# 單線程串行方式運行def get_page(str): print("正在下載:",str) time.sleep(2) print("下載成功:",str)name_list = ["xiaozi","aa","bb","cc"]start_time = time.time()for i in range(len(name_list)): get_page(name_list[i])end_time = time.time()print("%d second" % (end_time - start_time))
import time# 導入線程池模塊對應的類from multiprocessing.dummy import Pool# 使用線程池方式執行# Pool一定是應用在阻塞操作中的 get_pagestart_time = time.time()def get_page(str): print("正在下載:",str) time.sleep(2) print("下載成功:",str)name_list = ["xiaozi","aa","bb","cc"]# 實例化一個線程池對象pool = Pool(4) # 4個線程對象# 將列表中每一個列表元素傳遞給get_page進行處理# pool.map的返回值就是方法get_page()的返回值pool.map(get_page,name_list)end_time = time.time()print(end_time-start_time)
本例爬取梨視頻網站:梨視頻官網
以上視頻是我們需要爬取的具體視頻,鍵盤上F12查看并且分析相關的detail_url和name,
到此你可能認為使用xpath進行地址獲取下載即可,但是這樣就錯了,你使用etree進行解析出來的是空值,因為這個頁面的有些數據就是動態加載出來的,如下進行驗證:
到此為止,我們發現數據是動態加載出來的,因此我們就需要找出真正要下載的地址鏈接在哪里?
在此感謝這兩位博主提供的思路:
- 報錯404:
https://video.pearvideo.com/mp4/adshort/20210927/1632790695959
-15774345_adpkg-ad_hd.mp4- 正確的路徑:
https://video.pearvideo.com/mp4/adshort/20210927/cont-1742572
-15774345_adpkg-ad_hd.mp4
此外多次實驗發現獲取報錯404地址的網址有一部分數字是隨機產生的,
- 寶藏老師|數學老師的浪漫:用函數講述自己的愛情故事:
https://www.pearvideo.com/videoStatus.jsp?contId=1742617
&mrd=0.6446715186101781- 小伙腫瘤醫院旁開共享廚房,宣傳5元吃飽虧本運營:
https://www.pearvideo.com/videoStatus.jsp?contId=1742572
&mrd=0.5091336020577668
通過以上兩個視頻的地址不難發現它們網址都有共同的特點包含contId,我們再回到原始的視頻網頁數據查看:
后來由于個人水平問題這個屬性值解析出錯,因此換了思路:
https://www.pearvideo.com/videoStatus.jsp?contId=1742572&mrd=0.8749545784196235https://www.pearvideo.com/videoStatus.jsp?contId=1742572&mrd=0.5510063831062151https://www.pearvideo.com/videoStatus.jsp?contId=1742572&mrd=0.5091336020577668
import requestsfrom lxml import etreeimport randomimport jsonfrom multiprocessing.dummy import Pool# 需求:安去梨視頻的視頻數據headers = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36"}# 原則:線程池處理的是阻塞且耗時的操作# 對下述url發起請求解析出視頻詳情頁的url和視頻的名稱url = "https://www.pearvideo.com/"page_text = requests.get(url=url, headers=headers).texttree = etree.HTML(page_text)# xpath返回的是列表 ["video_1742557"]all_addresses = tree.xpath("http://div[@id="vervideoTlist"]//a[@class="vervideo-lilink actplay"]/@href")# print(all_addresses)# ["video_1742557", "video_1742534", "video_1742545", "video_1733739", "video_1718659"]all_names = tree.xpath("http://div[@id="vervideoTlist"]//div[@class="vervideo-name"]/text()")# print(all_names)urls = []for i in range(len(all_addresses)): video_url = "https://www.pearvideo.com/" + all_addresses[i] mp4_name = all_names[i] + ".mp4" video_page_text = requests.get(url=video_url,headers=headers).text video_tree = etree.HTML(video_page_text) # https://www.pearvideo.com/videoStatus.jsp?contId=1742572&mrd=0.8749545784196235 contId = video_tree.xpath("http://div[@class="fav"]/@data-id")[0] # print(contId) mrd = random.random() # random.random() 0.5330239801324711 new_headers={ "Referer":video_url, "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36" } ajax_url = "https://www.pearvideo.com/videoStatus.jsp?contId="+str(contId)+"&mrd="+str(mrd) real_video_content = requests.get(url=ajax_url,headers=new_headers).text # 返回的是json字符串 # 獲取偽地址 false_video_url = eval(real_video_content)["videoInfo"]["videos"]["srcUrl"] # 獲取真地址 old=false_video_url.split("/")[-1].split("-")[0] new="cont-"+str(contId) true_video_url=false_video_url.replace(old,new) dic = { "name":mp4_name, "video_url":true_video_url } urls.append(dic)#使用線程池對數據視頻進行請求def get_video_data(dic): print(dic["name"]+"開始下載.....") data_url=dic["video_url"] data=requests.get(url=data_url,headers=headers).content with open(dic["name"],"wb") as f: f.write(data) print(dic["name"]+"下載成功")pool=Pool(4)pool.map(get_video_data,urls) pool.close()# 關閉pool,使其不在接受新的(主進程)任務pool.join() # 主進程阻塞后,讓子進程繼續運行完成,子進程運行完后,再把主進程全部關掉# print(video_url,mp4_name):# https://www.pearvideo.com/video_1742572 小伙腫瘤醫院旁開共享廚房,宣傳5元吃飽虧本運營.mp4# https://www.pearvideo.com/video_1742617 寶藏老師|數學老師的浪漫:用函數講述自己的愛情故事.mp4# https://www.pearvideo.com/video_1742606 每一幀都如夢境!航拍神農架絕美秋季,云霧浩渺紅架絕美秋季,云霧浩渺紅葉爭艷.mp4# https://www.pearvideo.com/video_1740575 89歲浙大教師拾破爛9年, 金全部捐助貧困生.mp4 資金全部捐助貧困生.mp4 丘菜刀嗎?18道工序,手 # https://www.pearvideo.com/video_1727677 聽說過章丘鐵鍋,聽說過章丘菜刀嗎?18道工序,手工鍛打.mp4
返回隨機生成的一個實數,它在
[0,1)
范圍內
>>> import random>>> random.random()0.5330239801324711
Referer是HTTP請求Header的一部分,當瀏覽器向Web服務器發送請求的時候,請求頭信息一般需要包含Referer。
該Referer會告訴服務器我是從哪個頁面鏈接過來的,服務器基此可以獲得一些信息用于處理。
Referer作用是什么?
- 防盜鏈
比如辦事通服務器只允許網站訪問自己的靜態資源,那服務器每次都需要判斷Referer的值是否是>zwfw.yn.gov.cn,如果是就繼續訪問,不是就攔截。- 防止惡意請求
比如靜態請求是.html結尾的,動態請求是.shtml,那么所有的*.shtml請求,必須 Referer為我自己的>網站才可以訪問,這就是Referer的作用。
參考鏈接
切片目的:獲取地址中需要替換的內容
報錯404:https://video.pearvideo.com/mp4/adshort/20210927/1632790695959-15774345_adpkg-ad_hd.mp4正確的路徑:https://video.pearvideo.com/mp4/adshort/20210927/cont-1742572-15774345_adpkg-ad_hd.mp4# 獲取真地址old=false_video_url.split("/")[-1].split("-")[0] new="cont-"+str(contId)true_video_url=false_video_url.replace(old,new)
>>> url = "https://video.pearvideo.com/mp4/adshort/20210927/1632790695959-15774345_adpkg-ad_hd.mp4">>> url.split("/")["https:", "", "video.pearvideo.com", "mp4", "adshort", "20210927", "1632790695959-15774345_adpkg-ad_hd.mp4"]>>> str = url.split("/")[-1]>>> str"1632790695959-15774345_adpkg-ad_hd.mp4">>> str.split("-")["1632790695959", "15774345_adpkg", "ad_hd.mp4"]>>> str.split("-")[0]"1632790695959">>>
print("-----eval-----")print(eval(real_video_content))print("-----json.loads()-----")print(json.loads(real_video_content))
-----eval-----{"resultCode": "1", "resultMsg": "success", "reqId": "c44f6eb1-971a-410a-9959-a92d2afeb05f", "systemTime": "1632799446578", "videoInfo": {"playSta": "1", "video_image": "https://image2.pearvideo.com/cont/20210927/cont-1742572-12624944.jpg", "videos": {"hdUrl": "", "hdflvUrl": "", "sdUrl": "", "sdflvUrl": "", "srcUrl": "https://video.pearvideo.com/mp4/adshort/20210927/1632799446578-15774345_adpkg-ad_hd.mp4"}}}-----json.loads()-----{"resultCode": "1", "resultMsg": "success", "reqId": "c44f6eb1-971a-410a-9959-a92d2afeb05f", "systemTime": "1632799446578", "videoInfo": {"playSta": "1", "video_image": "https://image2.pearvideo.com/cont/20210927/cont-1742572-12624944.jpg", "videos": {"hdUrl": "", "hdflvUrl": "", "sdUrl": "", "sdflvUrl": "", "srcUrl": "https://video.pearvideo.com/mp4/adshort/20210927/1632799446578-15774345_adpkg-ad_hd.mp4"}}}-----eval-----{"resultCode": "1", "resultMsg": "success", "reqId": "e488637c-0200-41f0-a259-9493913f1d11", "systemTime": "1632799446898", "videoInfo": {"playSta": "1", "video_image": "https://image1.pearvideo.com/cont/20210927/cont-1742617-12625072.jpg", "videos": {"hdUrl": "", "hdflvUrl": "", "sdUrl": "", "sdflvUrl": "", "srcUrl": "https://video.pearvideo.com/mp4/adshort/20210927/1632799446898-15774709_adpkg-ad_hd.mp4"}}}-----json.loads()-----{"resultCode": "1", "resultMsg": "success", "reqId": "e488637c-0200-41f0-a259-9493913f1d11", "systemTime": "1632799446898", "videoInfo": {"playSta": "1", "video_image": "https://image1.pearvideo.com/cont/20210927/cont-1742617-12625072.jpg", "videos": {"hdUrl": "", "hdflvUrl": "", "sdUrl": "", "sdflvUrl": "", "srcUrl": "https://video.pearvideo.com/mp4/adshort/20210927/1632799446898-15774709_adpkg-ad_hd.mp4"}}}-----eval-----{"resultCode": "1", "resultMsg": "success", "reqId": "b2b607e8-9685-4f3f-8c16-e10aedad97d0", "systemTime": "1632799447261", "videoInfo": {"playSta": "1", "video_image": "https://image2.pearvideo.com/cont/20210927/cont-1742606-12625013.png", "videos": {"hdUrl": "", "hdflvUrl": "", "sdUrl": "", "sdflvUrl": "", "srcUrl": "https://video.pearvideo.com/mp4/adshort/20210927/1632799447261-15774653_adpkg-ad_hd.mp4"}}}-----json.loads()-----{"resultCode": "1", "resultMsg": "success", "reqId": "b2b607e8-9685-4f3f-8c16-e10aedad97d0", "systemTime": "1632799447261", "videoInfo": {"playSta": "1", "video_image": "https://image2.pearvideo.com/cont/20210927/cont-1742606-12625013.png", "videos": {"hdUrl": "", "hdflvUrl": "", "sdUrl": "", "sdflvUrl": "", "srcUrl": "https://video.pearvideo.com/mp4/adshort/20210927/1632799447261-15774653_adpkg-ad_hd.mp4"}}}-----eval-----{"resultCode": "1", "resultMsg": "success", "reqId": "16929bb3-257e-4c01-94df-4343a42b99d9", "systemTime": "1632799447584", "videoInfo": {"playSta": "1", "video_image": "https://image1.pearvideo.com/cont/20210227/cont-1721628-12558949.png", "videos": {"hdUrl": "", "hdflvUrl": "", "sdUrl": "", "sdflvUrl": "", "srcUrl": "https://video.pearvideo.com/mp4/adshort/20210227/1632799447584-15618162_adpkg-ad_hd.mp4"}}}-----json.loads()-----{"resultCode": "1", "resultMsg": "success", "reqId": "16929bb3-257e-4c01-94df-4343a42b99d9", "systemTime": "1632799447584", "videoInfo": {"playSta": "1", "video_image": "https://image1.pearvideo.com/cont/20210227/cont-1721628-12558949.png", "videos": {"hdUrl": "", "hdflvUrl": "", "sdUrl": "", "sdflvUrl": "", "srcUrl": "https://video.pearvideo.com/mp4/adshort/20210227/1632799447584-15618162_adpkg-ad_hd.mp4"}}}-----eval-----{"resultCode": "1", "resultMsg": "success", "reqId": "34db5053-02f9-40c1-98c8-4d83a0e7d50f", "systemTime": "1632799447961", "videoInfo": {"playSta": "1", "video_image": "https://image.pearvideo.com/cont/20210521/cont-1729993-12587145.png", "videos": {"hdUrl": "", "hdflvUrl": "", "sdUrl": "", "sdflvUrl": "", "srcUrl": "https://video.pearvideo.com/mp4/adshort/20210521/1632799447961-15678629_adpkg-ad_hd.mp4"}}}-----json.loads()-----{"resultCode": "1", "resultMsg": "success", "reqId": "34db5053-02f9-40c1-98c8-4d83a0e7d50f", "systemTime": "1632799447961", "videoInfo": {"playSta": "1", "video_image": "https://image.pearvideo.com/cont/20210521/cont-1729993-12587145.png", "videos": {"hdUrl": "", "hdflvUrl": "", "sdUrl": "", "sdflvUrl": "", "srcUrl": "https://video.pearvideo.com/mp4/adshort/20210521/1632799447961-15678629_adpkg-ad_hd.mp4"}}}
通過以上測試不難發現json.loads()方式和eval方式都可以將json處理為相同的結果,但是既然是不同的方法,終究會有區別
event_loop:事件循環,相當于一個無限循環,我們可以把一些函數注冊到這個事件循環上,當滿足某些條件的時候,函數就會被循環執行
coroutine:協程對象,我們可以將協程對象注冊到事件循環中,它會被事件循環調用。我們可以使用async關鍵字來定義一個方法,這個方法在調用時不會立即被執行,而是返回一個協程對象。
task:任務,它是對協程對象的進一步封裝,包含了任務的各個狀態。
future:代表將來執行或還沒有執行的任務,實際上和task沒有本質區別。
async:定義一個協程
await?
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/121681.html
摘要:以下這些項目,你拿來學習學習練練手。當你每個步驟都能做到很優秀的時候,你應該考慮如何組合這四個步驟,使你的爬蟲達到效率最高,也就是所謂的爬蟲策略問題,爬蟲策略學習不是一朝一夕的事情,建議多看看一些比較優秀的爬蟲的設計方案,比如說。 (一)如何學習Python 學習Python大致可以分為以下幾個階段: 1.剛上手的時候肯定是先過一遍Python最基本的知識,比如說:變量、數據結構、語法...
摘要:楚江數據是專業的互聯網數據技術服務,現整理出零基礎如何學爬蟲技術以供學習,。本文來源知乎作者路人甲鏈接楚江數據提供網站數據采集和爬蟲軟件定制開發服務,服務范圍涵蓋社交網絡電子商務分類信息學術研究等。 楚江數據是專業的互聯網數據技術服務,現整理出零基礎如何學爬蟲技術以供學習,http://www.chujiangdata.com。 第一:Python爬蟲學習系列教程(來源于某博主:htt...
摘要:用將倒放這次讓我們一個用做一個小工具將動態圖片倒序播放發現引力波的機構使用的包美國科學家日宣布,他們去年月首次探測到引力波。宣布這一發現的,是激光干涉引力波天文臺的負責人。這個機構誕生于上世紀年代,進行引力波觀測已經有近年。 那些年我們寫過的爬蟲 從寫 nodejs 的第一個爬蟲開始陸陸續續寫了好幾個爬蟲,從爬拉勾網上的職位信息到爬豆瓣上的租房帖子,再到去爬知乎上的妹子照片什么的,爬蟲...
摘要:學習筆記七數學形態學關注的是圖像中的形狀,它提供了一些方法用于檢測形狀和改變形狀。學習筆記十一尺度不變特征變換,簡稱是圖像局部特征提取的現代方法基于區域圖像塊的分析。本文的目的是簡明扼要地說明的編碼機制,并給出一些建議。 showImg(https://segmentfault.com/img/bVRJbz?w=900&h=385); 前言 開始之前,我們先來看這樣一個提問: pyth...
閱讀 748·2021-10-14 09:43
閱讀 2072·2021-09-30 09:48
閱讀 3440·2021-09-08 09:45
閱讀 1089·2021-09-02 15:41
閱讀 1877·2021-08-26 14:15
閱讀 770·2021-08-03 14:04
閱讀 2971·2019-08-30 15:56
閱讀 3071·2019-08-30 15:52