python3 網路爬蟲開發實戰(崔慶才著)第三章

2021-09-24 17:42:16 字數 4074 閱讀 4984

3.1 urllib

是 python 內建的 http 請求庫

urlopen()

urllib.request.urlopen()函式用於實現對目標url的訪問。

import urllib.request

response = urllib.request.urlopen('') #response是乙個httpresposne型別的物件

print(response.read().decode('utf-8')) #直接用urllib.request模組的urlopen()獲取頁面,page的資料格式為bytes型別,需要decode()解碼,轉換成str型別。

print(response.status) #響應的狀態碼

print(response.getheaders()) #響應的頭資訊

print(response.getheader('server')) #獲取 headers 中的 server 值

函式原型:urllib.request.urlopen(url, data=none, [timeout, ]*, cafile=none, capath=none, cadefault=false, context=none)

import urllib.parse

import urllib.request

data = bytes(urllib.parse.urlencode(), encoding='utf8')

response = urllib.request.urlopen('', data=data)

print(response.read())

傳遞了乙個引數 word,值是 hello。它需要被轉碼成bytes(位元組流)型別。其中轉位元組流採用了 bytes() 方法,第乙個引數需要是 str(字串)型別,需要用 urllib.parse 模組裡的 urlencode() 方法來將引數字典轉化為字串。第二個引數指定編碼格式,在這裡指定為 utf8。

import urllib.request

response = urllib.request.urlopen('', timeout=1)

print(response.read())

#通過設定這個超時時間來控制乙個網頁如果長時間未響應就跳過它的抓取

import socket

import urllib.request

import urllib.error

try:

response = urllib.request.urlopen('', timeout=0.1)

except urllib.error.urlerror as e:

if isinstance(e.reason, socket.timeout):

print('time out')

request

urllib.request.request(url, data=none, headers={}, origin_req_host=none, unverifiable=false, method=none)

from urllib import request, parse

url = ''

headers =

dict =

data = bytes(parse.urlencode(dict), encoding='utf8')

req = request.request(url=url, data=data, headers=headers, method='post')

response = request.urlopen(req)

print(response.read().decode('utf-8'))

通過四個引數構造了乙個 request,url 即請求 url,在headers 中指定了 user-agent 和 host,傳遞的引數 data 用了 urlencode() 和 bytes() 方法來轉成位元組流,另外指定了請求方式為 post。

高階用法

各種處理器,有專門處理登入驗證的,有處理 cookies 的,有處理**設定的,利用它們我們幾乎可以做到任何 http 請求中所有的事情。

auth_handler = httpbasicauthhandler(p) #例化了乙個 httpbasicauthhandler 物件,引數是 httppasswordmgrwithdefaultrealm 物件,它利用 add_password() 新增進去使用者名稱和密碼,這樣我們就建立了乙個處理認證的 handler。

opener = build_opener(auth_handler) #利用 build_opener() 方法來利用這個 handler 構建乙個 opener,那麼這個 opener 在傳送請求的時候就相當於已經認證成功

try:

result = opener.open(url) #利用 opener 的 open() 方法開啟鏈結,就可以完成認證了,在這裡獲取到的結果就是認證後的頁面原始碼內容。

html = result.read().decode('utf-8')

print(html)

except urlerror as e:

print(e.reason)**

from urllib.error import urlerror

from urllib.request import proxyhandler, build_opener

proxy_handler = proxyhandler()

opener = build_opener(proxy_handler)

try:

response = opener.open('')

print(response.read().decode('utf-8'))

except urlerror as e:

print(e.reason)

在此本地搭建了乙個**,執行在 9743 埠上。

在這裡使用了 proxyhandler,proxyhandler 的引數是乙個字典,鍵名是協議型別,比如 http 還是 https 等,鍵值是**鏈結,可以新增多個**。

然後利用 build_opener() 方法利用這個 handler 構造乙個 opener,然後傳送請求即可。

3. cookies

cookies 的處理就需要 cookies 相關的 handler 了。

cookie = http.cookiejar.cookiejar() #宣告乙個 cookiejar 物件

handler = urllib.request.httpcookieprocessor(cookie) #利用 httpcookieprocessor 來構建乙個 handler

opener = urllib.request.build_opener(handler) #利用 build_opener() 方法構建出 opener

response = opener.open('') #執行 open() 函式

for item in cookie:

print(item.name+"="+item.value)

《Python3網路爬蟲開發實戰》爬蟲有關庫的安裝

pip install requests pip install selenium 將chromedriver.exe檔案放到python的scripts目錄下 將其路徑配置到環境變數 將geckodriver.exe檔案放到python的scripts目錄下 將其路徑配置到環境變數 解壓後將bin...

python3 網路爬蟲開發實戰 貓眼top100

我發現自己沒有整理和總結的習慣,有時是學了之後覺得會了,懶得整理,有時是沒有時間,偶爾有時候想起來會寫一篇。但是後來發現忘的還是挺快的,而且想找以前的東西的時候總是不太方便。不過人生在世,總要給這個世界留下點什麼。把自己在學習中得到的東西,所思所想都記錄下來,所以在此立個flag 狗頭 養成總結和寫...

Python3網路爬蟲開發實戰 分布式爬蟲原理

分布式爬蟲原理 我們在前面已經實現了 scrapy 微博爬蟲,雖然爬蟲是非同步加多執行緒的,但是我們只能在一台主機上執行,所以爬取效率還是有限的,分布式爬蟲則是將多台主機組合起來,共同完成乙個爬取任務,這將大大提高爬取的效率。分布式爬蟲架構 在了解分布式爬蟲架構之前,首先回顧一下 scrapy 的架...