首先咱們來解釋一下幾個概念:html
一、什麼是爬蟲?git
爬取數據。github
web
由一堆網絡設備、把一臺臺的計算機互聯到一塊兒稱之爲互聯網。正則表達式
三、互聯網創建的目的:數據庫
數據的傳遞與數據的共享。瀏覽器
四、什麼是數據?cookie
列如:網絡
電商平臺的商品信息(京東、淘寶、亞馬遜)session
租房平臺的房源信息(鏈家、自如)
股票證券的投資信息(東方財富、雪球網)
12306的票務信息(搶票)
五、什麼是上網?
普通用戶:
打開瀏覽器————>輸入網址————>往目標主機發送請求————>返回響應數據————>把數據渲染到瀏覽器中
爬蟲程序:
模擬瀏覽器————>往目標主機發送請求————>返回響應數據————>解析並提取有價值的數據————>保存數據(文件寫入本地,持久化到數據庫中)
六、爬蟲的全過程
總結:咱們互聯網的數據比喻成一座寶藏,爬蟲就是在挖取寶藏。
咱們爬蟲要用到的requests請求庫:
安裝:
pip3 install requests
每次使用的時候在代碼前面加上
import requests
舉例:
1、爬「校花網」
爲了增長咱們學習的動力,咱們先來爬點視頻。
找到校花網的主頁url:
http://www.xiaohuar.com/list-3-0.html
找到每一個視頻詳情頁的url(經過谷歌瀏覽器檢查的方式(.*?)使用了正則表達式):
<div class="items"><a class="imglink" href="(.*?)"
找到視頻的源地址的url:
<source src="(.*?)">
三個函數:
發送請求:
def get_page(url): response = requests.get(url) return response
解析數據:
import re def parse_index(html): # findall匹配全部 # re.findall('正則匹配規則','匹配文本'.'匹配模式') # re.S:對所有文本進行搜索匹配 detail_urls = re.findall('<div class="items"><a class="imglink" href="(.*?)"', html, re.S) return detail_urls # 解析詳情頁 def parse_detail(html): movie_url = re.findall('<source src="(.*?)">', html, re.S) if movie_url: return movie_url[0]
保存數據:
import uuid def save_video(content): with open(f'{uuid.uuid4()}.mp4','wb') as f: f.write(content) print('視頻下載完畢...請客人觀賞!!!')
附上全部代碼:
import requests # 1 發送請求 def get_page(url): response = requests.get(url) return response # 2 解析數據 import re def parse_index(html): # findall匹配全部 # re.findall('正則匹配規則','匹配文本'.'匹配模式') # re.S:對所有文本進行搜索匹配 detail_urls = re.findall('<div class="items"><a class="imglink" href="(.*?)"', html, re.S) return detail_urls # 解析詳情頁 def parse_detail(html): movie_url = re.findall('<source src="(.*?)">', html, re.S) if movie_url: return movie_url[0] # 3 保存數據 import uuid def save_video(content): with open(f'{uuid.uuid4()}.mp4','wb') as f: f.write(content) print('視頻下載完畢...請客人觀賞!!!') # 測試用例 if __name__ == '__main__': for line in range(6): url = f'http://www.xiaohuar.com/list-3-{line}.html' # 發送請求 response = get_page(url) # 解析主頁頁面 detail_urls = parse_index(response.text) # 循環遍歷詳情頁url for detail_urls in detail_urls: # 往每個詳情頁發送請求 detail_res = get_page(detail_urls) # 解析詳情頁獲取視頻url movie_url = parse_detail(detail_res.text) # 判斷視頻url存在則打印 if movie_url: print(movie_url) # 往視頻url發送請求獲取視頻二進制流 movie_res = get_page(movie_url) # 把視頻的二進制流傳給save_video函數去保存到本地 save_video(movie_res.content)
2、自動登陸github
1 訪問登陸界面獲取token隨機字符串
請求url:
https://github.com/login
請求方式:
GET
請求頭:
COOKIES
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
2 解析並提取token字符串
# 正則
<input type="hidden" name="authenticity_token" value="(.*?)"
import requests import re login_url = 'https://github.com/login' login_header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36' } login_res = requests.get(url=login_url, headers=login_header) # 解析提取token字符串 authenticity_token = re.findall( '<input type="hidden" name="authenticity_token" value="(.*?)"', login_res.text, re.S )[0] print(authenticity_token) # 獲取login頁面的cookies信息 login_cookies = login_res.cookies.get_dict()
2 開始登陸github
POST請求自動登陸github:
請求方式:
POST
請求URL:
https://github.com/session
請求頭:
Cookie
User-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
請求體:
commit: Sign in
utf8: ✓
authenticity_token: FbwwBOSWi3OrjoT7vmkyVnCruAAMEYkuT4AZcH9U6prQGQh5LLO9j0E8CeCUiP94oyQ/RwReQ81fDwfxWUa+sw==
login: ********
password: *******
webauthn-support: supported
# 請求url session_url = 'https://github.com/session' # 請求頭信息 session_headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36' } # 請求體信息 form_data = { "commit": "Sign in", "utf8": "✓", "authenticity_token": authenticity_token, "login": "*******", "password": "********", "webauthn-support": "supported" } session_res = requests.post( url=session_url, headers=session_headers, cookies=login_cookies, data=form_data ) with open('github.html', 'w', encoding='utf-8') as f: f.write(session_res.text)
其中******改爲本身的github帳號和密碼,請求頭信息和請求體信息經過瀏覽器的檢查方式查看。
附上全部代碼:
import requests import re login_url = 'https://github.com/login' login_header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36' } login_res = requests.get(url=login_url, headers=login_header) # 解析提取token字符串 authenticity_token = re.findall( '<input type="hidden" name="authenticity_token" value="(.*?)"', login_res.text, re.S )[0] print(authenticity_token) # 獲取login頁面的cookies信息 login_cookies = login_res.cookies.get_dict() # 請求url session_url = 'https://github.com/session' # 請求頭信息 session_headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36' } # 請求體信息 form_data = { "commit": "Sign in", "utf8": "✓", "authenticity_token": authenticity_token, "login": "*******", "password": "*******", "webauthn-support": "supported" } session_res = requests.post( url=session_url, headers=session_headers, cookies=login_cookies, data=form_data ) with open('github.html', 'w', encoding='utf-8') as f: f.write(session_res.text)