亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python爬蟲中urllib庫的進階學(xué)習(xí)

 更新時間:2018年01月05日 15:24:40   投稿:laozhang  
本篇文章主要介紹了Python爬蟲中urllib庫的進階學(xué)習(xí)內(nèi)容,對此有興趣的朋友趕緊學(xué)習(xí)分享下。

urllib的基本用法

urllib庫的基本組成

利用最簡單的urlopen方法爬取網(wǎng)頁html

利用Request方法構(gòu)建headers模擬瀏覽器操作

error的異常操作

urllib庫除了以上基礎(chǔ)的用法外,還有很多高級的功能,可以更加靈活的適用在爬蟲應(yīng)用中,比如:

使用HTTP的POST請求方法向服務(wù)器提交數(shù)據(jù)實現(xiàn)用戶登錄

使用代理IP解決防止反爬

設(shè)置超時提高爬蟲效率

解析URL的方法

本次將會對這些內(nèi)容進行詳細的分析和講解。

POST請求

POST是HTTP協(xié)議的請求方法之一,也是比較常用到的一種方法,用于向服務(wù)器提交數(shù)據(jù)。博主先介紹進行post請求的一些準備工作,然后舉一個例子,對其使用以及更深層概念進行詳細的的剖析。

POST請求的準備工作

既然要提交信息給服務(wù)器,我們就需要知道信息往哪填,填什么,填寫格式是什么?帶這些問題,我們往下看。

同樣提交用戶登錄信息(用戶名和密碼),不同網(wǎng)站可能需要的東西不一樣,比如淘寶反爬機制較復(fù)雜,會有其它一大串的額外信息。這里,我們以豆瓣為例(相對簡單),目標是弄清楚POST是如何使用的,復(fù)雜內(nèi)容會在后續(xù)實戰(zhàn)部分與大家繼續(xù)分享。

拋出上面像淘寶一樣需要的復(fù)雜信息,如果僅考慮用戶名和密碼的話,我們的準備工作其實就是要弄明白用戶名和密碼標簽的屬性name是什么,以下兩種方法可以實現(xiàn)。

瀏覽器F12查看element獲取

也可以通過抓包工具Fiddler獲取。

廢話不多說了,讓我們看看到底如何找到name?

1. 瀏覽器F12

通過瀏覽器F12元素逐層查看到(我是用的Chrome),郵箱/手機號標簽的name="form_email", 密碼的標簽name="form_email",如下圖紅框所示。

但要說明的是,兩個標簽的name名稱并不是固定的,上面查看的name名稱只是豆瓣網(wǎng)站定義的,不代表所有。其它的網(wǎng)站可能有會有不同的名稱,比如name="username", name="password"之類的。因此,針對不同網(wǎng)站的登錄,需要每次查看name是什么。

2. 通過fiddler抓包工具

博主推薦使用fiddler工具,非常好用。爬蟲本身就是模擬瀏覽器工作,我們只需要知道瀏覽器是怎么工作的就可以了。

fiddler會幫助我們抓取瀏覽器POST請求的所有內(nèi)容,這樣我們得到了瀏覽器POST的信息,把它填到爬蟲程序里模擬瀏覽器操作就OK了。另外,也可以通過fiddler抓到瀏覽器請求的headers,非常方便。

安裝fiddler的小伙伴們注意:fiddler證書問題的坑(無法抓取HTTPs包),可以通過Tools —> Options —>HTTPS里面打勾Decrypt HTTPS traffic修改證書來解決。否則會一直顯示抓取 Tunnel 信息包...

好了,完成了準備工作,我們直接上一段代碼理解下。

POST請求的使用

# coding: utf-8
import urllib.request
import urllib.error
import urllib.parse

# headers 信息,從fiddler上或你的瀏覽器上可復(fù)制下來
headers = {'Accept': 'text/html,application/xhtml+xml,
    application/xml;q=0.9,image/webp,image/apng,
    */*;q=0.8',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; 
           Win64; x64) AppleWebKit/537.36 
           (KHTML, like Gecko)Chrome/48.0
           .2564.48 Safari/537.36'
    }
# POST請求的信息,填寫你的用戶名和密碼
value = {'source': 'index_nav',
   'form_password': 'your password',
   'form_email': 'your username'
   }
try:
data = urllib.parse.urlencode(value).encode('utf8')
response = urllib.request.Request(
'https://www.douban.com/', data=data, headers=headers)
html = urllib.request.urlopen(response)
result = html.read().decode('utf8')
print(result)
except urllib.error.URLError as e:
if hasattr(e, 'reason'):
  print('錯誤原因是' + str(e.reason))
except urllib.error.HTTPError as e:
if hasattr(e, 'code'):
  print('錯誤編碼是' + str(e.code))
else:
print('請求成功通過。')

運行結(jié)果:

<!DOCTYPE HTML>
<html lang="zh-cmn-Hans" class="ua-windows ua-webkit">
<head>
<meta charset="UTF-8">
<meta name="description" content="提供圖書、電影、音樂唱片的
推薦、評論和價格比較,以及城市獨特的文化生活。">
.....
window.attachEvent('onload', _ga_init);
}
</script>
</body>
</html>

注意:復(fù)制header的時候請去掉 這一項'Accept-Encoding':' gzip, deflate, 否則會提示decode的錯誤。

POST請求代碼分析

我們來分析一下上面的代碼,與urllib庫request的使用基本一致,urllib庫request的基本用法可參考上篇文章Python從零學(xué)爬蟲,這里多出了post的data參數(shù)和一些解析的內(nèi)容,著重講解一下。

data = urllib.parse.urlencode(value).encode('utf8')

這句的意思是利用了urllib庫的parse來對post內(nèi)容解析,為什么要解析呢?

這是因為post內(nèi)容需要進行一定的編碼格式處理后才能發(fā)送,而編碼的規(guī)則需要遵從RFC標準,百度了一下RFC定義,供大家參考:

Request ForComments(RFC),是一系列以編號排定的文件。文件收集了有關(guān)互聯(lián)網(wǎng)相關(guān)信息,以及UNIX和互聯(lián)網(wǎng)社區(qū)的軟件文件。目前RFC文件是由InternetSociety(ISOC)贊助發(fā)行?;镜幕ヂ?lián)網(wǎng)通信協(xié)議都有在RFC文件內(nèi)詳細說明。RFC文件還額外加入許多的論題在標準內(nèi),例如對于互聯(lián)網(wǎng)新開發(fā)的協(xié)議及發(fā)展中所有的記錄。因此幾乎所有的互聯(lián)網(wǎng)標準都有收錄在RFC文件之中。

而parse的urlencode方法是將一個字典或者有順序的二元素元組轉(zhuǎn)換成為URL的查詢字符串(說白了就是按照RFC標準轉(zhuǎn)換了一下格式)。然后再將轉(zhuǎn)換好的字符串按UTF-8的編碼轉(zhuǎn)換成為二進制格式才能使用。

注:以上是在Python3.x環(huán)境下完成,Python3.x中編碼解碼規(guī)則為 byte—>string—>byte的模式,其中byte—>string為解碼,string—>byte為編碼

代理IP

代理IP的使用

為什么要使用代理IP?因為各種反爬機制會檢測同一IP爬取網(wǎng)頁的頻率速度,如果速度過快,就會被認定為機器人封掉你的IP。但是速度過慢又會影響爬取的速度,因此,我們將使用代理IP取代我們自己的IP,這樣不斷更換新的IP地址就可以達到快速爬取網(wǎng)頁而降低被檢測為機器人的目的了。

同樣利用urllib的request就可以完成代理IP的使用,但是與之前用到的urlopen不同,我們需要自己創(chuàng)建訂制化的opener。什么意思呢?

urlopen就好像是opener的通用版本,當我們需要特殊功能(例如代理IP)的時候,urlopen滿足不了我們的需求,我們就不得不自己定義并創(chuàng)建特殊的opener了。

request里面正好有處理各種功能的處理器方法,如下:

ProxyHandler, UnknownHandler, HTTPHandler,
HTTPDefaultErrorHandler, HTTPRedirectHandler,
FTPHandler, FileHandler, HTTPErrorProcessor, DataHandler

我們要用的是第一個ProxyHandler來處理代理問題。

讓我們看一段代碼如何使用。

# coding:utf-8
import urllib.request
import urllib.error
import urllib.parse
# headers信息,從fiddler上或瀏覽器上可復(fù)制下來
headers = {'Accept': 'text/html,application/xhtml+xml,
    application/xml;q=0.9,image/webp,image/apng,
    */*;q=0.8',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.3;
           Win64;
           x64) AppleWebKit/537.36 (KHTML, 
           like Gecko)Chrome/48.0.2564.48 
           Safari/537.36'
    }
# POST請求的信息
value = {'source': 'index_nav',
   'form_password': 'your password',
   'form_email': 'your username'
   }
# 代理IP信息為字典格式,key為'http',value為'代理ip:端口號'
proxy = {'http': '115.193.101.21:61234'}
try:
data = urllib.parse.urlencode(value).encode('utf8')
response = urllib.request.Request(
'https://www.douban.com/', data=data, headers=headers)
# 使用ProxyHandler方法生成處理器對象
proxy_handler = urllib.request.ProxyHandler(proxy)
# 創(chuàng)建代理IP的opener實例
opener = urllib.request.build_opener(proxy_handler)
# 將設(shè)置好的post信息和headers的response作為參數(shù)
html = opener.open(response)
result = html.read().decode('utf8')
print(result)
except urllib.error.URLError as e:
if hasattr(e, 'reason'):
  print('錯誤原因是' + str(e.reason))
except urllib.error.HTTPError as e:
if hasattr(e, 'code'):
  print('錯誤編碼是' + str(e.code))
else:
print('請求成功通過。')

在上面post請求代碼的基礎(chǔ)上,用自己創(chuàng)建的opener替換urlopen即可完成代理IP的操作,代理ip可以到一些免費的代理IP網(wǎng)站上查找。

以上就是我們整理的全部內(nèi)容,感謝你對腳本之家的支持。

相關(guān)文章

  • Python ArgumentParse的subparser用法說明

    Python ArgumentParse的subparser用法說明

    這篇文章主要介紹了Python ArgumentParse的subparser用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • Python3.10?Generator生成器Coroutine原生協(xié)程詳解

    Python3.10?Generator生成器Coroutine原生協(xié)程詳解

    這篇文章主要為大家介紹了Python3.10?Generator生成器Coroutine原生協(xié)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • Django查找網(wǎng)站項目根目錄和對正則表達式的支持

    Django查找網(wǎng)站項目根目錄和對正則表達式的支持

    這篇文章主要介紹了Django查找網(wǎng)站項目根目錄和對正則表達式的支持,僅供參考,需要的朋友可以參考下
    2015-07-07
  • Python操作系統(tǒng)的6個自動化腳本小結(jié)

    Python操作系統(tǒng)的6個自動化腳本小結(jié)

    在Python中,實現(xiàn)操作系統(tǒng)自動化的腳本可以涵蓋從文件操作、系統(tǒng)監(jiān)控到網(wǎng)絡(luò)任務(wù)等多種功能,下面我將詳細介紹六個不同類別的Python自動化腳本示例,這些示例將幫助你理解如何用Python來自動化日常操作系統(tǒng)任務(wù),需要的朋友可以參考下
    2024-10-10
  • Python requests.post方法中data與json參數(shù)區(qū)別詳解

    Python requests.post方法中data與json參數(shù)區(qū)別詳解

    這篇文章主要介紹了Python requests.post方法中data與json參數(shù)區(qū)別詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • Python  Django 母版和繼承解析

    Python Django 母版和繼承解析

    這篇文章主要介紹了Python Django 母版和繼承解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • Python的消息隊列包SnakeMQ使用初探

    Python的消息隊列包SnakeMQ使用初探

    使用消息隊列在數(shù)據(jù)的通信中擁有很多優(yōu)點,SnakeMQ是一個開源的用Python實現(xiàn)的跨平臺MQ庫,well,Python的消息隊列包SnakeMQ使用初探,here we go:
    2016-06-06
  • Tensorflow使用支持向量機擬合線性回歸

    Tensorflow使用支持向量機擬合線性回歸

    這篇文章主要為大家詳細介紹了Tensorflow使用支持向量機擬合線性回歸,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • 使用python連接mysql數(shù)據(jù)庫數(shù)據(jù)方式

    使用python連接mysql數(shù)據(jù)庫數(shù)據(jù)方式

    這篇文章主要介紹了使用python連接mysql數(shù)據(jù)庫數(shù)據(jù)方式,住喲有兩種方式,具體內(nèi)容,需要的小伙伴可以參考下面文章內(nèi)容,希望對你有所幫助
    2022-03-03
  • Python 迭代器介紹及作用詳情

    Python 迭代器介紹及作用詳情

    這篇文章主要介紹了Python 迭代器介紹及作用詳情,Python 中的迭代器是一個對象,用于迭代列表、元組、字典和集合等可迭代對象,文章圍繞主題展開詳細的內(nèi)容介紹,需要的朋友可以參考一下
    2022-07-07

最新評論