python3urlib
❶ python3中urllib2找不到怎麼辦
在python2中使用的urllib2庫在python3中不存在怎麼解決呢?在python3中是urllib.request.urlopen代替了urllib2.
最後列印結果
❷ python3中怎麼沒有urllib2
urllib2是python2自帶的模塊,不需要下載。
urllib2在python3.x中被改為urllib ,你直接輸入urllib就可以了
>>>importurllib
下圖是我電腦上的Python3.5版本的
❸ python3 post請求中body是一串字元串
python3環境中,使用urllib的庫時,urllib.request.Request方法中,是用來組成post的數據結構
req= request.Request(url=url,data=data,headers=headers)
此時會報錯,類型不對
報錯為「POST data should be bytes or an iterable of bytes...」
後改為如下方法,將body中的data以utf-8編碼即可
req= request.Request(url=url,data=data.encode('utf-8'),headers=headers)
請求方法仍然是
response= request.urlopen(req)
當收到response時,使用read()同時解碼即可,如下
response.read().decode('utf-8')
網上很多方法中會提到下面這個方法
urllib.parse.urlendcode
這個方法是用在將json格式文件url編碼的,當body為字元串時,使用此方法無效,仍然是錯誤的
❹ Python爬蟲-常用的請求方式
爬蟲的請求方式常用的有urllib和requests,前者是自帶模塊,後者需要我們自己進行安裝。
安裝requests模塊
注意:在 python2 中,urllib 被分為urllib,urllib2等,在python3中我們直接使用urllib
雖然Python的標准庫中 urllib 模塊已經包含了平常我們使用的大多數功能,但是它的 API 使用起來讓人感覺不太好,而 Requests 自稱 "HTTP for Humans",說明使用更簡潔方便。
❺ python3中https urlopen()報錯的解決方法
這個錯誤是因為Python 2.7.9 之後引入了一個新特性,當你使用urllib.urlopen一個 https 的時候會驗證一次 SSL證書。當目標使用的是自簽名的證書時就會報urllib.error.URLError錯誤。解決方法如下:
import urllib.request
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
response = urllib.request.urlopen('https://www.python.org')
print(response.read().decode('utf-8'))
通過導入ssl模塊把證書驗證改成不用驗證就行了。
❻ 「2022 年」崔慶才 Python3 爬蟲教程 - 代理的使用方法
前面我們介紹了多種請求庫,如 urllib、requests、Selenium、Playwright 等用法,但是沒有統一梳理代理的設置方法,本節我們來針對這些庫來梳理下代理的設置方法。
在本節開始之前,請先根據上一節了解一下代理的基本原理,了解了基本原理之後我們可以更好地理解和學習本節的內容。
另外我們需要先獲取一個可用代理,代理就是 IP 地址和埠的組合,就是 : 這樣的格式。如果代理需要訪問認證,那就還需要額外的用戶名密碼兩個信息。
那怎麼獲取一個可用代理呢?
使用搜索引擎搜索 「代理」 關鍵字,可以看到許多代理服務網站,網站上會有很多免費或付費代理,比如快代理的免費 HTTP 代理:https://www.kuaidaili.com/free/ 上面就寫了很多免費代理,但是這些免費代理大多數情況下並不一定穩定,所以比較靠譜的方法是購買付費代理。付費代理的各大代理商家都有套餐,數量不用多,穩定可用即可,我們可以自行選購。
另外除了購買付費 HTTP 代理,我們也可以在本機配置一些代理軟體,具體的配置方法可以參考 https://setup.scrape.center/proxy-client,軟體運行之後會在本機創建 HTTP 或 SOCKS 代理服務,所以代理地址一般都是 127.0.0.1: 這樣的格式,不同的軟體用的埠可能不同。
這里我的本機安裝了一部代理軟體,它會在本地 7890 埠上創建 HTTP 代理服務,即代理為 127.0.0.1:7890。另外,該軟體還會在 7891 埠上創建 SOCKS 代理服務,即代理為 127.0.0.1:7891,所以只要設置了這個代理,就可以成功將本機 IP 切換到代理軟體連接的伺服器的 IP 了。
在本章下面的示例里,我使用上述代理來演示其設置方法,你也可以自行替換成自己的可用代理。
設置代理後,測試的網址是 http://httpbin.org/get,訪問該鏈接我們可以得到請求的相關信息,其中返回結果的 origin 欄位就是客戶端的 IP,我們可以根據它來判斷代理是否設置成功,即是否成功偽裝了 IP。
好,接下來我們就來看下各個請求庫的代理設置方法吧。
首先我們以最基礎的 urllib 為例,來看一下代理的設置方法,代碼如下:
運行結果如下:
這里我們需要藉助 ProxyHandler 設置代理,參數是字典類型,鍵名為協議類型,鍵值是代理。注意,此處代理前面需要加上協議,即 http:// 或者 https://,當請求的鏈接是 HTTP 協議的時候,會使用 http 鍵名對應的代理,當請求的鏈接是 HTTPS 協議的時候,會使用 https 鍵名對應的代理。不過這里我們把代理本身設置為了 HTTP 協議,即前綴統一設置為了 http://,所以不論訪問 HTTP 還是 HTTPS 協議的鏈接,都會使用我們配置的 HTTP 協議的代理進行請求。
創建完 ProxyHandler 對象之後,我們需要利用 build_opener 方法傳入該對象來創建一個 Opener,這樣就相當於此 Opener 已經設置好代理了。接下來直接調用 Opener 對象的 open 方法,即可訪問我們所想要的鏈接。
運行輸出結果是一個 JSON,它有一個欄位 origin,標明了客戶端的 IP。驗證一下,此處的 IP 確實為代理的 IP,並不是真實的 IP。這樣我們就成功設置好代理,並可以隱藏真實 IP 了。
如果遇到需要認證的代理,我們可以用如下的方法設置:
這里改變的只是 proxy 變數,只需要在代理前面加入代理認證的用戶名密碼即可,其中 username 就是用戶名,password 為密碼,例如 username 為 foo,密碼為 bar,那麼代理就是 foo:[email protected]:7890。
如果代理是 SOCKS5 類型,那麼可以用如下方式設置代理:
此處需要一個 socks 模塊,可以通過如下命令安裝:
這里需要本地運行一個 SOCKS5 代理,運行在 7891 埠,運行成功之後和上文 HTTP 代理輸出結果是一樣的:
結果的 origin 欄位同樣為代理的 IP,代理設置成功。
對於 requests 來說,代理設置非常簡單,我們只需要傳入 proxies 參數即可。
這里以我本機的代理為例,來看下 requests 的 HTTP 代理設置,代碼如下:
運行結果如下:
和 urllib 一樣,當請求的鏈接是 HTTP 協議的時候,會使用 http 鍵名對應的代理,當請求的鏈接是 HTTPS 協議的時候,會使用 https 鍵名對應的代理,不過這里統一使用了 HTTP 協議的代理。
運行結果中的 origin 若是代理伺服器的 IP,則證明代理已經設置成功。
如果代理需要認證,那麼在代理的前面加上用戶名和密碼即可,代理的寫法就變成如下所示:
這里只需要將 username 和 password 替換即可。
如果需要使用 SOCKS 代理,則可以使用如下方式來設置:
這里我們需要額外安裝一個包 requests[socks],相關命令如下所示:
運行結果是完全相同的:
另外,還有一種設置方式,即使用 socks 模塊,也需要像上文一樣安裝 socks 庫。這種設置方法如下所示:
使用這種方法也可以設置 SOCKS 代理,運行結果完全相同。相比第一種方法,此方法是全局設置的。我們可以在不同情況下選用不同的方法。
httpx 的用法本身就與 requests 的使用非常相似,所以其也是通過 proxies 參數來設置代理的,不過與 requests 不同的是,proxies 參數的鍵名不能再是 http 或 https,而需要更改為 http:// 或 https://,其他的設置是一樣的。
對於 HTTP 代理來說,設置方法如下:
對於需要認證的代理,也是改下 proxy 的值即可:
這里只需要將 username 和 password 替換即可。
運行結果和使用 requests 是類似的,結果如下:
對於 SOCKS 代理,我們需要安裝 httpx-socks 庫,安裝方法如下:
這樣會同時安裝同步和非同步兩種模式的支持。
對於同步模式,設置方法如下:
對於非同步模式,設置方法如下:
和同步模式不同的是,transport 對象我們用的是 AsyncProxyTransport 而不是 SyncProxyTransport,同時需要將 Client 對象更改為 AsyncClient 對象,其他的不變,運行結果是一樣的。
Selenium 同樣可以設置代理,這里以 Chrome 為例來介紹其設置方法。
對於無認證的代理,設置方法如下:
運行結果如下:
代理設置成功,origin 同樣為代理 IP 的地址。
如果代理是認證代理,則設置方法相對比較繁瑣,具體如下所示:
這里需要在本地創建一個 manifest.json 配置文件和 background.js 腳本來設置認證代理。運行代碼之後,本地會生成一個 proxy_auth_plugin.zip 文件來保存當前配置。
運行結果和上例一致,origin 同樣為代理 IP。
SOCKS 代理的設置也比較簡單,把對應的協議修改為 socks5 即可,如無密碼認證的代理設置方法為:
運行結果是一樣的。
對於 aiohttp 來說,我們可以通過 proxy 參數直接設置。HTTP 代理設置如下:
如果代理有用戶名和密碼,像 requests 一樣,把 proxy 修改為如下內容:
這里只需要將 username 和 password 替換即可。
對於 SOCKS 代理,我們需要安裝一個支持庫 aiohttp-socks,其安裝命令如下:
我們可以藉助於這個庫的 ProxyConnector 來設置 SOCKS 代理,其代碼如下:
運行結果是一樣的。
另外,這個庫還支持設置 SOCKS4、HTTP 代理以及對應的代理認證,可以參考其官方介紹。
對於 Pyppeteer 來說,由於其默認使用的是類似 Chrome 的 Chromium 瀏覽器,因此其設置方法和 Selenium 的 Chrome 一樣,如 HTTP 無認證代理設置方法都是通過 args 來設置的,實現如下:
運行結果如下:
同樣可以看到設置成功。
SOCKS 代理也一樣,只需要將協議修改為 socks5 即可,代碼實現如下:
運行結果也是一樣的。
相對 Selenium 和 Pyppeteer 來說,Playwright 的代理設置更加方便,其預留了一個 proxy 參數,可以在啟動 Playwright 的時候設置。
對於 HTTP 代理來說,可以這樣設置:
在調用 launch 方法的時候,我們可以傳一個 proxy 參數,是一個字典。字典有一個必填的欄位叫做 server,這里我們可以直接填寫 HTTP 代理的地址即可。
運行結果如下:
對於 SOCKS 代理,設置方法也是完全一樣的,我們只需要把 server 欄位的值換成 SOCKS 代理的地址即可:
運行結果和剛才也是完全一樣的。
對於有用戶名和密碼的代理,Playwright 的設置也非常簡單,我們只需要在 proxy 參數額外設置 username 和 password 欄位即可,假如用戶名和密碼分別是 foo 和 bar,則設置方法如下:
這樣我們就能非常方便地為 Playwright 實現認證代理的設置。
以上我們就總結了各個請求庫的代理使用方式,各種庫的設置方法大同小異,學會了這些方法之後,以後如果遇到封 IP 的問題,我們可以輕鬆通過加代理的方式來解決。
本節代碼:https://github.com/Python3WebSpider/ProxyTest
❼ python3中使用urllib進行https請求
剛入門python學習網路爬蟲基礎,我使用的python版本是python3.6.4,學習的教程參考 Python爬蟲入門教程
python3.6的版本已經沒有urllib2這個庫了,所以我也不需要糾結urllib和urllib2的區別和應用場景
參考這篇官方文檔 HOWTO Fetch Internet Resources Using The urllib Package 。關於http(s)請求一般就get和post兩種方式較為常用,所以寫了以下兩個小demo,url鏈接隨便找的,具體場景具體變化,可參考注釋中的基本思路
POST請求:
GET請求:
注意,
使用ssl創建未經驗證的上下文,在urlopen中需傳入上下文參數
urllib.request.urlopen(full_url, context=context)
這是Python 升級到 2.7.9 之後引入的一個新特性,所以在使用urlopen打開https鏈接會遇到如下報錯:
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)
所以,當使用urllib.urlopen打開一個 https 鏈接時,需要先驗證一次 SSL 證書
context = ssl._create_unverified_context()
或者或者導入ssl時關閉證書驗證
ssl._create_default_https_context =ssl._create_unverified_context
❽ python3.4中urllib 有沒有urlencode函數
python3.x中urlencode在urllib.parse模塊中
使用方式urllib.parse.urlencode
urllib.parse.urlencode(query,
doseq=False, safe='', encoding=None,
errors=None, quote_via=quote_plus)
Convert a mapping object or a sequence of two-element tuples, which may
contain str
or bytes objects, to a 「percent-encoded」 string. If the
resultant string is to be used as a data for POST operation with urlopen() function, then it should be properly
encoded to bytes, otherwise it would result in a TypeError.
The resulting string is a series of key=value pairs separated by '&' characters, where
both key and value are quoted using the quote_via
function. By default, quote_plus() is used to quote the values, which
means spaces are quoted as a '+' character and 『/』 characters are encoded as %2F, which follows the
standard for GET requests (application/x-www-form-urlencoded). An alternate
function that can be passed as quote_via is quote(), which will encode spaces as %20 and not encode 『/』
characters. For maximum control of what is quoted, use quote and specify a value
for safe.
When a sequence of two-element tuples is used as the query argument,
the first element of each tuple is a key and the second is a value. The value
element in itself can be a sequence and in that case, if the optional parameter
doseq is evaluates to True, indivial key=value pairs separated
by '&' are
generated for each element of the value sequence for the key. The order of
parameters in the encoded string will match the order of parameter tuples in the
sequence.
The safe, encoding, and errors parameters are
passed down to quote_via (the encoding and errors
parameters are only passed when a query element is a str).
To reverse this encoding process, parse_qs() and parse_qsl() are provided in this mole to parse
query strings into Python data structures.
Refer to urllib examples to
find out how urlencode method can be used for generating query string for a URL
or data for POST.
Changed in version 3.2: Query parameter
supports bytes and string objects.
❾ python的urllib3庫(http連接池)
urllib3.disable_warnings() # 禁用各種urllib3的警告
1.retry:重試重定向次數,默認次數為3次,如果想要關閉重定向,但是不想關閉重試只需redirect=Flase,如果重定向重試都關閉,retries=False
2.timeout:超時,可以設置鏈接超時和讀超時
timeout = urllib3.Timeout(connect=1,read=2)
3.numpools:池子的數量,假如有10個池子,當你訪問第11個ip的時候第一個池子會被幹掉,然後建一個
新的供第11個使用.一個池子是作用於同一個ip下的,即 http://aaa.com/a 和 http://aaa.com/b 是會共用一個池子的
4.maxsize:一個池子緩存的最大連接數量.沒有超過最大鏈接數量的鏈接都會被保存下來.在block為false的情況下,
添加的額外的鏈接不會被保存一般多用於多線程之下,一般情況是設置為和線程數相等的數量, 保證每個線程都能訪問一個鏈接.
5.還有一個參數 是 block ,默認為False,如果線程數量大於池子最大鏈接數量.這時設置block為true,則會阻塞線程,因為線程會等其他線程使用完鏈接,如果設置為False,則不會阻塞線程,但是會新開一個鏈接.有一個弊端是,使用完之後這個鏈接會關閉,所以如果 多線程經常建立鏈接會影響性能,多佔用多餘的資源