python爬蟲實踐——爬取“梨視頻”


一、爬蟲的基本過程:
 1、發送請求(請求庫:request,selenium)
 2、獲取響應數據()服務器返回
 3、解析並提取數據(解析庫:re,BeautifulSoup,Xpath)
 4、保存數據(儲存庫)MongoDB

二、爬取“梨視頻”中的某一個視頻

1 # 爬取梨視頻 2 import requests 3 url='https://video.pearvideo.com/mp4/adshort/20190613/cont-1565846-14013215_adpkg-ad_hd.mp4' 4 res = requests.get(url) 5 #將爬取的視頻寫入文件 6 with open('梨視頻.mp4', 'wb') as f: 7 f.write(res.content)

 三、正則表達式的使用

1、re.find.all('正則匹配規則',‘解析文本’,“正則模式”)
2、re.S:全局模式(對整個文本進行匹配)
3、指的是當前位置
4、*指的是查找所有

四、爬取整個“梨視頻”中的視頻

 1 import requests
 2 import re
 3 import uuid
 4 
 5 #1、發送請求
 6 def get_page(url):
 7     response=requests.get(url)
 8     return response
 9 
10 #2、解析數據
11 def parse_index(text):
12     res=re.findall('<a href="video_(.*?)"',text,re.S)
13 
14     detail_url_list=[]
15     for m_id in res:
16         detail_url='https://www.pearvideo.com/video_'+m_id
17         detail_url_list.append(detail_url)
18 
19     return detail_url_list
20 
21 #解析詳情頁獲取視頻url
22 def parse_detail(text):
23     movie_url=re.findall('srcUrl="(.*?)"',text,re.S)[0]
24     return movie_url
25 
26 #3、保存數據
27 def save_movie(movie_url):
28     response=requests.get(movie_url)
29     with open(f'{uuid.uuid4()}.mp4','wb')as f:
30         f.write(response.content)
31         f.flush()
32 
33 
34 #主函數:(輸入'main',然后按”回車“)
35 if __name__ == '__main__':
36     #1、對主頁發送請求
37     index_res=get_page(url='https://www.pearvideo.com/')
38     #2、對主頁進行解析、獲取詳情頁id
39     detail_url_list=parse_index(index_res.text)
40 
41     #3、對每個詳情頁url發送請求
42     for detail_url in detail_url_list:
43         detail_res=get_page(url=detail_url)
44 
45         #4、解析詳情頁獲取視頻url
46         movie_url=parse_detail(detail_res.text)
47         print(movie_url)
48 
49         #5、保存視頻
50         save_movie(movie_url)

五、多線程爬取整個“梨視頻”中的視頻

 1 import requests
 2 import re  # 正則模塊
 3 # uuid.uuid4()  可以根據時間戳生成一段世界上唯一的隨機字符串
 4 import uuid
 5 # 導入線程池模塊
 6 from concurrent.futures import ThreadPoolExecutor
 7 # 線程池限制50個線程
 8 pool = ThreadPoolExecutor(50)
 9 
10 # 爬蟲三部曲
11 
12 # 1、發送請求
13 def get_page(url):
14     print(f'開始異步任務: {url}')
15     response = requests.get(url)
16     return response
17 
18 
19 # 2、解析數據
20 # 解析主頁獲取視頻詳情頁ID
21 def parse_index(res):
22 
23     response = res.result()
24     # 提取出主頁所有ID
25     id_list = re.findall('<a href="video_(.*?)"', response.text, re.S)
26     # print(res)
27 
28     # 循環id列表
29     for m_id in id_list:
30         # 拼接詳情頁url
31         detail_url = 'https://www.pearvideo.com/video_' + m_id
32         # print(detail_url)
33         # 把詳情頁url提交給get_page函數
34         pool.submit(get_page, detail_url).add_done_callback(parse_detail)
35 
36 
37 # 解析詳情頁獲取視頻url
38 def parse_detail(res):
39     response = res.result()
40     movie_url = re.findall('srcUrl="(.*?)"', response.text, re.S)[0]
41     # 異步提交把視頻url傳給get_page函數,把返回的結果傳給save_movie
42     pool.submit(get_page, movie_url).add_done_callback(save_movie)
43 
44 
45 # 3、保存數據
46 def save_movie(res):
47 
48     movie_res = res.result()
49 
50     # 把視頻寫到本地
51     with open(f'{uuid.uuid4()}.mp4', 'wb') as f:
52         f.write(movie_res.content)
53         print(f'視頻下載結束: {movie_res.url}')
54         f.flush()
55 
56 
57 if __name__ == '__main__':  # main + 回車鍵
58 
59     # 一 往get_page發送異步請求,把結果交給parse_index函數
60     url = 'https://www.pearvideo.com/'
61     pool.submit(get_page, url).add_done_callback(parse_index)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM