我們簡單介紹了爬蟲的基本原理,理解原理可以幫助我們更好的實現**。python 提供了非常多工具去實現 http 請求,但第三方開源庫提供的功能更豐富,你無需從 socket 通訊開始寫,比如使用pyton內建模組 urllib 請求乙個 url **示例如下:
import ssl
from urllib.request import request
from urllib.request import urlopen
context = ssl.
_create_unverified_context
()
request =
request
(url=
"", method=
"get"
, headers=
, data=none)
response =
urlopen
(request, context=context)
headers = response.
info
() # 響應頭
content = response.
read
() # 響應體
code = response.
getcode
() # 狀態碼
發起請求前首先要構建請求物件 request,指定 url 位址、請求方法、請求頭,這裡的請求體 data 為空,因為你不需要提交資料給伺服器,所以你也可以不指定。urlopen 函式會自動與目標伺服器建立連線,傳送 http 請求,該函式的返回值是乙個響應物件 response,裡面有響應頭資訊,響應體,狀態碼之類的屬性。
但是,python 提供的這個內建模組過於低階,需要寫很多**,使用簡單爬蟲可以考慮 requests,requests 在github 有近30k的star,是乙個很pythonic的框架。先來簡單熟悉一下這個框架的使用方式
安裝 requests
pip install requests
get 請求
>>
> r = requests.get(
"")>>
> r
200]
>
# 響應物件
>>
> r.status_code # 響應狀態碼
200>>
> r.content # 響應內容
'\n'
post 請求
>>> r = requests.
post
('', data =
)
自定義請求頭
這個經常會用到,伺服器反爬蟲機制會判斷客戶端請求頭中的user-agent是否**於真實瀏覽器,所以,我們使用requests經常會指定ua偽裝成瀏覽器發起請求
>>> url =
''>>> headers =
>>> r = requests.
get(url, headers=headers)
引數傳遞
很多時候url後面會有一串很長的引數,為了提高可讀性,requests 支援將引數抽離出來作為方法的引數(params)傳遞過去,而無需附在 url 後面,例如請求 url
,可使用
>>> url =
"">>> r = requests.
get(url, params=
)>>> r.url
u'?key=val'指定cookie
cookie 是web瀏覽器登入**的憑證,雖然 cookie 也是請求頭的一部分,我們可以從中剝離出來,使用 cookie 引數指定
>>> s = requests.
get(
'', cookies=
)>>> s.text
u'\n}\n'
設定超時
當發起乙個請求遇到伺服器響應非常緩慢而你又不希望等待太久時,可以指定 timeout 來設定請求超時時間,單位是秒,超過該時間還沒有連線伺服器成功時,請求將強行終止。
r = requests.
get(
'', timeout=
5)
設定**
一段時間內傳送的請求太多容易被伺服器判定為爬蟲,所以很多時候我們使用**ip來偽裝客戶端的真實ip。
import requests
proxies =
r = requests.
get(
'', proxies=proxies, timeout=
2)
session
如果想和伺服器一直保持登入(會話)狀態,而不必每次都指定 cookies,那麼可以使用 session,session 提供的api和 requests 是一樣的。
import requests
s = requests.
session()
s.cookies = requests.utils.
cookiejar_from_dict()
r = s.
get(
'')print
(r.text)
# '}'
r = s.
get(
'')print
(r.text)
# '}'
這就是乙個最簡單的基於 requests 的單執行緒知乎專欄粉絲列表的爬蟲,requests 非常靈活,請求頭、請求引數、cookie 資訊都可以直接指定在請求方法中,返回值 response 如果是 json 格式可以直接呼叫json()方法返回 python 物件。關於 requests 的更多使用方法可以參考官方文件: 使用Python的turtle庫畫乙個簡單的五角星
turtle庫是python的內建圖形化模板 可參考筆記或其他的資料 功能 五角星的繪製 import turtle defmain 主函式 count 1 while count 5 turtle.forward 100 向前走50 turtle.right 144 向右轉144度 count c...
使用兩個佇列實現乙個棧,使用兩個棧實現乙個佇列
一 棧與佇列的特點 一 棧 棧 一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素操作。進行資料插入和刪除操作的一端稱為棧頂,另一端稱為棧底。不含任何元素的棧稱為空 棧,棧又稱為後進先出的線性表。棧的特點 後進先出 lifo 二 佇列 佇列 只允許在一端進行插入資料操作,在另一端進行刪除資料操...
一 requests基本使用
coding utf 8 import requests print get請求 url r requests.get url get print r.status code,r.reason print r.text 帶引數 get請求 r requests.get url get params ...