Day 01

今日內容:
爬蟲課程:
一 爬蟲基本原理
二 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)

 02POST請求自動登陸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)
相關文章
相關標籤/搜索