1. 程式人生 > >1.0 -Python爬蟲-Urllib/Requests

1.0 -Python爬蟲-Urllib/Requests

0 爬蟲準備工作

  • 參考資料
  • 前提知識
    • url
    • http協議
    • web前端,html, css, js
    • ajax
    • re, xpath
    • xml

1. 爬蟲簡介

  • 爬蟲定義:網路爬蟲(又被稱為網頁蜘蛛,網路機器人,在FOAF社群中間,更經常的稱為網頁追逐者),
    是一種按照一定的規則,自動地抓取全球資訊網資訊的程式或者指令碼。
    另外一些不常使用的名字還有螞蟻、自動索引、模擬程式或者蠕蟲。
  • 兩大特徵
    • 能按作者要求下載資料或者內容
    • 能自動在網路上流竄
  • 三大步驟:
    • 下載網頁
    • 提取正確的資訊
    • 根據一定規則自動跳到另外的網頁上執行上兩步內容
  • 爬蟲分類
    • 通用爬蟲
    • 專用爬蟲(聚焦爬蟲)
  • Python網路包簡介
    • Python2.x:urllib, urllib2, urllib3, httplib, httplib2, requests
    • Python3.x: urllib, urllib3, httplib2, requests
    • python2: urllib和urllib2配合使用,或者requests
    • python3: urllib, requests

2. urllib

  • 包含模組
    • urllib.request: 開啟和讀取urls
    • urllib.error: 包含urllib.request產生的常見的錯誤,使用try捕捉
    • urllib.parse: 包含解析url的方法
    • urllib.robotparse: 解析robots.txt檔案
    • 案例v1
  • 網頁編碼問題解決
    • chardet 可以自動檢測頁面檔案的編碼格式,但是,可能有誤
    • 需要安裝, conda install chardet
    • 案例v2
  • urlopen 的返回物件
    • 案例v3
    • geturl: 返回請求物件的url
    • info: 請求反饋物件的meta資訊
    • getcode:返回的http code
  • request.data 的使用
    • 訪問網路的兩種方法
      • get:
        • 利用引數給伺服器傳遞資訊,
        • 引數為dict,然後用parse編碼
        • 案例v4
      • post
        • 一般向伺服器傳遞引數使用
        • post是把資訊自動加密處理
        • 我們如果想使用psot資訊,需要用到data引數
        • 使用post,意味著Http的請求頭可能需要更改:
          • Content-Type: application/x-www.form-urlencode
          • Content-Length: 資料長度
          • 簡而言之,一旦更改請求方法,請注意其他請求頭部資訊相適應
        • urllib.parse.urlencode可以將字串自動轉換成上面的
        • 案例v5
        • 為了更多的設定請求資訊,單純的通過urlopen函式已經不太好用了
        • 需要利用request.Request 類
        • 案例V6
  • urllib.error
    • URLError產生的原因:
      • 沒網
      • 伺服器連結失敗
      • 知不道制定伺服器
      • 是OSError的子類
      • 案例V7
    • HTTPError, 是URLError的一個子類
      • 案例v8
    • 兩者區別:
      • HTTPError是對應的HTTP請求的返回碼錯誤, 如果返回錯誤碼是400以上的,則引發HTTPError
      • URLError對應的一般是網路出現問題,包括url問題
      • 關係區別: OSError-URLError-HTTPError
  • UserAgent
    • UserAgent: 使用者代理,簡稱UA, 屬於heads的一部分,伺服器通過UA來判斷訪問者身份
    • 常見的UA值,使用的時候可以直接複製貼上,也可以用瀏覽器訪問的時候抓包

        1.Android
      
        Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19
        Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
        Mozilla/5.0 (Linux; U; Android 2.2; en-gb; GT-P1000 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
      
        2.Firefox
      
        Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0
        Mozilla/5.0 (Android; Mobile; rv:14.0) Gecko/14.0 Firefox/14.0
      
        3.Google Chrome
      
        Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36
        Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19
      
        4.iOS
      
        Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3
        Mozilla/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3A101a Safari/419.3
    • 設定UA可以通過兩種方式:
      • heads
      • add_header
      • 案例v9
  • ProxyHandler處理(代理伺服器)
    • 使用代理IP,是爬蟲的常用手段
    • 獲取代理伺服器的地址:
      • www.xicidaili.com
      • www.goubanjia.com
    • 代理用來隱藏真實訪問中,代理也不允許頻繁訪問某一個固定網站,所以,代理一定要很多很多
    • 基本使用步驟:
      1. 設定代理地址
      2. 建立ProxyHandler
      3. 建立Opener
      4. 安裝Opener
    • 案例v10
  • cookie & session
    • 由於http協議的無記憶性,人們為了彌補這個缺憾,所採用的一個補充協議
    • cookie是發放給使用者(即http瀏覽器)的一段資訊,session是儲存在伺服器上的對應的另一半資訊,用來記錄使用者資訊
  • cookie和session的區別
    • 存放位置不同
    • cookie不安全
    • session會儲存在伺服器上一定時間,會過期
    • 單個cookie儲存資料不超過4k, 很多瀏覽器限制一個站點最多儲存20個
  • session的存放位置
    • 存在伺服器端
    • 一般情況,session是放在記憶體中或者資料庫中
    • 沒有cookie登入 案例v11,可以看到,沒使用cookie則反饋網頁為未登入狀態
  • 使用cookie登入
    • 直接把cookie複製下來,然後手動放入請求頭, 案例 v12
    • http模組包含一些關於cookie的模組,通過他們我們可以自動使用cookie
      • CookieJar
        • 管理儲存cookie,向傳出的http請求新增cookie,
        • cookie儲存在記憶體中,CookieJar例項回收後cookie將消失
      • FileCookieJar(filename, delayload=None, policy=None):
        • 使用檔案管理cookie
        • filename是儲存cookie的檔案
      • MozillaCookieJar(filename, delayload=None, policy=None):
        • 建立與mocilla瀏覽器cookie.txt相容的FileCookieJar例項
      • LwpCookieJar(filename, delayload=None, policy=None):
        • 建立與libwww-perl標準相容的Set-Cookie3格式的FileCookieJar例項
      • 他們的關係是: CookieJar-->FileCookieJar-->MozillaCookieJar & LwpCookieJar
    • 利用cookiejar訪問人人, 案例13
      • 自動使用cookie登入,大致流程是
      • 開啟登入頁面後自動通過使用者名稱密碼登入
      • 自動提取反饋回來的cookie
      • 利用提取的cookie登入隱私頁面
    • handler是Handler的例項,常用參看案例程式碼
      • 用來處理複雜請求

          # 生成 cookie的管理器
          cookie_handler = request.HTTPCookieProcessor(cookie)
          # 建立http請求管理器
          http_handler = request.HTTPHandler()
          # 生成https管理器
          https_handler = request.HTTPSHandler()
    • 創立handler後,使用opener開啟,開啟後相應的業務由相應的hanlder處理
    • cookie作為一個變數,打印出來, 案例 v14
      • cookie的屬性
        • name: 名稱
        • value: 值
        • domain:可以訪問此cookie的域名
        • path: 可以發昂文此cookie的頁面路徑
        • expires:過期時間
        • size: 大小
        • Http欄位
    • cookie的儲存-FileCookieJar, 案例v15
    • cookie的讀取, 案例v16
  • SSL
    • SSL證書就是指遵守SSL安全套階層協議的伺服器數字證書(SercureSocketLayer)
    • 美國網景公司開發
    • CA(CertifacateAuthority)是數字證書認證中心,是發放,管理,廢除數字證書的收信人的第三方機構
    • 遇到不信任的SSL證書,需要單獨處理,案例v17
  • js加密
    • 有的反爬蟲策略採用js對需要傳輸的資料進行加密處理(通常是取md5值)
    • 經過加密,傳輸的就是密文,但是
    • 加密函式或者過程一定是在瀏覽器完成,也就是一定會把程式碼(js程式碼)暴露給使用者
    • 通過閱讀加密演算法,就可以模擬出加密過程,從而達到破解
    • 過程參看案例v18, v19
    • 過程比較囉嗦,筆記比較少,仔細觀察
  • ajax
    • 非同步請求
    • 一定會有url,請求方法,可能有資料
    • 一般使用json格式
    • 案例,爬去豆瓣電影, 案例v20

Requests-獻給人類

  • HTTP for Humans,更簡潔更友好
  • 繼承了urllib的所有特徵
  • 底層使用的是urllib3
  • 開源地址: https://github.com/requests/requests
  • 中文文件: http://docs.python-requests.org/zh_CN/latest/index.html
  • 安裝: conda install requests
  • get請求
    • requests.get(url)
    • requests.request("get", url)
    • 可以帶有headers和parmas引數
    • 案例v21
  • get返回內容
    • 案例v22
  • post
    • rsp = requests.post(url, data=data)
    • 參看案例23
    • date, headers要求dict型別
  • proxy
    •    proxies = {
         "http":"address of proxy",
         "https": "address of proxy"
         }
      
         rsp = requests.request("get", "http:xxxxxx", proxies=proxies)
    • 代理有可能報錯,如果使用人數多,考慮安全問題,可能會被強行關閉
  • 使用者驗證
    • 代理驗證

        #可能需要使用HTTP basic Auth, 可以這樣
        # 格式為  使用者名稱:密碼@代理地址:埠地址
        proxy = { "http": "china:[email protected]:4444"}
        rsp = requests.get("http://baidu.com", proxies=proxy)
  • web客戶端驗證
    • 如果遇到web客戶端驗證,需要新增auth=(使用者名稱,密碼)

        autu=("test1", "123456")#授權資訊
        rsp = requests.get("http://www.baidu.com", auth=auth)
  • cookie
    • requests可以自動處理cookie資訊

          rsp = requests.get("http://xxxxxxxxxxx")
          # 如果對方伺服器給傳送過來cookie資訊,則可以通過反饋的cookie屬性得到
          # 返回一個cookiejar例項
          cookiejar = rsp.cookies   
      
      
          #可以講cookiejar轉換成字典
          cookiedict = requests.utils.dict_from_cookiejar(cookiejar)         
  • session
    • 跟伺服器端session不是一個東東
    • 模擬一次會話,從客戶端瀏覽器連結伺服器開始,到客戶端瀏覽器斷開
    • 能讓我們跨請求時保持某些引數,比如在同一個session例項發出的 所有請求之間保持cookie

        # 建立session物件,可以保持cookie值
        ss = requests.session()
      
        headers = {"User-Agetn":"xxxxxxxxxxxxxxxxxx"}
      
        data = {"name":"xxxxxxxxxxx"}
      
        # 此時,由建立的session管理請求,負責發出請求,
        ss.post("http://www.baidu.com", data=data, headers=headers)
      
        rsp = ss.get("xxxxxxxxxxxx")
  • https請求驗證ssl證書
    • 引數verify負責表示是否需要驗證ssL證書,預設是True
    • 如果不需要驗證ssl證書,則設定成False表示關閉

        rsp = requests.get("https://www.baidu.com", verify=False)
        # 如果用verify=True訪問12306,會報錯,因為他證書有問題