1.0 -Python爬蟲-Urllib/Requests
阿新 • • 發佈:2018-11-25
0 爬蟲準備工作
- 參考資料
- python網路資料採集, 圖靈工業出版
- 精通Python爬蟲框架Scrapy, 人民郵電出版社
- Python3網路爬蟲
- Scrapy官方教程
- 前提知識
- 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
- get:
- 訪問網路的兩種方法
- urllib.error
- URLError產生的原因:
- 沒網
- 伺服器連結失敗
- 知不道制定伺服器
- 是OSError的子類
- 案例V7
- HTTPError, 是URLError的一個子類
- 案例v8
- 兩者區別:
- HTTPError是對應的HTTP請求的返回碼錯誤, 如果返回錯誤碼是400以上的,則引發HTTPError
- URLError對應的一般是網路出現問題,包括url問題
- 關係區別: OSError-URLError-HTTPError
- URLError產生的原因:
- 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
- 代理用來隱藏真實訪問中,代理也不允許頻繁訪問某一個固定網站,所以,代理一定要很多很多
- 基本使用步驟:
- 設定代理地址
- 建立ProxyHandler
- 建立Opener
- 安裝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
- 利用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的屬性
- 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,會報錯,因為他證書有問題