title: python復(fù)習(xí)第14天:靜態(tài)爬蟲之requests
date: 2020-04-05 15:00:24
tags:
- python
- 爬蟲
categories: python復(fù)習(xí)
top: 15
requests模塊詳解
模塊安裝
- 建議新建一個虛擬環(huán)境后再安裝
conda create -n xxxx python=3.8 # 新建一個虛擬環(huán)境,并且指定python版本
conda activate xxxx # 激活該虛擬環(huán)境
- 也可以直接在pycharm中新建一個項目友题,選擇conda虛擬環(huán)境
- pip或者conda安裝新環(huán)境
- 具體安裝方法如下:
conda install requests
pip install requests
get請求
- get請求為http協(xié)議常用請求嗤堰,主要有4部分,請求url,請求頭度宦,請求方法踢匣,請求參數(shù)
- 下面演示下載百度官網(wǎng)
import requests
url = 'https://www.baidu.com' # 請求url
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) \
Chrome/80.0.3987.149 Safari/537.36'
} # 請求頭,從瀏覽器中粘貼過來的
response = requests.get(url, headers=headers) # 將相應(yīng)放到response變量
print(response) # response是一個object戈抄,默認(rèn)打印是狀態(tài)碼
"""
<Response [200]>
"""
- 如果要打印網(wǎng)頁离唬,可以用reponse.text
print(response.text)
response常用屬性與方法
response:默認(rèn)顯示狀態(tài)碼
response.text:顯示文本內(nèi)容,一般為html或者xml時使用
response.content:顯示二進(jìn)制內(nèi)容划鸽,如果是圖片或者不確定編碼方式時使用
response.json():顯示json對象输莺,如果是json格式時使用
response.url:顯示返回的url,一般和原請求網(wǎng)頁一樣裸诽,觸發(fā)有跳轉(zhuǎn)
response.headers:顯示返回頭
response.cookies:顯示cookies
get方法加參數(shù)請求
- 以百度搜索查詢?yōu)槔?/li>
import requests
url = 'https://www.baidu.com/s' # 請求url
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) \
Chrome/80.0.3987.149 Safari/537.36'
} # 請求頭嫂用,從瀏覽器中粘貼過來的
params = {
'ie': 'UTF-8',
'wd': '你好'
} # 加入兩個請求參數(shù),可以直接從url中提取
response = requests.get(url, headers=headers, params=params) # 將相應(yīng)放到response變量
print(response.text)
post請求
- 當(dāng)網(wǎng)頁提交數(shù)據(jù)丈冬,如登錄嘱函,填寫調(diào)查問卷并提交,都是用post請求
- post請求用于提交數(shù)據(jù)到服務(wù)器埂蕊,數(shù)據(jù)庫予以儲存或者相應(yīng)新內(nèi)容
- 以某翻譯網(wǎng)站為例
import requests
url = 'http://fy.iciba.com/ajax.php?a=fy'
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) \
Chrome/80.0.3987.149 Safari/537.36'
} # 請求頭往弓,從瀏覽器中粘貼過來的
data = {
'f': 'auto',
't': 'auto',
'w': 'hello',
}
response = requests.post(url, headers=headers, data=data) # 將相應(yīng)放到response變量
print(response)
print(response.json())
"""
<Response [200]>
{'status': 0, 'content': {'ph_en': "h?'l??", 'ph_am': 'h??lo?', 'ph_en_mp3': '',
'ph_am_mp3': 'http://res.iciba.com/resource/amp3/1/0/5d/41/5d41402abc4b2a76b9719d911017c592.mp3',
'ph_tts_mp3': 'http://res-tts.iciba.com/5/d/4/5d41402abc4b2a76b9719d911017c592.mp3',
'word_mean': ['int. 哈嘍,喂;你好蓄氧,您好;表示問候;打招呼;', 'n. “喂”的招呼聲或問候聲;', 'vi. 喊“喂”;']}}
"""
session會話保持
- http是無狀態(tài)的函似,沒有記憶性,服務(wù)器通過創(chuàng)建session與cookies而達(dá)到記憶功能匀们。sesssion存服務(wù)器缴淋,cookies存用戶瀏覽器
- 如果用戶想要通過爬蟲模擬登錄,訪問泄朴,下載功能重抖,就必須要是同一個會話,也就是必須持有相同的cookies
- 如果需要登錄后才能做很多事情祖灰,那么可以通過requests模塊創(chuàng)建session會話钟沛,這樣就和普通用戶登錄,訪問是一個效果局扶。
- 以模擬登錄人人網(wǎng)為例:
import requests
url = 'http://www.renren.com/PLogin.do'
data = {
'email': 'xxxxxx', # 你的賬號
'password': 'xxxxxxxx', # 你的密碼
'autoLogin': 'true' # 是否自動登錄
}
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)\
Chrome/80.0.3987.149 Safari/537.36'
}
s = requests.session() # 創(chuàng)建session會話
s.post(url, headers=headers, data=data) # post請求模擬登錄
url2 = 'http://www.renren.com/914644077' # 自己提取自己的主頁url
response = s.get(url2, headers=headers) # 嘗試訪問個人主頁
print(response.text) # 打印網(wǎng)頁內(nèi)容恨统,看看有沒有你的用戶名啥的叁扫,最好就是保存到本地看看對比一下
s.close() # 關(guān)閉會話
代理訪問
有時候有些網(wǎng)站必須要用代理才能訪問
或者如果你頻繁用一個ip訪問一個網(wǎng)站,容易被封號
所以用代理可以給你換不同的馬甲畜埋,突破反爬封鎖
下面使用代理訪問百度
import requests
url = 'https://www.baidu.com'
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)\
Chrome/80.0.3987.149 Safari/537.36'
}
proxies = {
'http': '218.75.102.198:8000'
}
response = requests.get(url, proxies=proxies, headers=headers, timeout=20) # 20秒連接不成功就超時退出
print(response)
"""
<Response [200]>
"""
AJAX
- Asynchronous Javascript And XML,即javaScript和xml
- 通常表現(xiàn)為刷網(wǎng)頁的時候莫绣,只顯示一下部分,當(dāng)你往下瀏覽的時候慢慢給你加載新內(nèi)容
- 一般ajax請求比較有規(guī)律悠鞍,請求參數(shù)一般為頁碼或者條數(shù)对室,這樣的話可以通過循環(huán)語句批量生成請求參數(shù),實現(xiàn)全部爬取