Python爬蟲:一文帶你輕鬆掌握requests模塊

2022-01-02 Python專欄
上周的爬蟲文章中我們介紹了urllib模塊,我們知道urllib模塊可以模擬瀏覽器發送請求並獲取響應信息。同時我們也介紹了urllib模塊是Python的內置模塊,可以直接通過import導入使用。本篇文章我們繼續給大家介紹模擬瀏覽器發送請求並獲取響應信息的requests模塊,那為什麼我們有了urllib模塊還要學習requests模塊呢?因為在使用urllib模塊的時候,會有諸多不便之處,總結如下:

我們如何使用requests模塊呢?

因為requests模塊不是Python的內置模塊,所以我們要通過包管理器pip進行下載。

pip install requests

或者

pip3 install requests

安裝完成之後我們就可以在py文件中導入使用了

import requests

我們前面說過爬蟲的基本步驟是:

發送請求【可以使用urllib或者requests】發送請求的方式有:GET和POST,多數的請求是GET請求,比如在做數據查詢時,建議用GET請求方式。而在做數據添加、修改或刪除或者用戶登陸這些場景的時候就是POST請求,因為GET請求方式的安全性較POST方式要差些,包含機密信息的話,建議用POST數據提交方式。requests模塊官方文檔連結:https://docs.python-requests.org/zh_CN/latest/user/quickstart.html,如果有任何疑問大家也可以嘗試查看文檔,練習嘗試閱讀文檔對於大家學習其他模塊會有很大好處。本文分別從兩種請求方式介紹requests模塊的使用

requests的作用就是發送網絡請求,返迴響應數據,那麼現在有一個簡單的需求:通過requests向百度首頁發送請求,獲取百度首頁的數據。

import requests 
# url即百度首頁的連結
url = 'https://www.baidu.com' 
# 通過get方法向目標url發送get請求,返迴響應的結果,是一個response對象
response = requests.get(url)
# 列印響應內容
print(response)

列印結果大家看到:

<Response [200]>

但是我們如何像urllib一樣查看響應對象的狀態碼、響應體內容呢?因為返回的是Response對象,所以對象就可以訪問下面的屬性和方法。如下:

response.text 讀取伺服器響應的內容,通常使用response.text會自動解碼來自伺服器的內容。因此大多數 unicode 字符集都能被無縫地解碼

response.encoding 獲取文本編碼,也可以使用該屬性修改編碼

response.content 獲取響應內容的二進位形式,一般圖片、音視頻等使用此方式獲取

response.status_code 獲取當前請求的響應碼

response.headers 獲取響應的響應頭

response.cookies 獲取響應的cookies內容

response.url 獲取請求的url

接下來我們以爬取百度,檢索的關鍵詞是【Python】為例,看一下響應內容。

import requests
url='https://www.baidu.com/'
response = requests.get(url=url)
# 獲取響應的狀態碼
print(response.status_code)
# 獲取編碼方式
print(response.encoding)
html_data = response.text
print(html_data)
# content獲取的是response對象中的二進位(byte)類型的頁面數據
print(response.content)
# 返回一個響應狀態碼
print(response.status_code)
# 返迴響應頭信息
print(response.headers)
# 獲取請求的url
print(response.url)

結果:

而如果使用requests保存圖片,則需要結合文件保存完成。

import requests

# 圖片地址
image_url = 'https://anchorpost.msstatic.com/cdnimage/anchorpost/1082/bc/e60d649dd5fa645b575f73f9aef0bc_2168_1617694516.jpg?imageview/4/0/w/338/h/19'
# 發送請求獲取響應
response = requests.get(url)

with open('girl.png', 'wb')as f:
    f.write(response.content)

獲取圖片就不能像獲取文本內容一樣使用response.text,而要使用response.content. 獲取的內容最後通過open()函數進行本地保存。上面的請求都沒有添加請求頭,比如我們要爬取豆瓣的內容就會得到418的響應狀態碼,因為發送的請求沒有請求頭。因為網站往往都會檢測請求頭的User-Agent,如果ua不合法,可能會獲取不到響應。所以加請求頭的目的就是模擬瀏覽器,欺騙伺服器,獲取和瀏覽器一致的內容。當然,有的時候甚至不止需要傳User-Agent一個參數,請求信息還需要其他的參數像Referer,Cookie等等。通過字典的形式。多個請求頭信息,使用多個鍵值對的形式。headers = {"User-Agent":'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36'}

requests.get(url, headers=headers)

後面的headers就是字典

我們以豆瓣的信息檢索為例,比如我們在豆瓣上查詢【阿凡達】

import requests
import pprint
# 檢索阿凡達的信息
url = 'https://www.douban.com/search?q=%E9%98%BF%E5%87%A1%E8%BE%BE'
# 定義headers請求頭
headers = {
 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Safari/537.36"
}
# 在請求頭中帶上User-Agent,模擬瀏覽器發送請求
response = requests.get(url, headers=headers)
# 使用pprint進行格式化的輸出
pprint.pprint(response.text)

結果:

大家發現在上面的豆瓣請求中是有參數的,就是【?】後面的內容部分。上面案例中將阿凡達直接進行了編碼。

那如果有參數requests主要如何使用呢?

方式一:直接跟在請求連結的後面,如https://www.baidu.com/s?wd=python。wd=python就是參數。多個參數之間使用符號【&】連結。

https://www.baidu.com/s?wd=Python&pn=10

https://www.baidu.com/s?wd=Python&pn=20

https://www.baidu.com/s?wd=Python&pn=30

在wd=Python和pn=10之間使用符號【&】

# 方式一:直接發送帶參數的url的請求
import requests

headers = {"User-Agent": "ozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Safari/537.36"}
url = 'https://www.baidu.com/s?wd=Python'
# url中包含了請求參數,即在請求連結處?位置後面就是攜帶的參數
response = requests.get(url, headers=headers)
print(response.text)

方式二:使用params實現,類似headers的使用。先定義一個字典params ={'wd':'Python','pn':10}

requests.get(url, headers=headers,params=params)

後面的params就是攜帶的參數

import requests
headers = {"User-Agent": "ozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Safari/537.36"}

# 下面的url如果使用params可以省略?
url = 'https://www.baidu.com/s' 
# 請求參數是一個字典 即wd=Python和pn=10
params = {'wd':'Python','pn':10} 
# 在params上設置字典
response = requests.get(url, headers=headers, params=params) 
# 獲取結果並列印
print(response.text)

但是還有檢索的內容是中文的情況怎麼處理?因為我們大多數使用百度搜索內容都是中文的內容。requests模塊好用之處就在此,如果檢索的內容是中文,直接寫成中文就可以了,我們無需自己轉碼的。方便吧?

那麼哪些地方我們會用到POST請求?

需要傳輸大文本內容的時候( POST 請求對數據長度沒有要求)

用法:

response = requests.post("請求地址", data = 字典類型的參數,headers=字典類型的請求頭)

本次案例我們使用http://httpbin.org/測試網址,在這個網站中你可以測試使用不同的請求方法。

代碼:使用response對象下面的json()獲取。

import requests  # 導入網絡請求模塊requests

# 字典類型的表單參數
data = {
    'a': '好好學習,天天向上!',
    'b': '強身健體,天天Happy'
}
#發送網絡請求  
response = requests.post('http://httpbin.org/post', data=data)
print(response.json()) #列印轉換後的響應數據

返回的是一個json字符串結果。如果想將結果轉成字典形式就要使用json模塊的loads()完成
import requests  # 導入網絡請求模塊requests
import json  # 導入json模塊

# 字典類型的表單參數
data = {
    'a': '好好學習,天天向上!',
    'b': '強身健體,天天Happy'
}
#發送網絡請求  
response = requests.post('http://httpbin.org/post', data=data)
response_dict = json.loads(response.json())#將響應數據json轉換為字典類型
print(response_dict) #列印轉換後的響應數據

為了讓伺服器認為不是同一個客戶端在請求,因為同一個客戶端的ip地址是固定不變的,使用ip代理就可以不斷的切換ip地址,這樣就可以防止我們的真實地址被洩露,甚至被追究。

正向代理:給客戶端做代理,隱藏客戶端的ip地址,讓伺服器不知道客戶端的真實ip地址

反向代理:給伺服器做代理,隱藏伺服器的真實ip地址,同時可以實現負載均衡,處理靜態文件請求等作用,比如nginx

在使用過程中,從請求使用的協議可以分為3種,但是使用哪一種,要在使用的時候需要根據抓取網站的協議來選擇。

http代理 https代理 socket代理等

找了一些代理網站,但是有些網站是要付費的,根據需求決定是否需要付費使用。

http://ip.kxdaili.com/ 開心代理https://proxy.mimvp.com/free.php 米撲代理http://www.xiladaili.com/ 西拉免費代理IPhttp://ip.jiangxianli.com/ 免費代理IP庫http://www.superfastip.com/ 極速代理https://proxy.mimvp.com/free.php 米撲代理http://www.shenjidaili.com/open/ 神雞代理IPhttp://31f.cn/http-proxy/ 三一代理http://www.feiyiproxy.com/?page_id=1457 飛蟻代理http://ip.zdaye.com/dayProxy/2019/4/1.html 站大爺http://www.66ip.cn 66免費代理網https://www.kuaidaili.com/free/inha 快代理https://www.xicidaili.com 西刺http://www.ip3366.net/free/?stype=1 雲代理http://www.iphai.com/free/ng IP海http://www.goubanjia.com/ 全網代理http://www.89ip.cn/index.html 89免費代理http://www.qydaili.com/free/?action=china&page=3 旗雲代理
import requests
import random
#  代理的使用

url = "https://www.baidu.com"
# 獲取的代理ip地址,放在一個字典中,可以寫多個使用隨機數不斷變化選取
# 注意:免費代理的地址是有失效時間的,自己可以去上面網站找合適的
ips = ['221.222.84.131:9000','124.42.7.103:80','116.214.32.51:8080','222.73.68.144:8090','117.121.100.9:3128']
proxy = {
    'http': random.choice(ips),
}

response = requests.get(url, proxies=proxy)

print(response.text)

如果爬取的內容是多頁,就可以每頁隨機的選擇ip地址使用了。代理IP使用的注意點:反反爬使用代理ip是非常必要的一種反反爬的方式,但是即使使用了代理ip,對方伺服器任然會有很多的方式來檢測我們是否是一個爬蟲,比如:一段時間內,檢測IP訪問的頻率,訪問太多頻繁會屏蔽;檢查Cookie,User-Agent,Referer等header參數,若沒有則屏蔽;服務方購買所有代理提供商,加入到反爬蟲資料庫裡,若檢測是代理則屏蔽等。所以更好的方式在使用代理ip的時候使用隨機的方式進行選擇使用,不要每次都用一個代理ip代理ip池的更新購買的代理ip很多時候大部分(超過60%)可能都沒辦法使用,這個時候就需要通過程序去檢測哪些可用,把不能用的刪除掉。好嘍!對於這些內容大家還滿意嗎?如果還有不清楚的歡迎大家留言哦!

系列文章

相關焦點

  • Python 爬蟲基礎入門篇——Requests模塊
    >前幾次推文介紹了頁面爬取的三種用法,並且也使用到Requests模塊,但是沒有詳細的講解,本次推文專門帶大家了解一下Requests模塊。』, path='/cookies')cookies.set('gross_cookie', 'blech', domain=』pythonzhishixuetang.com』, path='/elsewhere')url = 'http://pythonzhishixuetang.org/getlist'r = requests.get(url, cookies
  • Python爬蟲模塊requests常用函數
    requests 是Python裡面的一個爬蟲模塊,它可以進行一個簡單的get和post請求,它是對Python基礎爬蟲模塊urllib的一個封裝,所以,學爬蟲學他就好了,高效易學。成功上傳,不過如果你沒找到上傳文件接口,並沒什麼用。
  • 小白學 Python 爬蟲(17):Requests 基礎使用
    ,畢竟小編也是人,也會犯錯,相比較而言,官方文檔的錯誤率會非常低,包括有時候一些疑難問題都能通過官方文檔來解決。
  • Python爬蟲利器一之Requests庫的用法
    註:Python 版本依然基於 2.7前言之前我們用了 urllib 庫,這個作為入門的工具還是不錯的,對了解一些爬蟲的基本理念,掌握爬蟲爬取的流程有所幫助。入門之後,我們就需要學習一些更加高級的內容和工具來方便我們的爬取。那麼這一節來簡單介紹一下 requests 庫的基本用法。
  • Python爬蟲常用庫之requests詳解
    作者:sergiojune      個人公眾號:日常學python作者好文:Python爬蟲常用庫之
  • Python中爬蟲框架或模塊的區別
    Python中爬蟲框架或模塊的區別 (1)爬蟲框架或模塊 Python自帶爬蟲模塊:urllib、urllib2 ; 第三方爬蟲模塊:requests,aiohttp;
  • Python爬蟲--Requests 庫用法大全
    昨晚分享了Python爬蟲的基本知識,本文分享一下爬蟲裡面請求相關的內容:Requests 用法。
  • Python爬蟲之個人筆記(二):requests模塊應用,發送get/post請求,獲取響應
    安裝requests模塊使用前先安裝requests模塊:pipenv install requests(注意後面有個s)pipenv
  • python中的Requests模塊
    講解對象:python中的Requests模塊作者:融水公子 rsgz介紹:1 Requests 是一個第三方 Python 模塊2 Requests 唯一的一個非轉基因的-pip  3 pip3安裝requests模塊執行命令:sudo pip3 install requests
  • Python爬蟲的兩套解析方法和四種爬蟲實現
    本文想針對某一網頁對python基礎爬蟲的兩大解析庫(BeautifulSoup和lxml)和幾種信息提取實現方法進行分析,以開python爬蟲之初見。基礎爬蟲的固定模式    筆者這裡所談的基礎爬蟲,指的是不需要處理像異步加載、驗證碼、代理等高階爬蟲技術的爬蟲方法。
  • 新手筆記 | Python爬蟲 Requests庫快速上手 用法整理~
    requests.get(url , params = None, **kwargs)params : URL中的額外參數,字典或字節流格式**kwargs :12個控制訪問的參數(可選項)參數介紹:json:JSON格式的數據,作為Request的內容data:字典、字節序列或文件對象,作為Request的內容headers:字典,HTTP定製頭cookies
  • 網絡爬蟲——Requests,GET和POST
    一、Requests庫簡介Requests模塊是發起http請求最常見的模塊。Requests自稱「http for Humans」,說明使用更簡潔方便。http://2.python-requests.org/zh_CN/latest/安裝方式:pip install requests二、Requests模塊get請求(一)、網絡請求
  • python爬蟲系列(4)- 提取網頁數據(正則表達式、bs4、xpath)
    簡介正則表達式正則表達式是一個特殊的字符序列,它能幫助你方便的檢查一個字符串是否與某種模式匹配。re 模塊使 Python 語言擁有全部的正則表達式功能。 requests.get(url) html = etree.HTML(data.text)title = html.xpath('/html/head/title/text()') print(title)xpath輸出結果.pngpython爬蟲系列(3)- 網頁數據解析(bs4、lxml、Json庫)python
  • 10個Python爬蟲入門實例
    來源:cnblogs.com/h3zh1/p/12548946.html昨天帶夥伴們學習
  • Python爬蟲基礎教學(寫給入門的新手)
    前言剛學完python基礎,想學習爬蟲的新手,這裡有你想要的東西。本文著重點在於教新手如何學習爬蟲,並且會以外行人的思維進行形象地講解。最近我一兄弟想學,我就想寫個教學給他,然後想不如分享到網絡上,給熱愛學習的人們一起學習探討。
  • Python爬蟲入門教程:超級簡單的Python爬蟲教程
    這是一篇詳細介紹 Python 爬蟲入門的教程,從實戰出發,適合初學者。讀者只需在閱讀過程緊跟文章思路,理清相應的實現代碼,30 分鐘即可學會編寫簡單的 Python 爬蟲。爬蟲攻防戰;今天給大家講第一課了解網頁;以中國旅遊網首頁為例,抓取中國旅遊網首頁首條信息(標題和連結),數據以明文的形式出面在源碼中。
  • Python爬蟲入門教程 妹子圖網站爬取
    為了寫好爬蟲,我們需要準備一個火狐瀏覽器,還需要準備抓包工具,抓包工具,我使用的是CentOS自帶的tcpdump,加上wireshark ,這兩款軟體的安裝和使用,建議你還是學習一下,後面我們應該會用到。妹子圖網站---- 網絡請求模塊requestsPython中的大量開源的模塊使得編碼變的特別簡單,我們寫爬蟲第一個要了解的模塊就是requests。
  • Python開發簡單爬蟲【學習資料總結】
    一、簡單爬蟲架構 簡單爬蟲架構 Python的網頁下載器 urllib2 (Python3以後將urllib2替換為urllib.request) requests urllib2 方法1:給定url,使用urllib2模塊的urlopen方法。
  • 【數派學院】網絡爬蟲系列視頻教程:數據獲取,就靠它啦!
    id=217城市數據師,python和R語言愛好者,6年數據分析和數據挖掘實戰經驗,曾在城市數據派中講授《玩轉爬蟲》(上、下)課程,《網絡爬蟲系列》課程,深受派友一致好評,講課耐心、負責、循序漸進,能將生動形象地將RPG遊戲融入到python課堂,come on!老司機開車了,酷炫python技能等你一起來點亮。
  • Python 爬蟲面試題 170 道
    通過本場我分享的這篇文章,你將獲得如下知識點:掌握 Python 的基礎語法語法常見的 Python 應用場景掌握 Python 閉包的使用以及裝飾器的使用59.python 字典和 json 字符串相互轉化方法60.請寫一個 Python 邏輯,計算一個文件中的大寫字母數量61. 請寫一段 Python連接 Mongo 資料庫,然後的查詢代碼。62.說一說 Redis 的基本類型。