爬: 爬一個網站需要幾步? 確定用戶的需求 根據需求,尋找網址 讀取網頁 urllib requests 定位並提取數據 存儲數據 mysql redis 文件存儲 爬取百度首頁:(確定用戶需求) cookie和session之間的愛情故事: 啥是cookie: 當你在瀏覽網站的時候,WEB 伺服器 ...
爬:
爬一個網站需要幾步?
-
-
根據需求,尋找網址
-
讀取網頁
-
urllib requests
-
-
定位並提取數據
- 正則 xpath
-
存儲數據
-
mysql
-
redis
-
文件存儲
爬取百度首頁:(確定用戶需求)
from urllib import request
url = 'http://www.baidu.com'#確定網頁
response = request.urlopen(url)#打開網頁
html = response.read()#讀取網頁內容
with open('baidu.html','wb') as f:#將內容存儲到本地
f.write(html)
cookie和session之間的愛情故事:
啥是cookie:
當你在瀏覽網站的時候,WEB 伺服器會先送一小小資料放在你的電腦上,Cookie 會幫你在網站上所打的文字或是一些選擇,都紀錄下來。當下次你再光臨同一個網站,WEB 伺服器會先看看有沒有它上次留下的 Cookie 資料,有的話,就會依據 Cookie,里的內容來判斷使用者,送出特定的網頁內容給你。
cookie機制:
正統的cookie分發是通過擴展HTTP協議來實現的,伺服器通過在HTTP的響應頭中加上一行特殊的指示以提示瀏覽器按照指示生成相應的cookie。然而純粹的客戶端腳本如JavaScript或者VBScript也可以生成cookie。而cookie的使用
是由瀏覽器按照一定的原則在後臺自動發送給伺服器的。瀏覽器檢查所有存儲的cookie,如果某個cookie所聲明的作用範圍,大於等於將要請求的資源所在的位置,則把該cookie附在請求資源的HTTP請求頭上發送給伺服器。
什麼是session:
當用戶在應用程式的 Web 頁之間跳轉時,存儲在 Session 對象中的變數將不會丟失,而是在整個用戶會話中一直存在下去。當用戶請求來自應用程式的 Web 頁時,如果該用戶還沒有會話,則 Web 伺服器將自動創建一個 Session 對象。當會話過期或被放棄後,伺服器將終止該會話。Session 對象最常見的一個用法就是存儲用戶的首選項。
session機制:
session機制是一種伺服器端的機制,伺服器使用一種類似於散列表的結構(也可能就是使用散列表)來保存信息。
當程式需要為某個客戶端的請求創建一個session的時候,伺服器首先檢查這個客戶端的請求里是否已包含了一個session標識 - 稱為session id,如果已包含一個session id則說明以前已經為此客戶端創建過session,伺服器就按照session id把這個session檢索出來使用(如果檢索不到,可能會新建一個),如果客戶端請求不包含session id,則為此客戶端創建一個session並且生成一個與此session相關聯的session id,session id的值應該是一個既不會重覆,又不容易被找到規律以仿造的字元串,這個session id將被在本次響應中返回給客戶端保存
cookie和session機制之間的區別與聯繫
一家咖啡店有喝5杯咖啡免費贈一杯咖啡的優惠,然而一次性消費5杯咖啡的機會微乎其微,這時就需要某種方式來紀錄某位顧客的消費數量。想象一下其實也無外乎下麵的幾種方案:
1、該店的店員很厲害,能記住每位顧客的消費數量,只要顧客一走進咖啡店,店員就知道該怎麼對待了。這種做法就是協議本身支持狀態。
2、發給顧客一張卡片,上面記錄著消費的數量,一般還有個有效期限。每次消費時,如果顧客出示這張卡片,則此次消費就會與以前或以後的消費相聯繫起來。這種做法就是在客戶端保持狀態。
3、發給顧客一張會員卡,除了卡號之外什麼信息也不紀錄,每次消費時,如果顧客出示該卡片,則店員在店裡的紀錄本上找到這個卡號對應的紀錄添加一些消費信息。這種做法就是在伺服器端保持狀態。
封裝請求網頁的兩種方法:post 和 get
1 from urllib import request,parse 2 from urllib.error import HTTPError,URLError 3 4 5 def get(url,headers = None): 6 return url_requests(url,headers=headers) 7 def post(url,form,headers=None): 8 return url_requests(url,form,headers=headers) 9 10 def url_requests(url,form = None,headers = None): 11 user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36' 12 13 if headers == None: 14 headers = { 15 'User-Agent':user_agent 16 } 17 html_b = b'' 18 19 try: 20 #post請求 21 if form: 22 23 #先用parse模塊將form轉為字元串 24 form_str = parse.urlencode(form) 25 # print(form_str) 26 #再將str轉換為bytes 27 form_b = form_str.encode('utf-8') 28 # print(form_b) 29 req = request.Request(url,data=form_b,headers=headers) 30 else: 31 req = request.Request(url,headers=headers) 32 response = request.urlopen(req) 33 html_b = response.read() 34 except HTTPError as e: 35 print(e) 36 except URLError as e: 37 print(e) 38 return html_b 39 40 if __name__ == '__main__': 41 url = 'http://fanyi.baidu.com/sug' 42 form = { 43 'kw': '哈哈' 44 } 45 html_bytes = post(url, form=form).decode('utf-8') 46 print(html_bytes) 47 48 49 # url = 'http://www.baidu.com' 50 # html_byte = get(url).decode('utf-8') 51 # print(html_byte)