使用 Requests 實現乙個簡單網頁爬蟲

2021-09-25 09:50:04 字數 3190 閱讀 5201

我們簡單介紹了爬蟲的基本原理,理解原理可以幫助我們更好的實現**。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 ...