天天看點

Python網絡爬蟲與資訊提取——網絡爬蟲規則(Requests篇)

第二章 網絡爬蟲之規則(Requests篇)

●Requests庫入門

  • 特點:簡單、簡潔,一行代碼即可從網站上擷取資源。
  • 安裝方法:CMD視窗->pip install requests
  • Requests庫的主要方法:
    Python網絡爬蟲與資訊提取——網絡爬蟲規則(Requests篇)

    1、requsets.request()方法

      使用格式:requests. request(method, url, **kwargs)

               -method:請求方式,對應HTTP協定GET PUT/POST等7種請求功能

               -url:拟擷取頁面的url連結

               -kwargs:控制通路的參數,共13個,均為可選項

      **kwargs參數:

    1)params:字典或位元組序列,作為參數增加到url中,帶入參數通路url;

>>> kv ={'key1':'valuel','key2':'value2'}
  		>>> r=requests.request('GET','http://python123.io/ws',params=kv)
  		>>> print(r.url)
  		https://python123.io/ws?key1=valuel&key2=value2
           

  2)data:字典、位元組序列或檔案對象,作為 Request的内容,向伺服器提供、送出資源時使用;

>>> kv ={'key1':'valuel','key2':'value2'}
  		>>> r=requests.request('POST','http://python123.io/ws',data=kv)
  		>>> body = '主題内容'
  		>>> r=requests.request('POST','http://python123.io/ws',data=body)
           

  3)json:JSON格式的資料,作為Request的內容;

>>> kv ={'key1':'valuel','key2':'value2'}
		>>> r=requests.request('POST','http://python123.io/ws',json=kv)
           

  4)headers:字典,HTTP定制頭,通路HTTP協定頭;

>>> hd={'user-agent':'Chrome/10'}
		>>> r=requests.request('POST','http://python123.io/ws',headers=hd)
           

  5)cookies:字典或 CookieJar,Request中的 cookie;

  6)auth:元組,支援HTTP認證功能;

  7)files:字典類型,傳輸檔案,向連結送出檔案;

>>>fs={'file':open('data.xls','rb')}
        >>> r=requests.request('POST','http://python123.io/ws',files=fs)  
           

  8)timeout:設定逾時時間,秒為機關,時間内請求内容未回報,生成timeout異常;

  9)proxies:字典類型,設定通路代理伺服器,可以增加登入認證,有效隐藏爬取網站原IP,防止逆追蹤;

>>>pxs={'http':'http://user:[email protected]:1234'
                'https':'https://10.10.10.1:4321'} 
        >>> r=requests.request('GET','http://python123.io/ws',proxies=pxs)                 
           

  10)allow_redirects:True/ False,預設為True,重定向開關;

  11)stream:True/false,預設為True,擷取内容立即下載下傳開關;

  12)verify:True/ False,預設為True,認證SSL證書開關;

  13)cert:本地SSL證書路徑。

  2、requests.get()方法

    使用格式:requests.get(url, params=None, **kwargs)

           -url:拟擷取頁面的ur連結

           -params:url中的額外參數,字典或位元組流格式,可選

           -kwargs:12個控制通路的參數,除params

    實作原理:get(url)構造一個向伺服器請求資源的Request對象,傳回一個包含伺服器資源的Response對象,即Response對象包含爬蟲傳回的内容。

  Response對象屬性:

Python網絡爬蟲與資訊提取——網絡爬蟲規則(Requests篇)

    r.apparent_encoding的編碼比r.encoding更加準确。

   ‘utf-8’編碼方式可解析中文,ISO-8859-1編碼方式不可解析中文。

  3、requests.head()方法

   使用格式:requests.head(url, **kwargs)

           -url:拟擷取頁面的ur連結

           -kwargs:13個控制通路的參數

  4、requests.post()方法

    使用格式:requests.post(url, data=None,json=None,**kwargs)

           -url:拟更新頁面的ur連結

           -data:字典、位元組序列或檔案, Request的内容

           -json:JSON格式的資料, Request的内容

           -kwargs:11個控制通路的參數,除data、json

  5、requests.put()方法

    使用格式:requests.put(url, data=None,**kwargs)

           -url:拟更新頁面的ur連結

           -data:字典、位元組序列或檔案, Request的内容

           -kwargs:12個控制通路的參數,除data

  6、requests.patch()方法

    使用格式:requests.patch(url, data=None,**kwargs)

           -url:拟更新頁面的ur連結

           -data:字典、位元組序列或檔案, Request的内容

           -kwargs:12個控制通路的參數,除data

  7、requests.delete()方法

    使用格式:requests.delete(url, **kwargs)

           -url:拟删除頁面的ur連結

           -kwargs:13個控制通路的參數

  • 爬取網頁的通用代碼架構:

      1、Requests庫的異常:

    Python網絡爬蟲與資訊提取——網絡爬蟲規則(Requests篇)

       處理異常方法:r.raise_for_status() —如果不是200,産生異常 requests.HTTPError

      2、爬取網頁的通用代碼架構:

    import requests
    				
    				def getHTMLText(url):
    				    try:
    				        r = requests.get(url, timeout=30)
    				        r.raise_for_status() #如果狀态不是200,引發 HttpError異常
    				        r.encoding =r.apparent.encoding
    				        return r.text
    				    except:
    				        return "産生異常"
    				if __name__ == "__main__":
    				    url="http://www.baidu.com"
    				    print(getHTMLText(url))
               
  • HTTP協定:

     1、HTTP, Hypertext Transfer Protocol,超文本傳輸協定。

     2、HTTP是一個基于“請求與響應”模式的、無狀态的應用層協定。

       -“請求與響應”模式:使用者發送請求,伺服器做相關響應

        -無狀态:第一次請求與第二次請求之間無關聯

       -應用層:該協定工作在TCP協定之上

     3、HTTP協定采用URL作為定位網絡資源的辨別。

       1) URL格式:http://host[:port][path]

                   -host:合法的Internet主機域名或IP位址

                   -port:端口号,預設端口為80

                   -path:請求資源的路徑

       2)URL是通過HTTP協定存取資源的Internet路徑,一個URL對應一個資料資源。

     4、HTTP協定對資源的操作:

    Python網絡爬蟲與資訊提取——網絡爬蟲規則(Requests篇)

       1)PUT與PATCH差別:

         采用PATCH,僅向URL送出局部資料更新請求,可節省網絡帶寬。

         采用PUT,必須将是以資料一并送出到URL,未送出資料被删除。

       2)HEAD方法用很少的網絡流量,擷取網絡資源的概要資訊。

       3)POST方法向伺服器送出新增資料,向URL POST一個字典、鍵值對自動編碼為form(表單)。

●網絡爬蟲的盜亦有道

  • 網絡爬蟲的尺寸
    規模 特點 開發 應用範圍
    小規模 資料量小,爬取速度不敏感 Requests庫 爬取網頁,玩轉網頁
    中規模 資料規模較大,爬取速度敏感 Scrapy庫 爬取網頁,爬取系列網站
    大規模 搜尋引擎,爬取速度關鍵 定制開發 爬取全網
  • 爬蟲引起的問題

      1)網絡爬蟲的“騷擾”:受限于編寫水準和目的,網絡爬蟲将會為web伺服器帶來巨大的資源開銷;

      2)網絡爬蟲的法律風險:伺服器上的資料有産權歸屬,網絡爬蟲擷取資料後牟利将帶來法律風險;

      3)網絡爬蟲洩露隐私:網絡爬蟲可能具備突破簡單通路控制的能力,獲得被保護資料進而洩露個人隐私。

  • 網絡爬蟲的限制

      1)來源審查:判斷User-Agent進行限制

        檢查來訪HTTP協定頭的User-Agent域,隻響應浏覽器或友好爬蟲的通路。

      2)釋出公告: Robots協定

        告知所有爬蟲網站的爬取政策,要求爬蟲遵守。

        Robots協定(Robots exclusion standard網絡爬蟲排除标準):

        作用:網站告知網絡爬蟲哪些頁面可以抓取,哪些不行。

        形式:在網站根目錄下的 robots.txt檔案。

        基本文法: User-agent:*

               Disallow:/

               #注釋,*代表所有,/代表根目錄

        使用:

           網絡爬蟲:自動或人工識别 robots.txt,再進行內容爬取。

           限制性: Robots協定是建議但非限制性,網絡爬蟲可以不遵守,但存在法律風險。遵守建議如下:

    通路量很小:可以遵守;通路量較大:建議遵守 非商業且偶爾:建議遵守;商業利益:必須遵守 必須遵守
    爬取網頁,玩轉網頁 爬取網頁,爬取系列網站 爬取全網

●Requests庫網絡爬蟲實戰

  • 京東商品資訊擷取:
    Python網絡爬蟲與資訊提取——網絡爬蟲規則(Requests篇)
    import requests
    			url="https://item.jd.com/2967929.html"
    			try:
    			    r = requests.get(url)
    			    r.raise_for_status()
    			    r.encoding=r.apparent_encoding
    			    print(r.text[: 1000])
    			except:
    			    print("爬取失敗")
               
  • 亞馬遜商品資訊擷取(通過判斷對網站通路的App頭部headers,對網絡爬蟲限制):
    Python網絡爬蟲與資訊提取——網絡爬蟲規則(Requests篇)
    import requests
    			url="https://www.amazoncn/gp/product/bo1m8l5z3y"
    			try:
    			    kv = {'user-agent':'Mozilla/5.0'}
    			    r = requests.get(url, headers=kv)
    			    r.raise_for_status()
    			    r.encoding = r.apparent_encoding
    			    print(r.text[1000: 2000])
    			except:
    			    print("爬取失敗")
               
  • 百度、360搜尋關鍵詞送出:

     搜尋引擎關鍵詞送出接口,修改keyword向搜尋引擎送出關鍵詞

      百度的關鍵詞接口:

        http://www.baidu.com/s?wd=keyword

      360的關鍵詞接囗:

        http://www.so.com/s?q=keyword

    import requests
    			keyword ="Python"
    			try:
    			    kv ={'wd': keyword}
    			    r = requests.get("http://www.baiducom/s",params=kv)
    			    print(r.request.url)
    			    r.raise_for_status()
    			    print (len(r.text))
    			except:
    		    	print("爬取失敗")	
               
  • 網絡圖檔爬取:

      網絡圖檔連結的格式:http://www.example.com/picture.jpg

    import requests
    			import os
    			url="https://up.enterdesk.com/edpic_360_360/5c/d8/1e/5cd81eca3361148bdf4a528964a4ff9f.jpg"
    			path = "F:\\"+url.split('/')[-1]
    			print(path)
    			try:
    			    if not os.path.exists(path):
    			        r = requests.get(url)
    			        print(r)
    			        with open(path, 'wb')as f:
    			            f.write(r.content)
    			            print("檔案儲存成功")
    			            f.close()
    			    else:
    			        print("檔案已存在")
    			except:
    			    print("爬取失敗")
               
  • IP位址歸屬地的自動查詢:

      python不具有查詢IP位址歸屬地的功能庫,通過網絡資源實作。比如:http://m.ip138.com

    Python網絡爬蟲與資訊提取——網絡爬蟲規則(Requests篇)
    import requests
    url="http://m.ip138.com/ip.asp?ip="
    try:
        r = requests.get(url+'202.204.80.112')
        r.raise_for_status()
        r.ncoding =r.apparent_encoding
        print(r.text[-500:])
    except:
        print("爬取失敗")