今日內容:
爬蟲課程:
一 爬蟲基本原理
二 request請求庫
一 爬蟲基本原理
一、什麼是爬蟲?
爬蟲就是爬取數據
二、什麼是互聯網?
由一堆網絡設備,把一臺臺計算機互聯到一塊兒稱之爲互聯網。
三、互聯網創建的目的
數據的傳遞與數據的共享
四、什麼是數據?
例如:
電商平臺的商品信息()
鏈家、自如租房平臺的房源信息
股票證券投資信息()
...
1230六、票務信息(搶票)
五、什麼是上網?
普通用戶:
打開互聯網
--->輸入網址
--->往目標主機發送請求
--->返回響應數據
--->把數據渲染到瀏覽器中
爬蟲程序:
模擬瀏覽器
--->往目標主機發送請求
--->返回響應數據
--->解析並提取有價值的數據
--->保存數據(文件寫入本地、持久化到數據庫中)
六、爬蟲全過程:
1.發送數據(請求庫:Request/Selenium)
2.獲取響應數據
3.解析數據(解析庫:BeautifulSoup4)
4.保存數據(存儲庫:文件保存/MongoDB)
總結:咱們能夠把互聯網中的數據比喻成一座寶藏,爬蟲其實就是在挖去寶藏。
二 requests請求庫
一、安裝與使用
pip3 install requests
二、分析請求流程(模擬瀏覽器)
- 百度:
1.請求url
www.baidu.com
2.請求方式
GET
POST
3.響應狀態碼
測試用例:
01❤爬取視頻
1 """ 2 爬取校花網視頻: 3 一 請求url 4 https://www.xiaohuar.com/v/ 5 二 請求方式 6 GET 7 三 請求頭信息 8 User-Agent:用戶代理 9 """ 10 import time 11 import requests 12 # 爬蟲三部曲 13 # 1.發送請求 14 def get_page(url): 15 response = requests.get(url) 16 return response 17 18 # 2.解析數據 19 import re 20 def parse_index(html): 21 # findall匹配全部 22 # re.findall("正則匹配規則","匹配文本","匹配模式") 23 # re.S:對所有文本運行搜索匹配 24 detail_urls = re.findall( 25 '<div class="items"><a class="imglink" href="(.*?)" ',html,re.S) 26 # for detail_url in detail_urls: 27 # print(detail_url) 28 return detail_urls 29 # 解析詳情頁 30 def parse_detail(html): 31 movie_url = re.findall('<source src="(.*?)">',html,re.S) 32 # print(movie_url) 33 if movie_url: 34 return movie_url[0] 35 # 3.保存數據 36 import uuid 37 #uuid.uuid4()根據時間戳生成一段世界上惟一的字符串 38 def save_video(content): 39 with open(f'{uuid.uuid4()}.mp4','wb') as f: 40 f.write(content) 41 print('視頻已下載完畢') 42 # main + 回車鍵 43 # 測試用例 44 if __name__ == '__main__': 45 for line in range(6): 46 url = f'http://www.xiaohuar.com/list-3-{line}.html' 47 48 # 發送請求 49 response = get_page(url) 50 # print(response) 51 #返回響應狀態碼 52 # print(response.status_code) 53 # 返回響應文本 54 # print(response.text) 55 # 解析主頁頁面 56 detail_urls = parse_index(response.text) 57 # 循環遍歷詳情頁url 58 for detail_url in detail_urls: 59 # print(detail_url) 60 # 往每個詳情頁發送請求 61 detail_res= get_page(detail_url) 62 # print(response.text) 63 # 解析詳情頁獲取視頻url 64 movie_url = parse_detail(detail_res.text) 65 # 判斷視頻url存在則打印 66 if movie_url: 67 print(movie_url) 68 # 往視頻url發送請求獲取視頻二進制流 69 movie_res = get_page(movie_url) 70 # 把視頻的二進制流傳給save_video函數去保存到本地 71 save_video(movie_res.content)
02❤POST請求自動登陸html
1 ''' 2 POST請求自動登陸github: 3 請求url: 4 https://github.com/session 5 請求方式: 6 POST 7 請求頭: 8 Cookie 9 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36 10 請求體: 11 commit: 登入 12 utf8: ✓ 13 authenticity_token: BmBVp2/GJ9KBl9fNLe17Dl9mrbQEDhqDifKOz1KJ4mgo3+Pv7COy+so2zVc0gZ1hVJP9i1+boDfsQl41mi2AoQ== 14 login: ******* 15 password:******* 16 webauthn-support: supported 17 18 ''' 19 # 獲取token隨機字符串 20 ''' 21 1.訪問登陸頁面獲取token的隨機字符串 22 請求url: 23 https://github.com/login 24 請求方式: 25 GET 26 請求頭: 27 COOKIES 28 User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36 29 2.解析並提取token字符串 30 # 正則 31 <input type="hidden" name="authenticity_token" value="(.*?)"/> 32 ''' 33 import requests 34 import re 35 login_url = 'https://github.com/login' 36 # login頁面的請求頭信息 37 login_header = { 38 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36' 39 } 40 login_res = requests.get(url=login_url, headers=login_header) 41 # print(login_res.text) 42 43 #解析並提取token字符串# 44 authenticity_token=re.findall( 45 '<input type="hidden" name="authenticity_token" value="(.*?)" />',login_res.text,re.S)[0] 46 # print(authenticity_token) 47 48 #獲取login頁面的cookies信息 49 # print(type(login_res.cookies)) 50 # print(type(login_res.cookies.get_dict())) 51 login_cookies = login_res.cookies.get_dict() 52 53 # 開始登陸github 54 ''' 55 POST請求自動登陸github: 56 請求url: 57 https://github.com/session 58 請求方式: 59 POST 60 請求頭: 61 Cookie 62 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36 63 請求體: 64 commit: 登入 65 utf8: ✓ 66 authenticity_token: BmBVp2/GJ9KBl9fNLe17Dl9mrbQEDhqDifKOz1KJ4mgo3+Pv7COy+so2zVc0gZ1hVJP9i1+boDfsQl41mi2AoQ== 67 login: ******* 68 password:******* 69 webauthn-support: supported 70 71 ''' 72 # session登陸url 73 session_url = 'https://github.com/session' 74 # 請求頭信息 75 session_headers = { 76 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36' 77 } 78 # 請求體信息 79 form_data = { 80 "commit":"Sign in", 81 "utf8": "√", 82 "authenticity_token": authenticity_token, 83 "login":"********", 84 "password":"*******", 85 "webauthn-support": "supported" 86 } 87 session_res = requests.post(url=session_url, 88 headers=session_headers, 89 cookies=login_cookies, 90 data=form_data) 91 with open ('github3.html','w',encoding='utf-8') as f: 92 f.write(session_res.text)