做網(wǎng)站銷售水果常用網(wǎng)站推廣方法及資源
文章目錄
- 需求
- 所需第三方庫
- requests
- 實戰(zhàn)教程
- 打開網(wǎng)站
- 抓包
- 添加請求頭等信息
- 發(fā)送請求,解析數(shù)據(jù)
- 修改翻譯內(nèi)容以及實現(xiàn)中英互譯
- 完整代碼
需求
目標網(wǎng)站:
https://fanyi.so.com/#
要求:爬取360翻譯數(shù)據(jù)包,實現(xiàn)翻譯功能
所需第三方庫
requests
簡介
requests 模塊是 python 基于 urllib,采用 Apache2 Licensed 開源協(xié)議的 HTTP 庫。它比 urllib 更加方便,可以節(jié)約我們大量的工作,完全滿足 HTTP 測試需求。
安裝
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy
實戰(zhàn)教程
打開網(wǎng)站
https://fanyi.so.com/#
進入網(wǎng)站之后鼠標右擊檢查
,或者F12
來到控制臺,點擊網(wǎng)絡
,然后刷新
。
抓包
點擊網(wǎng)絡刷新之后,在點擊Fetch/XHR
,隨意輸入一個單詞,點擊翻譯會發(fā)現(xiàn)出現(xiàn)一個數(shù)據(jù)包,這個數(shù)據(jù)包就是我們所需要的。
點擊這個數(shù)據(jù)包,然后點擊標頭
,這里就有我們所需要的請求網(wǎng)址
# 導入requests模塊
import requests# 請求網(wǎng)址
url = 'https://fanyi.so.com/index/search?eng=1&validate=&ignore_trans=0&query=hello'
添加請求頭等信息
一般網(wǎng)站都會設置一定的反爬機制。很多爬蟲向服務器請求數(shù)據(jù),或者爬蟲要請求很多信息時,會給服務器造成很大壓力,嚴重時可能導致服務器宕機,那么,針對爬蟲就會產(chǎn)生對應的反爬機制,比如識別user-agent就是一個初級的反爬機制,當訪問者沒有攜帶user-agent時,網(wǎng)站就會默認訪問者是爬蟲,從而可以拒絕提供信息反饋。
在標頭下面有請求標頭
,把這些全部復制下來就行。
# 獲取請求頭信息
headers = {'Accept': 'application/json, text/plain, */*','Accept-Encoding': 'gzip, deflate, br','Accept-Language': 'zh-CN,zh;q=0.9','Content-Length': '0','Cookie': 'QiHooGUID=F02A63E0BCB72DB4A01C21FA023475E1.1703769301607; Q_UDID=00b0237e-501b-1360-b2eb-96b79d1ac5ec; __guid=144965027.253643186935022000.1703769305042.223; count=2','Origin': 'https://fanyi.so.com','Pro': 'fanyi','Referer': 'https://fanyi.so.com/','Sec-Ch-Ua': '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"','Sec-Ch-Ua-Mobile': '?0','Sec-Ch-Ua-Platform': '"Windows"','Sec-Fetch-Dest': 'empty','Sec-Fetch-Mode': 'cors','Sec-Fetch-Site': 'same-origin','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'
}
發(fā)送請求,解析數(shù)據(jù)
在獲取請求網(wǎng)址那里可以看到,這個數(shù)據(jù)包是POST
請求。也就是說我們需要額外的參數(shù)。點擊載荷
,下面這些就是我們所需要的數(shù)據(jù)。
# post請求所需要的額外參數(shù)(數(shù)據(jù)類型為字典數(shù)據(jù)類型)
data_dic = {'eng': 1,'ignore_trans': 0,'query': 'hello'
}
# 發(fā)送請求,獲取響應
res = requests.post(url, headers=headers, data=data_dic)
解析數(shù)據(jù),打印翻譯內(nèi)容
點擊預覽
可以看到,fanyi就是我們之前輸入的單詞翻譯后的內(nèi)容?,F(xiàn)在只需要通過字典的形式取取值就可以得到翻譯后的內(nèi)容。
data_dic = {'eng': 1,'ignore_trans': 0,'query': 'hello'
}
# 發(fā)送請求,獲取響應
res = requests.post(url, headers=headers, data=data_dic)
# 將響應內(nèi)容轉化成json數(shù)據(jù)類型
data = res.json()
# 打印翻譯內(nèi)容
print(data['data']['fanyi'])
修改翻譯內(nèi)容以及實現(xiàn)中英互譯
從之前載荷里的數(shù)據(jù)可以猜出query
就是我們所輸入的單詞,那么我們直接用input去代替我們所要翻譯的單詞就可以了。
# 改變query的值
word = input('請輸入你要翻譯的內(nèi)容:')
# post請求所需要的額外參數(shù)(數(shù)據(jù)類型為字典數(shù)據(jù)類型)
data_dic = {'eng': 1,'ignore_trans': 0,'query': word
}
# 發(fā)送請求,獲取響應
res = requests.post(url, headers=headers, data=data_dic)
# 將響應內(nèi)容轉化成json數(shù)據(jù)類型
data = res.json()
# 打印翻譯內(nèi)容
print(data['data']['fanyi'])
實現(xiàn)中英互譯
可以看到,目前程序只能實現(xiàn)英譯中,是無法實現(xiàn)中譯英的。
現(xiàn)在我們不妨先試驗一下,用360翻譯實現(xiàn)中譯英,現(xiàn)在我們發(fā)現(xiàn),載荷數(shù)據(jù)第一行eng
在英譯中時的值是1,現(xiàn)在中譯英之后就變成了0,也就說明,是英譯中還是中譯英就取決于這個參數(shù)。所以現(xiàn)在我們只要判斷在程序中輸入的是中文還是英文就行啦。
我們知道,python中UTF-8編碼下,一個英文字符占1個字節(jié),一個中文字符(通常是漢字)占3個字節(jié)。,所以我們只要判斷程序中輸入的第一個字的字節(jié)長度,就可以判斷輸入的是中文還是英文啦。
# 改變query的值
word = input('請輸入你要翻譯的內(nèi)容:')
# 獲取輸入的內(nèi)容是中文還是英文
lenght = len(word[0].encode('utf-8'))
# 判斷,如果輸入的是中文,這翻譯為英文;如果輸入的是英文,這翻譯為中文
if lenght == 3:eng = 0
else:eng = 1
# post請求所需要的額外參數(shù)(數(shù)據(jù)類型為字典數(shù)據(jù)類型)
data_dic = {'eng': eng,'ignore_trans': 0,'query': word
}
# 發(fā)送請求,獲取響應
res = requests.post(url, headers=headers, data=data_dic)
# 將響應內(nèi)容轉化成json數(shù)據(jù)類型
data = res.json()
# 打印翻譯內(nèi)容
print(data['data']['fanyi'])
這樣我們就實現(xiàn)中英互譯啦。當然還可以在原先的基礎上在改進一下,比如可以加一個死循環(huán),實現(xiàn)多次翻譯等等。
完整代碼
# 導入requests模塊
import requests# 獲取360翻譯的翻譯的數(shù)據(jù)包地址
url = 'https://fanyi.so.com/index/search?eng=1&validate=&ignore_trans=0&query=hello'
# 獲取請求頭等偽裝信息
head = {'Accept': 'application/json, text/plain, */*','Accept-Encoding': 'gzip, deflate, br','Accept-Language': 'zh-CN,zh;q=0.9','Content-Length': '0','Cookie': 'QiHooGUID=F02A63E0BCB72DB4A01C21FA023475E1.1703769301607; Q_UDID=00b0237e-501b-1360-b2eb-96b79d1ac5ec; __guid=144965027.253643186935022000.1703769305042.223; count=2','Origin': 'https://fanyi.so.com','Pro': 'fanyi','Referer': 'https://fanyi.so.com/','Sec-Ch-Ua': '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"','Sec-Ch-Ua-Mobile': '?0','Sec-Ch-Ua-Platform': '"Windows"','Sec-Fetch-Dest': 'empty','Sec-Fetch-Mode': 'cors','Sec-Fetch-Site': 'same-origin','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
# 運行之后可以反復翻譯
while 1:# 改變query的值word = input('請輸入你要翻譯的內(nèi)容:')# 獲取輸入的內(nèi)容是中文還是英文lenght = len(word[0].encode('utf-8'))# 判斷,如果輸入的是中文,這翻譯為英文;如果輸入的是英文,這翻譯為中文if lenght == 3:eng = 0else:eng = 1# post請求所需要的額外參數(shù)(數(shù)據(jù)類型為字典數(shù)據(jù)類型)data_dic = {'eng': eng,'ignore_trans': 0,'query': word}# 發(fā)送請求,獲取響應res = requests.post(url, headers=head, data=data_dic)# 將響應內(nèi)容轉化成json數(shù)據(jù)類型data = res.json()# 打印翻譯內(nèi)容print(data['data']['fanyi'])