我們在今后的爬蟲學習過程中,要爬許許多多的網站。
唯有掌握如何對不同網站尋找到正確的post地址,才是任務之重。
比如,我訪問了一個別的網站,這兒用人人網做例子。
在人人網登陸界面,使用F12進入開發者模式,找到整個登陸界面的源碼:
所以,我們可以看到關鍵的登錄模塊源碼有一個關鍵的參數,這個參數是action,存儲登陸的url地址。
action="http://www.renren.com/Plogin.do"
尋找登陸的post地址:
在form表單中尋找action對應的url地址,post的數據是input標簽中的name的值作為鍵,真正的用戶名密碼作為值的字典。post的url地址就是action對應的url地址。
尋找post的數據,結合定位js:
1.在開發者模式中,選擇會觸發js時間的按鈕,點擊event listener,找到js的位置。
2.通過chrome中的search all file來搜索url中的關鍵字。
3.抓包,尋找登陸的url,反復調試對比,確定不會變的參數。
那么,我們來優化使用post參數請求百度翻譯的代碼:
我們要養成一個好的習慣,在敲代碼之前,我們要打出代碼的草稿如下:
import requests
class BaiduFanyi:
def __init__(self): # 1.1 准備post的url地址,post_data
pass
def parse_url(self): # 1.2 發送post的數據,獲取響應
pass
def get_ret(self): # 4.提取翻譯的結果
pass
def run(self): # 實現主要邏輯
pass
# 1.獲取語言類型
# 1.1 准備post的url地址,post_data
# 1.2 發送post的數據,獲取響應
# 1.3 提取語言類型
# 2.准備post的數據
# 3.發送請求,獲取響應
# 4.提取翻譯的結果
if __name__ == "__main__":
baidu_fanyi = BaiduFanyi()
baidu_fanyi.run()
我們需要花很長時間想好主要邏輯,然后打上草稿,之后我們就可以一一詳細化,完成最終的代碼。
import requests
import json
class BaiduFanyi:
def __init__(self, trans_str): # 1.1 准備post的url地址,post_data
self.trans_str = trans_str
self.lang_detect_url = "https://fanyi.baidu.com/langdetect"
self.headers = {
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1"
}
self.trans_url = "https://fanyi.baidu.com/basetrans"
def parse_url(self, url, data): # 1.2 發送post的數據,獲取響應
response = requests.post(url, data=data, headers=self.headers)
return json.loads(response.content.decode())
def get_ret(self, dict_respsonse): # 4.提取翻譯的結果
ret = dict_respsonse["trans"][0]["dst"]
print("翻譯的結果是:", ret)
def run(self): # 實現主要邏輯
# 1.獲取語言類型
# 1.1 准備post的url地址,post_data
lang_detect_data = {"query": self.trans_str}
# 1.2 發送post的數據,獲取響應
lang = self.parse_url(self.lang_detect_url, lang_detect_data)["lan"]
# 1.3 提取語言類型
# 在網頁源碼中查看langdetect的response數據,在1.2末尾處加上一個“lan”
# 2.准備post的數據
trans_data = {"query": self.trans_str, "from": "zh", "to": "en"} if lang == "zh" else \
{"query": self.trans_str, "from": "en", "to": "zh"}
# 3.發送請求,獲取響應
dict_respsonse = self.parse_url(self.trans_url, trans_data)
# 4.提取翻譯的結果
self.get_ret(dict_respsonse)
if __name__ == "__main__":
baidu_fanyi = BaiduFanyi("大家好哦")
baidu_fanyi.run()
輸出結果:
翻譯的結果是: Hello everyone!
這段代碼對比之前的代碼,得到的優化有:
①可以指定翻譯的初始語言和目標語言。
②實現的翻譯功能更加迅速。