Python網絡爬蟲學習筆記(第一週)

Pyhon網絡爬蟲學習

Request庫入門

Request是目前公認的最好用的爬蟲庫

安裝方法

  1. pip install requests
  2. 測試庫:import requests

7個主要方法

  1. .request()注意沒有s,用於構造一個請求,且支撐以下所有方法
  2. .get()獲取HTML頁面的主要方法,對應於HTTP的get
  3. .head()獲取HTML頁面頭信息的方法,對應於HTTP的HEAD
  4. .post()向網頁提交POST請求
  5. .put() 向網頁提交PUT請求
  6. .patch()向網頁提交局部修改請求
  7. .delete()向網頁提交刪除請求

其實requests只有request一個基本方法,其他方法只是封裝了request

Requests異常

1. ConnectionError  網絡連接異常
2. HTTPError        http協議上錯
3. URLRequired      url缺失造成的異常
4. TooManyRedirects 超出最大重定向次數(爬複雜網站可能會碰到)
5. ConnectTimeout   連接遠程服務器超時(僅僅是與遠程服務器連接過程超時)
6. Timeout          請求url超時(從發起請求到獲得內容的時間超出預定時間)

r.raise_for_status()如果返回狀態嗎不是200產生httperror,否則返回true

Response對象

r = requests.get("http://www.baidu.com")
>>> type(r)         #顯示r的類型爲Response對象
>>> r.status_code       #返回狀態碼,200代表訪問成功,404代表失敗
>>> r.headers           #顯示網頁頭部信息
>>> r.text              #打印url對應的頁面內容(字符串形式)
>>> r.encoding          #從頁面的header中charset字段獲取的編碼方式
>>> r.apparent_encoding #頁面編碼方式(從內容中分析出的編碼方式)
>>> r.content           #頁面相應內容的二進制形式

如果header中不存在charset,則默認編碼爲ISO-8859-1,不能解析中文哦^_^
r.encoding = r.apparent_encoding

爬蟲代碼框架

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 "ERROR"

if __name__ == "__main__":
    url = "http://www.baidu.com"
    print(getHTMLText(url))

HTTP協議

HTTP,Hypertext Transfer Protocol,超文本傳輸協議
HTTP是一個基於“請求與響應”模式的、無狀態的應用層協議
用戶發起請求,服務器相應——請求與響應
無狀態是指本次與下一次訪問無關聯
採用url作爲定位網絡資源的標示

url格式:http://host[:port][path]
1. host是主機域名或者ip地址
2. port是端口號,缺省端口80
3. path是請求資源的內部路徑

HTTP對資源的6種操作

  1. GET請求獲取URL位置的資源
  2. HEAD頭部信息
  3. POST請求向url位置的資源後附加新的數據,不改變現有資源內容
  4. PUT請求向url位置存儲一個資源,會覆蓋掉url位置資源,未提交的會被刪除
  5. PATCH請求局部更新url位置的資源
  6. DELETE請求刪除url位置的資源

request()

requests.request(method,url,**kwargs)
  1. method:請求方式,對應get/put/post等。6種+”OPTIONS”(獲取能與服務器交互的方式)
  2. kwargs,代表13個控制訪問參數

13個控制訪問參數

  1. params: 字典或字節序列,作爲參數增加到url中
  2. data: 字典、字節序列、文件對象,作爲Request內容
  3. json: 作爲Request內容
  4. headers: 字典,定製http的協議頭,比如修改’user-agent’字段來模擬瀏覽器
  5. cookies: 字典或cookiejar,Request中的cookie
  6. auth: 元組,支持http認證功能
  7. files: 字典類型,傳輸文件
fs = {'file':open('data.xls','rb')}
r = requests.request('POST','http://www.baidu.com',files=fs)
  1. timeout: 設置超時時間,以秒爲單位
  2. proxies: 字典類型,設置訪問代理服務器,可以增加登錄認證,隱藏自己的訪問信息
  3. allow_redirects: 默認爲true,是否允許重定向
  4. stream: 默認true,url內容是否立即下載
  5. verify: 默認true,認證ssl證書開關
  6. cert: 本地ssl證書路徑

get()

簡單獲取一個網頁r = requests.get(url)
1. 用於構造一個向服務器請求資源的Request對象
2. 返回了一個包含了爬蟲返回的全部內容的Response對象

requests.get(url,params=None,**kwargs)
  1. url是鏈接
  2. (可選)params是url中的額外參數,字典或者字節流格式
  3. (可選)除了params的12個控制訪問參數
requests.head(url,**kwargs)

post()

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

除了data和json的11個控制訪問參數

put()

url,data,kwargs

patch()

url,data,kwargs

delete()

url,kwargs


網絡爬蟲的“盜亦有道”

 網絡爬蟲的尺寸

  1. 小尺寸,只是用來爬取網頁,requests庫就可以
  2. 中尺寸,用於爬取網站,對速度敏感的,使用Scrapy庫
  3. 大尺寸,用於爬取全網,常見於搜索引擎,定製開發

服務器限制網絡爬蟲的方法
1. 來源審查,限制http的user-agent字段來拒絕網絡爬蟲
2. 發佈Robots協議

Robots協議

Robots Exclusion Standard 網絡爬蟲排除標準
在網站根目錄下robots.txt文件
http://www.jd.com/robots.txt來訪問京東的robots協議
無robots協議則表示允許所有爬蟲不限制爬取其網站資源
約束性:建議遵守,如果不遵守,可能會存在法律風險
類人行爲可不遵守robots協議

User-agent: *       #*代表所有
Disallow: /         #/代表根目錄

本週實例

京東商品爬取

import requests
url = "https://item.jd.com/5327260.html?utm_source=kong&utm_medium=zssc&utm_campaign=t_1000027280_85&utm_term=1410a462-637a-41ac-8af2-8bfcdc2a31ff-p_1999-pr_249-at_85&jd_pop=1410a462-637a-41ac-8af2-8bfcdc2a31ff&abt=0"
try:
    r = requests.get(url)
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    print(r.text)
except:
    print("ERROR")

亞馬遜商品爬取

import requests
url = "https://www.amazon.cn/dp/B07524LHMT/ref=cngwdyfloorv2_recs_0/461-5225947-5332108?pf_rd_m=A1AJ19PSB66TGU&pf_rd_s=desktop-2&pf_rd_r=QV7CXXJ1V0N1QT70KV7N&pf_rd_r=QV7CXXJ1V0N1QT70KV7N&pf_rd_t=36701&pf_rd_p=19fc3fc8-b320-45dc-a7e8-b4ecd543eea8&pf_rd_p=19fc3fc8-b320-45dc-a7e8-b4ecd543eea8&pf_rd_i=desktop"
try:
    kv = {'user-agent':'Mozilla/5.0'}   #Mozilla是一個標準的瀏覽器
    r = requests.get(url,headers=kv)    #更改頭文件的user-agent字段
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    print(r.text[1000:2000])
except:
    print("ERROR")

百度/360搜索關鍵字提交

百度關鍵詞接口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.baidu.com/s",params=kv)
    print(r.request.url)    #打印url地址
    r.raise_for_status()
    print(len(r.text))
except:
    print("ERROR")

網絡圖片的爬取和存儲

待補充

發佈了54 篇原創文章 · 獲贊 8 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章