爬取必應翻譯

Eloik發表於2020-11-07

踩點

首先進入網站 https://cn.bing.com/translator/

在這裡插入圖片描述

很簡約的一個網站,老樣子,我們首先按F12,進入network,篩選xhr

在這裡插入圖片描述

我們蹲到了一個post請求 https://cn.bing.com/ttranslatev3?isVertical=1&&IG=25FEE7A7C7C14533BBFD66AC5125C49E&IID=translator.5025.1
看一下引數

在這裡插入圖片描述

  • 震驚!居然沒有會變的引數。

程式碼

在這裡插入圖片描述

  • 同樣的我們先去找一下請求頭
import requests
import re

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36',
    'referer': 'https://cn.bing.com/translator/',
    'origin': 'https://cn.bing.com',
    'cookie': 'MUID=096F420F0C72689723B74D660D0869AB; MUIDB=096F420F0C72689723B74D660D0869AB; _EDGE_V=1; SRCHD=AF=NOFORM; SRCHUID=V=2&GUID=4AA515596EB74801BC2212A2B99B705B&dmnchg=1; _SS=SID=118F574600DF62242683583D01F163BB; _TTSS_OUT=hist=WyJhZiIsImVuIl0=; _tarLang=default=en; btstkn=Ri2Gozn6GnnrscD5AGT0ykm4grRxenOXfloAsZnH9PucxJzHT%252Fwai5ui8TOq0QIK; _TTSS_IN=hist=WyJlbiIsImFmIiwiemgtSGFucyIsImF1dG8tZGV0ZWN0Il0=; SNRHOP=I=&TS=; SRCHUSR=DOB=20201106&T=1604735730000; _EDGE_S=F=1&SID=0F0E55C7A96F6A3314845ABCA82C6B51; SRCHHPGUSR=HV=1604735900&WTS=63740332530',
}

url = 'https://cn.bing.com/ttranslatev3?isVertical=1&&IG=25FEE7A7C7C14533BBFD66AC5125C49E&IID=translator.5025.1'

trans = input("請輸入待翻譯文字:")
data = {
    'fromLang': 'auto-detect',
    'text': '%s'%trans,
    'to': 'en'
}
res = requests.post(url,headers=headers,data=data)
print(res.text)

  • 執行結果:

在這裡插入圖片描述

  • 使用正則提取結果:
result = re.search('"text":"(.*?)"',res.text).group(1)
print(result)
  • 新增一個迴圈:
while 1:
    trans = input("請輸入待翻譯文字:")
    if trans == '-1':
        break
    data = {
        'fromLang': 'auto-detect',
        'text': '%s'%trans,
        'to': 'en'
    }

    res = requests.post(url,headers=headers,data=data)
    result = re.search('"text":"(.*?)"',res.text).group(1)
    print(result)
  • 再次執行:

在這裡插入圖片描述

  • 非常棒

一點小探索

https://cn.bing.com/ttranslatev3?isVertical=1&&IG=25FEE7A7C7C14533BBFD66AC5125C49E&IID=translator.5025.1

  • 注意到這個請求url後面的引數,疑似加密的
  • 我們換一個翻譯文字

在這裡插入圖片描述

  • 發現請求url變成了:https://cn.bing.com/ttranslatev3?isVertical=1&&IG=25FEE7A7C7C14533BBFD66AC5125C49E&IID=translator.5025.3
  • 再換一個試試

在這裡插入圖片描述

  • 放一起比較一下:

在這裡插入圖片描述

  • 發現第一次的IID是5025.1,第二次翻譯變成了5025.3,第三次變成了5025.5,可以看出來這個引數是一個計數器,每次翻譯加2
  • 而這三次,前面的IG引數都沒有發生變化,我們重新整理網頁試試

在這裡插入圖片描述

  • 發現IG引數變了,IID引數重置了!
  • 我們再次對比一下:

在這裡插入圖片描述

  • 看來每次重新整理後IG引數會改變,而IID引數重置,只有重新整理後才會改變,那麼我們推測 IG 引數在網頁載入的時候,就唯一確定了。
  • 我們過去搜一下

在這裡插入圖片描述

  • 果然!!重新整理一下試試

在這裡插入圖片描述

  • 發現這個 IG 引數又發生了變化,這也證明了猜測

更好的程式碼

  • 對上面的小探索進行總結,寫出一份更好的程式碼
import requests
import re

# 每次請求 url 的時候,獲取一下 IG 引數
# 整個請求,IG引數不會再發生變化
def getIG():
    header = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36'}
    response = requests.get('https://cn.bing.com/translator/',headers=header)
    ig = re.search(',IG:"(.*?)",',response.text)
    return ig.group(1)


headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36',
    'referer': 'https://cn.bing.com/translator/',
    'origin': 'https://cn.bing.com',
    'cookie': 'MUID=096F420F0C72689723B74D660D0869AB; MUIDB=096F420F0C72689723B74D660D0869AB; _EDGE_V=1; SRCHD=AF=NOFORM; SRCHUID=V=2&GUID=4AA515596EB74801BC2212A2B99B705B&dmnchg=1; _SS=SID=118F574600DF62242683583D01F163BB; _TTSS_OUT=hist=WyJhZiIsImVuIl0=; _tarLang=default=en; btstkn=Ri2Gozn6GnnrscD5AGT0ykm4grRxenOXfloAsZnH9PucxJzHT%252Fwai5ui8TOq0QIK; _TTSS_IN=hist=WyJlbiIsImFmIiwiemgtSGFucyIsImF1dG8tZGV0ZWN0Il0=; SNRHOP=I=&TS=; SRCHUSR=DOB=20201106&T=1604735730000; _EDGE_S=F=1&SID=0F0E55C7A96F6A3314845ABCA82C6B51; SRCHHPGUSR=HV=1604735900&WTS=63740332530',
}

ig = getIG()

# 新增一下計數器,及IID的計數
count = 1

while 1:
    trans = input("請輸入待翻譯文字:")
    if trans == '-1':
        break
    data = {
        'fromLang': 'auto-detect',
        'text': '%s'%trans,
        'to': 'en'
    }
    # 每次獲取翻譯內容,IG引數不變,IID引數每次查詢後加2
    url = 'https://cn.bing.com/ttranslatev3?isVertical=1&&IG=%s&IID=translator.5025.%d'%(ig,count)
    res = requests.post(url,headers=headers,data=data)
    result = re.search('"text":"(.*?)"',res.text).group(1)
    print(result)
    count = count + 2
  • 執行效果

在這裡插入圖片描述

相關文章