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值,使用的時候能夠直接複製粘貼,也能夠用瀏覽器訪問的時候抓包css

      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的實例,經常使用參看案例代碼
      • 用來處理複雜請求html

        # 生成 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:123456@192.168.1.123:4444"}
        rsp = requests.get("http://baidu.com", proxies=proxy)
  • web客戶端驗證
    • 若是遇到web客戶端驗證,須要添加auth=(用戶名,密碼)python

      autu=("test1", "123456")#受權信息
        rsp = requests.get("http://www.baidu.com", auth=auth)
  • cookie
    • requests能夠自動處理cookie信息git

      rsp = requests.get("http://xxxxxxxxxxx")
          # 若是對方服務器給傳送過來cookie信息,則能夠經過反饋的cookie屬性獲得
          # 返回一個cookiejar實例
          cookiejar = rsp.cookies   
      
      
          #能夠講cookiejar轉換成字典
          cookiedict = requests.utils.dict_from_cookiejar(cookiejar)
  • session
    • 跟服務器端session不是一個東東
    • 模擬一次會話,從客戶端瀏覽器連接服務器開始,到客戶端瀏覽器斷開
    • 能讓咱們跨請求時保持某些參數,好比在同一個session實例發出的 全部請求之間保持cookiegithub

      # 建立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表示關閉web

      rsp = requests.get("https://www.baidu.com", verify=False)
        # 若是用verify=True訪問12306,會報錯,由於他證書有問題
相關文章
相關標籤/搜索