1. 程式人生 > >爬蟲學習筆記1---------requests庫

爬蟲學習筆記1---------requests庫

Unit 1 : Requests庫入門 (7 * 13)

(1)、安裝 pip install requests

     測試

import requests

r = requests.get("http://www.baidu.com")

r.status_code

     200

r.encoding = 'utf-8'

r.text     #列印內容

(2)、request庫的7個主要方法對應HTTP的7個方法

  •      requests.request()     構造一個請求,基礎方法

               requests.request(method,url,**kwargs)

               method:請求方法,對應get/put/post等7種

               url

               **kwargs,13個控制訪問引數:

#1、params:字典或位元組序列,能增加到URL連結裡

kv = {'key1': 'value1','key2':'value2'}

r = requests.request('GET','http://python123.io/ws', params=kv)

print(r.url)

#http://python123.io/ws?key1=value1&key2=value2

#2、data:字典、位元組序列或檔案物件,作為Request的內容

kv = {'key1': 'value1','key2':'value2'}

r = requests.request('POST','http://httpbin.org/post', data = kv)

body = '主體內容'

r = requests.request('POST','http://httpbin.org/post', data = body)

#3、json:JSON格式的資料,作為Request的內容

kv = {'key1': 'value1','key2':'value2'}

r = requests.request('POST','http://httpbin.org/post', json = kv)

#4、headers:字典,HTTP定製頭,模擬任何瀏覽器

hd = {'user-agent:'Chrome/10'}

r = requests.request('POST','http://httpbin.org/post', headers = hd)

##高階功能:

#5、cookies:字典或CookieJar,Request中的cookie

#6、auth:元組,支援HTTP認證功能

#7、file:字典型別,傳輸檔案

fs = {'file':open('data.xls','rb')}

r = requests.request('POST','http://python123.io/ws',files=fs)

#8、timeout:設定超時時間,秒為單位

r = reqquests.request('GET','http://www.baidu.com', timeout=10)

#9、proxies:字典型別,設定訪問代理伺服器,可以增加登入認證,隱藏使用者原IP地址資訊,有效的防止對爬蟲的逆追蹤。

pxs = {'http':'http://user:[email protected]:1234','https':'https://10.10.10.1:4321'}

r = requests.request('GET','http://www.baidu.com',proxies=pxs)

##高階功能開關

#10、allow_redirects: True/False,預設為True,重定向的開關

#11、stream:True/False,預設為True,獲取立即下載的開關

#12、verify:True/Falsse,預設為True,認證SSL證書的開關

#13、cert:本地SSL證書路徑

  •      requests.get()        最常用,獲取HTML網頁,對應HTTP的GET,其它受限

r = requests.get(url) # .get()構造 Request物件

#返回 Response物件 r

requests.get(url,params=None,**kwargs)

#原始碼都是呼叫了request方法

##Response物件

import requests

r = requests.get("http://www.baidu.com")

print(r.status_code) #200

type(r)

r.text

r.encoding     #charset欄位,如果header中不存在charset,則認為編碼為ISO-8859-1

r.apparent_encoding

#替換編碼方式

r.encoding = "utf-8"

r.text

r.headers

Response物件的屬性

     r.status_code     返回狀態,200成功,404……失敗

     r.text     字串形式的頁面內容

     r.encoding     從HTTP header 中猜測的響應內容編碼方式

     r.apparent_encoding     從內容文字中分析的編碼方式(備選編碼方式)

     r.content     HTTP響應內容的二進位制形式

  •     requests.head()     獲取HTML網頁頭,對應HTTP的HEAD

          requests.head(url, **kwargs)

  •     requests.post()     向HTML網頁提交POST請求,對應HTTP的POST

          requests.post(url, data=None, json=None, **kwargs)

     向URL追加一個字典:

payload = {'key1': 'value1','key2':'value2'}

r = requests.post('http://httpbin.org/post',data = payload)

print(r.text) #向url POST一個字典,自動編碼為"form"(表單)

     向URL追加一個data:

r = requests.post('http://httpbin.org/post',data = "ABC")

print(r.text) #向url POST,自動編碼為data,"data"="ABC"

  •     requests.put()         向HTML網頁提交PUT請求,對應HTTP的PUT

可覆蓋原有資料

          requests.put(url, data=None, **kwargs)

  •     requests.patch()     向HTML網頁提交區域性修改請求,對應HTTP的PATCH

          requests.patch(url, data=None, **kwargs)

  •     requests.delete()     向HTML網頁提交刪除請求,對應HTTP的DELETE

          requests.delete(url, **kwargs)

(3)、爬取網頁的通用程式碼框架

Request庫異常處理

  • requests.ConnectionError    網路連線錯誤異常,如DNS查詢失敗、防火牆拒絕連線等
  • requests.HTTPError    HTTP協議層面錯誤異常
  • requests.URLRequired   URL缺失異常
  • requests.TooManyRedirects    超過最大重定向次數,產生重定向異常,複雜連線
  • requests.ConnectTimeout    連線遠端伺服器超時異常
  • requests.Timeout    請求URL超時

理解Requests庫的異常

r.raise_for_status()    如果不是200,產生異常requests.HTTPError

#通用程式碼框架

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))

(4)、HTTP協議

     HTTP,Hypertext Tranfer Protocol,超文字傳輸協議,是一個基於"請求與響應"模式的、無狀態(前後響應沒有關係)的應用層(工作在TCP協議之上)協議。

     一般採用URL作為定位網路資源的標識。

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

  • host:合法的Internet主機域名或IP地址
  • port:埠號,預設為80
  • path:請求資源的路徑

     URL的理解:

     URL是通過HTTP協議存取資源的Internet路徑,一個URL對應一個數據資源。

          HTTP協議對資源的操作,方法:

  • GET    請求獲取URL位置的資源
  • HEAD   請求獲取URL位置資源的響應訊息報告,獲得頭部資訊
  • POST   請求向URL位置的資源後附加新的資料(追加)
  • PUT    請求向URL位置儲存一個資源 (覆蓋)
  • PATCH   改變該資源處部分內容 (修改)
  • DELETE   刪除該位置儲存的資源

          PUT與PATCH區別:PATCH只用修改其中一個。

Unit 2 : 網路爬蟲“盜亦有道”

網路爬蟲尺寸:

小規模,資料量小

爬取速度不敏感

Requests庫

中規模,資料規模較大,爬取速度敏感

Scrapy庫

大規模,搜尋引擎

爬取速度關鍵

定製開發

爬取網頁,玩轉網頁 爬取網站,爬取系列網站 爬取全網

網路爬蟲“騷擾”,法律風險(伺服器上的資料有產權),個人隱私洩露。

網路爬蟲的限制

  •     來源審查:判斷User-Agent進行限制
    • 檢查來訪問HTTP協議頭的User-Agent域,只響應瀏覽器或友好爬蟲的訪問。
  • 釋出公告:Robots協議:
    • 告知爬蟲策略,要求遵守

Robots 協議:在網站根目錄下的robots.txt檔案。

案例:京東(https://www.jd.com/robots.txt):

User-agent: *

Disallow: /?*

Disallow: /pop/*.html

Disallow: /pinpai/*.html?*

User-agent: EtaoSpider

Disallow: /

User-agent: HuihuiSpider

Disallow: /

User-agent: GwdangSpider

Disallow: /

User-agent: WochachaSpider

Disallow: /

    #robots基本語法:*代表所有,/代表根目錄

        User-agent:*

        Disallow:/

遵守方式:

  • 網路爬蟲:自動或人工識別robots.txt,再進行內容爬取。
  • 約束性:可以不遵守,但存在法律風險。

Unit 3 : 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("爬取失敗")

二、亞馬遜商品

有反爬蟲程式,需要模擬瀏覽器的headers,新增user-agent:

import requests

url = "https://www.amazon.cn/gp/product/B01M8L5Z3Y"

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搜尋關鍵詞提交

百度的關鍵詞介面:

import requests

url = "http://www.baidu.com/s"

kv = {'wd':'python'}

try:

    r = requests.get(url, params = kv)

    r.raise_for_status ()

    r.encoding = r.apparent_encoding

    print(r.text[2000:4000])

except:

    print(r.url)

    print("爬取失敗")

360關鍵字介面:

import requests

url = "http://www.so.com/s"

kv = {'q':'python'}

try:

    r = requests.get(url, params = kv)

    r.raise_for_status ()

    r.encoding = r.apparent_encoding

    print(len(r.text))

except:

    print(r.url)

    print("爬取失敗")

四、網路圖片的爬取和儲存

www.nationalgeographic.com.cn/photography/photo_of_the_day/3921.html

import requests

import os

url = "http://image.nationalgeographic.com.cn/2017/0211/20170211061910157.jpg"

root = "D://pics//"

path = root + url.split('/')[-1]

try:

    if not os.path.exists(root):

          os.mkdir(root)

    if not os.path.exists(path):

        r = requests.get(url)

        with open(path, 'wb') as f:

            f.write(r.content)

            f.close()

            print("檔案儲存成功")

    else:

        print("檔案已經存在")

except:

    print("爬取失敗")

五、IP地址歸屬地的自動查詢

http://m.ip138.com/ip.asp?ip=ipaddress

import requests

url = "http://m.ip138.com/ip.asp?ip="

try:

    r = requests.get(url + '202.102.111.110')

    r.raise_for_status()

    r.enconding = r.apparent_encoding

    print(r.text[-500:])

except:

    print("爬取失敗")

總結:以爬蟲視角看待網路資源,所有對資源的操作都是通過url連結來實現的 。

注: 可看慕課或b站上 嵩天老師講的python網路爬蟲與資訊提取課程