一、爬蟲的基本過程:
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)