Spider(三)

一、Cookie模擬登陸
   一、什麼是cookie、session
       HTTP是一種無鏈接協議,客戶端和服務器交互僅僅限於 請求/響應過程,結束後斷開,下一次請求時,服務器會認爲是一個新的客戶端,爲了維護他們之間的鏈接,讓服務器知道這是前一個用戶發起的請求,必須在一個地方保存客戶端信息。
       cookie  :經過在客戶端記錄的信息肯定用戶身份
       session :經過在服務端記錄的信息肯定用戶身份
   二、案例 :使用cookie模擬登錄人人網
        步驟:
         一、經過抓包工具、F12獲取到cookie(先登錄1次網站)
     二、正常發請求
     url:http://www.renren.com/967469305/profilehtml

二、requests模塊
   一、get()使用場景
     params: 查詢參數,字典,不用編碼,也不用拼接URL
       一、沒有查詢參數
         res = requests.get(url,headers=headers))
       二、有查詢參數: params={}
     res = requests.get(url,params=params,headers=headers))
         注 :params參數必須爲字典,自動進行編碼
   二、響應對象res的屬性
     一、encoding : 響應字符編碼,res.encoding="utf-8"
     二、text     : 字符串
     三、content  : 字節流
     四、status_code : 響應碼
     五、url      : 返回實際數據的URL
   三、非結構化數據存儲
     html = res.content
     with open("XXX","wb") as f:
             f.write(html)
   四、post(url,data=data,headers=headers)
       一、data爲Form表單數據,字典,不用編碼,不用轉碼
       二、示例 :有道翻譯
     # 此處data爲form表單數據
     res = requests.post(url,data=data,headers=headers)
     res.encoding="utf-8"
     html = res.textmysql

三、get()方法中不一樣參數
   一、代理IP(參數名:proxies)
     一、獲取代理IP的網站
           西刺代理 www.xicidaili.com/
           快代理   www.kuaidaili.com/
           全網代理
     二、普通代理
         一、格式:proxies = {"協議":"協議://IP地址:端口號"}
             182.88.190.3    8123
             proxies = {"HTTP":"http://61.152.248.147:80"}
         二、查看網絡是否經過代理IP訪問
             http://httpbin.org/get :可以顯示客戶端的headers和IP 
         三、get設置鏈接超時時間:
             timeout=3  --超時3秒
     三、私密代理
         格式:
         proxies = {"http":"http://用戶名:密碼@IP地址:端口"}
         ex:proxies = {"http":"http://309435365:szayclhp@123.206.119.108:21081"}
             用戶名 :309435365
             密碼   :szayclhp
             IP地址 :116.255.162.107
             端口號 :16816
     四、案例1 :爬取鏈家二手房信息 --> 存到MySQL數據庫
         見 :05_鏈家tomysql.py
         一、找URL
         第1頁:https://bj.lianjia.com/ershoufang/pg1/
         第2頁:https://bj.lianjia.com/ershoufang/pg2/
         二、正則
         <div class="houseInfo">.*?data-el="region">(.*?)</a>.*?<div class="totalPrice">.*?<span>(.*?)</span>
         三、寫代碼
     五、鏈家二手房案例(MongoDB數據庫)
         見 :06_鏈家tomongo.py
          >>>show dbs
          >>>use 庫名
          >>>show collections
          >>>db.集合名.find().pretty()
          >>>db.集合名.count()
   二、Web客戶端驗證(參數名:auth=(元組))
     一、auth = ("用戶名","密碼")
        auth = ("tarenacode","code_2013")
        ex:res = requests.get(url,proxies=self.proxies,headers=self.headers,auth=("tarenacode","code_2013"))
     二、案例:爬取code.tarena目錄
         見 :07_Web客戶端驗證.py
         一、步驟
         一、URL:http://code.tarena.com.cn
         二、正則
             <a href=".*?">(.*?)</a>
         三、代碼
   三、SSL證書認證(參數名:verify=True | False)
     一、verify = True : 默認,進行SSL證書認證
     二、verify = False: 不作認證web

四、urllib.request中Handler處理器
   一、定義
     自定義的urlopen()方法,由於模塊自帶的urlopen()方法是一個特殊的opener(模塊已定義好),不支持代理等功能,經過Handler處理器對象來自定義urlopen對象
   二、經常使用方法
     一、opener=build_opener(某種功能Handler處理器對象) :建立opener對象
     二、opener.open(url,參數)
   三、使用流程
     一、建立相關的Handler處理器對象
         http_handler = urllib.request.HTTPHandler()
     二、建立自定義opener對象
         opener = urllib.request.build_opener(http_handler)
     三、利用opener對象的open方法發送請求獲響應
         req = urllib.request.Request(url,headers=headers)
         res = opener.open(req)
   四、Handler處理器分類
     一、HTTPHandler():沒有任何特殊功能
     二、ProxyHandler({普通代理})
         代理: {"協議":"IP地址:端口號"}
     三、ProxyBasicAuthHandler(密碼管理器對象) :私密代理
     四、HTTPBasicAuthHandler(密碼管理器對象)  :web客戶端認證
   五、密碼管理器用途
     一、私密代理
     二、Web客戶端認證
     三、程序實現流程
         一、建立密碼管理器對象
             pwdmg = urllib.request.HTTPPasswordMgrWithDefaultRealm()
         二、把認證信息添加到密碼管理器對象裏面去
             pwdmg.add_password(None,webserver,user,passwd)
             webserver:爲 私密代理的ip地址:端口號
             user:帳戶
             passwd:密碼
         三、建立Handler處理器對象
             一、私密代理
             proxy_handler = urllib.request.ProxyAuthBasicHandler(pwdmg)
             二、Web客戶端
             webbasic_handler = urllib.request.HTTPBasicAuthHandler(pwdmg)
         四、建立自定義opener對象
             opener = urllib.request.build_opener(proxy_handler)
         五、利用opener對象的open方法發請求獲響應
             req = urllib.request.Request(url,headers=headers)
             res = opener.open(req)sql

相關文章
相關標籤/搜索