爬:html
mysql
根據需求,尋找網址redis
讀取網頁sql
urllib request瀏覽器
requests服務器
定位並提取數據cookie
存儲數據session
mysqlpost
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)
當你在瀏覽網站的時候,WEB 服務器會先送一小小資料放在你的計算機上,Cookie 會幫你在網站上所打的文字或是一些選擇,都紀錄下來。當下次你再光臨同一個網站,WEB 服務器會先看看有沒有它上次留下的 Cookie 資料,有的話,就會依據 Cookie,裏的內容來判斷使用者,送出特定的網頁內容給你。
正統的cookie分發是經過擴展HTTP協議來實現的,服務器經過在HTTP的響應頭中加上一行特殊的指示以提示瀏覽器按照指示生成相應的cookie。然而純粹的客戶端腳本如JavaScript或者VBScript也能夠生成cookie。而cookie的使用
是由瀏覽器按照必定的原則在後臺自動發送給服務器的。瀏覽器檢查全部存儲的cookie,若是某個cookie所聲明的做用範圍,大於等於將要請求的資源所在的位置,則把該cookie附在請求資源的HTTP請求頭上發送給服務器。
當用戶在應用程序的 Web 頁之間跳轉時,存儲在 Session 對象中的變量將不會丟失,而是在整個用戶會話中一直存在下去。當用戶請求來自應用程序的 Web 頁時,若是該用戶尚未會話,則 Web 服務器將自動建立一個 Session 對象。當會話過時或被放棄後,服務器將終止該會話。Session 對象最多見的一個用法就是存儲用戶的首選項。
session機制是一種服務器端的機制,服務器使用一種相似於散列表的結構(也可能就是使用散列表)來保存信息。
當程序須要爲某個客戶端的請求建立一個session的時候,服務器首先檢查這個客戶端的請求裏是否已包含了一個session標識 - 稱爲session id,若是已包含一個session id則說明之前已經爲此客戶端建立過session,服務器就按照session id把這個session檢索出來使用(若是檢索不到,可能會新建一個),若是客戶端請求不包含session id,則爲此客戶端建立一個session而且生成一個與此session相關聯的session id,session id的值應該是一個既不會重複,又不容易被找到規律以仿造的字符串,這個session id將被在本次響應中返回給客戶端保存
一家咖啡店有喝5杯咖啡免費贈一杯咖啡的優惠,然而一次性消費5杯咖啡的機會微乎其微,這時就須要某種方式來紀錄某位顧客的消費數量。想象一下其實也無外乎下面的幾種方案:
一、該店的店員很厲害,能記住每位顧客的消費數量,只要顧客一走進咖啡店,店員就知道該怎麼對待了。這種作法就是協議自己支持狀態。
二、發給顧客一張卡片,上面記錄着消費的數量,通常還有個有效期限。每次消費時,若是顧客出示這張卡片,則這次消費就會與之前或之後的消費相聯繫起來。這種作法就是在客戶端保持狀態。
三、發給顧客一張會員卡,除了卡號以外什麼信息也不紀錄,每次消費時,若是顧客出示該卡片,則店員在店裏的紀錄本上找到這個卡號對應的紀錄添加一些消費信息。這種作法就是在服務器端保持狀態。
以百度翻譯爲例:
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 #經過requests 傳入data來實現post請求 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)