爬蟲教程---第二章:requests的使用

第二章:requests庫使用

urllib庫 雖然蠻強大的,但是還有很多比較麻煩的地方,比如上一章的實現中,需要把post請求的參數進行編碼纔可以發送到服務器,還有當我們需要使用到cookie以及其他東西時需要藉助一些東西纔可以實現。

requests庫呢,就像個媽媽一樣,漂亮的衣服都幫我們織好了,我們需要穿到的時候叫一聲媽,就可以穿上好看的衣服。

如果需要使用requests庫,需要先安裝pip install requests

tips: 以後很多庫使用pip下載都很方便,另外也可以在pycharmProject Interpreter 那裏搜索安裝。

2.1發送GET請求

import requests

# 獲取response對象
res = requests.get("http://www.baidu.com")

print(res.text)  # 查看響應內容(已解碼)
print(res.content)  # 查看響應內容(未解碼)
print(res.encoding)  # 查看編碼
print(res.status_code)  # 查看響應狀態碼

res.text 是以request猜測的編碼形式解的碼,就是說他猜的有時候是不對,這種情況就會產生亂碼了。
在這裏插入圖片描述

既然如此,我們可以指定編碼,然後讓request按照我們指定的編碼進行解碼。

import requests

res = requests.get("http://www.baidu.com")
# 指定response對象的編碼爲utf-8
res.encoding = 'utf-8'
print(res.text)

接下來看看如何傳遞傳遞參數跟設置請求頭

import requests

# 設置get請求的參數
params = {"wd": "python"}
# 設置請求頭
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                         'AppleWebKit/537.36 (KHTML, like Gecko) '
                         'Chrome/82.0.4077.0 Safari/537.36'
           }

res = requests.get("http://www.baidu.com",params=params,headers=headers)

print(r.url)  # 查看url,參數成功傳遞

看到這裏,對比一下urllib庫requests庫,是不是後者更方便一些。後者如果使用get請求,直接requests.get的形式就可以了,要加什麼參數也直接加上去就行了。當然了,其他請求方式也是類似,比如下一節的post。

2.2 發送POST請求

接下來用requestsPOST 請求來進行登錄一下吧。下面演示的網址跟data都需要跟我的一樣,這裏只是爲了演示post請求的用法。

import requests
url = 'http://47.115.46.57:8989/api/users/login'

# 設置請求參數
data = {
    "phone": "123456",
    "password": "123456",
}
# 設置POST請求,且設置POST請求的參數
res = requests.post(url, data=data)

print(res.text)
# print(res.json())  # 獲取json格式的數據

如果返回 {"status":400} 就說明請求成功啦!

由於返回的是json格式的數據,所以可以使用**res.json()** 來代替 res.text

tips:

  • get請求若需要傳遞參數則使用 params
  • post請求若需要傳遞參數則使用的是 data

2.3 使用代理

前面有提到過一個爬蟲,在對一些反爬蟲比較厲害的網站來說,做一些僞裝是必要的,那這節要介紹代理也是僞裝的一部分。

那什麼是代理呢?

比如有個“辦事處”(你發送請求的網站)可以查詢到你想要的信息,但是每次進出都要出示身份證。此時你很急切的想要去辦事處獲取一些信息,於是你每分鐘去一次去 “辦事處” ,那麼此時“辦事處” 的工作人員就不耐煩了,每分鐘來一次這不是搗亂嗎,於是這個工作人員就跟門口的警衛說:“今天別再讓身份證爲xxx的SB進來了”。下一分鐘你再倒回去的時候警衛就可能跟你說:“工作人員有事出去了,你下次再來吧”,此時明顯知道,這是在忽悠你的,但是你又無能爲力。嘿嘿,可氣吧。

這時你靈機一動,在附近找了託,讓他幫你查詢你想要獲取的信息,當然,有些託比較好心,不收你錢,但是這類託比較容易忘記了,或者比較慢去幫你查詢信息。還有一類託呢,就是專門收錢然後幫忙去獲取消息的。

那麼這裏說的託就是IP代理啦。

IP代理可以在網上找,有免費的也有收費的,這裏我推薦一個我自己爬蟲的時候偶爾會使用的一些代理:

  • 快代理:免費的,但是不穩定,速度慢
  • 芝麻代理:每天可以獲取10條IP地址。前提是要註冊登錄

接下來就看看如何使用代理吧。

使用前介紹一個網站:http://www.httpbin.org/ip,此網站可以返回你的IP地址的信息

import requests

proxy = {'http': '112.114.131.183:38387'}
# 設置IP代理
rp = requests.get("http://www.httpbin.org/ip",proxies=proxy)

print(rp.text)

執行上面代碼後,我這裏顯示的是{"origin": "112.114.131.183"}

此時你就知道怎麼換IP代理了。

2.4 cookie和session

這裏先介紹一下requests庫裏面的session 對象,這裏的session 是不同於前端所說的session的,requests庫裏面的session 對象僅僅是一個會話的意思,即本次所有的請求都處於同一會話當中,在同一會話中的所有的數據都可以共享

比如會話可以保存你登錄的信息,以致於你訪問網站的其他頁面時可以直接訪問。

使用session發起請求跟之前的請求方式有點不同。這裏演示一下

import requests

url = "http://www.renren.com/Login.do"

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                         'AppleWebKit/537.36 (KHTML, like Gecko) '
                         'Chrome/82.0.4077.0 Safari/537.36'
           }

data = {"email":"填你的賬號","password":"填你的密碼"}
# 創建session對象
session = requests.Session()
# 利用session對象發起登錄請求
session.post(url,data=data,headers=header)
# 跳轉到個人主頁
response = session.get('http://www.renren.com/974589261/profile')
# 將個人主頁的頁面寫到本地
with open('renren.html','w',encoding='utf-8') as fp:
    fp.write(response.text)

此時你會看到,當前項目文件夾下多了個 renren.html 用瀏覽器打開它,如果你登錄是成功的,那麼會顯示你的個人信息的頁面。
在這裏插入圖片描述

2.5 小實戰

這節我們來爬取拉鉤網的招聘列表信息。

import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                  'AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/82.0.4077.0 Safari/537.36',
    "referer": "https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput="
}

url = 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput='

# 創建session對象
session = requests.Session()
s1 = session.get(url, headers=headers)

data = {
    "first": "false",
    "pn": 2,
    "kd": "python"
}

url2 = 'https://www.lagou.com/jobs/positionAjax.json?city=%E5%B9%BF%E5%B7%9E&needAddtionalResult=false'
s2 = session.post(url2, headers=headers, data=data)
# 返回的數據是json類型
msg = s2.json()
# 直接輸出響應信息
print(msg)
# 輸出響應信息的content內容
# 分析了msg之後你就會發現,招聘單位的內容都放在這裏面
print(msg['content']['hrInfoMap'])

到了這一步基本就差不多啦,如果還想要更好的信息,可以再進一步對json數據進行解刨。

比如加上如下代碼:

for id in msg['content']['hrInfoMap']:
    print("負責人編號:", msg['content']['hrInfoMap'][id]['userId'])
    print("負責人姓名:",msg['content']['hrInfoMap'][id]['realName'])
    print("負責人崗位:",msg['content']['hrInfoMap'][id]['positionName'])

如今的拉鉤網反爬蟲機制越來越強了,可能是因爲幾乎每一個爬蟲案例都會對它下手的原因吧。你如果分析了Data參數,你會發現他那裏還有個sid,那爲什麼我這裏的data沒有加上呢?因爲這個sid每次請求都會不一樣,所以我猜這個sid 是每次會話請求所需要使用的一個類似於驗證的東西,所以我使用了session,結果真的可以忽略此參數,可見,session在某些時候可以幫我們極大的簡化爬蟲操作。

當然了,這只是很初略的一個小爬蟲案例,你完全可以根據需要自己改寫,比如根據自己的輸入崗位、城市等來獲取相應的職位信息,而且這只是一頁的數據,你可以寫個for循環來爬取多頁。等等一系列操作。


小結語:
小夥伴呢可以自己多動手試試,在嘗試的路上可能會有很多的坎坷但這一切都是值得的,所謂的大神就是比我們多走了許許多多的坎坷。前兩天看尹成大神的直播,他說的話讓我感觸很深,“每個人都想要得到大廠的offer,你也不例外,可是你憑什麼可以拿到這個offer,你有什麼是其他人無法做到的地方嗎?”

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章