python爬蟲爬取有道翻譯教程
編寫環境
為了寶寶們能夠正確讀懂本教程,在正式開始前,寶寶們需要搭建的環境如下:
- 連接互聯網的win10電腦,(win7也可以)
- Google瀏覽器(版本無要求)
- Python(版本3就可以了),如果沒有安裝的小伙伴可以參考python安裝以及版本檢測
- requests庫(版本沒啥要求),沒有安裝的小伙伴可以參考python request庫安裝
需求分析
我們本次要爬取的網頁是:有道翻譯
這時,按下F12鍵,調出Google瀏覽器的開發者工具
現在里面沒有內容,別慌,點擊NetWork選項卡后,再次點擊翻譯按鈕
這時,寶寶們會發現下面多了幾條網絡請求,我們點擊第一個請求
在右邊有三個點的按鈕,可以切換開發者工具的顯示狀態,我們點擊第一個,讓它單獨分出一頁顯示出來,以便于觀察
在Headers選項卡中,可以查看這次請求的URL、headers參數
往下面翻,還有data的參數值
我們點擊Response來查看這次請求的響應,也就是服務器給我們返回的結果,經過和網頁中翻譯內容的比較,可以確定,這個數據就是我們需要爬取的內容.
經過我們的多次改變翻譯內容,比較請求信息,我們可以發現:
在data中有三個數據是加密的變量,其中i為我們輸入要翻譯的字符串,而salt、sign和ts是加密的變值.所以我們猜測這個值是由JavaScript生成的,這里我們可以在頁面中右鍵->查看網頁源代碼
通過Ctrl+F搜索js,找到js文件
通過向下繼續搜索,我們發現了三個以js結尾的文件
依次點擊進入后進行搜索,最終確為
http://shared.ydstatic.com/fanyi/newweb/v1.0.18/scripts/newweb/fanyi.min.js
是進行加密的JavaScript文件
我們將這個JavaScript文件,按下Ctrl+A全選,Ctrl+C進行復制,但是這個代碼是壓縮格式,不利于我們的閱讀
這里小編給給大家提供了一個js格式化的網站在線代碼格式化
粘貼進來后,即可復制格式化好的代碼
下面在PyCharm中新建一個js文件,將格式化好的js代碼粘貼進來,PyCharm的安裝可以參考PyCharm的安裝以及破解
將代碼粘貼進來后,按下Ctrl+F可以在代碼中進行搜索,輸入salt,逐個查看比對
但是通過我們的觀察,瀏覽器中的data參數,版本是2.1
說明我們找的不對,繼續向下搜索,只到查找到version : 2.1,這里的salt即為data中的參數
我們發現salt、sign和ts都的r的屬性,下面我們搜索一下r是如何定義的
通過搜索,我們找到了這里
根據代碼可以看出:
r = "" + (new Date).getTime()
所以ts就是當前的時間戳(這里要注意:JavaScript中的時間是以毫秒為單位的,所以在下面我們生成的時候注意單位的換算)
i = r + parseInt(10 * Math.random(), 10);
salt即為r加上一個在0-10之間的隨機數
sign: n.md5("fanyideskweb" + e + i + "97_3(jkMYg@T[KZQmqjTK")
sign為對兩個字符串加上e和i拼接的md5加密
其中i即為salt
而e經過上面的代碼,我們可以確定為輸入的字符串
到這里我們就將需要的加密字符確定好了
實戰代碼
在PyCharm中新建一個項目,建立一個py文件
在正式寫代碼之前,我們可以在程序前加上
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Created by 秋葉夏風
第一行 指出python解釋器位置,不知道的小伙伴可以參考#!/usr/bin/python 作用
第二行 # -- coding:utf-8 --的意思時指點該程序使用的utf-8編碼,這個utf-8編碼是干啥的呢?可以參考-- coding: utf-8 --的作用
(づ ̄ 3 ̄)づ皮一下,很開心。
第三行不是必須要寫的,可以省略。。。。
導入requests模塊,代碼如下
import requests
將Request URL復制過來
url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
將要翻譯的字符輸入進來
e = input('please input:')
下面構建請求需要的data
首先要構建的是ts,導入python中的時間模塊
import time
生成當前的時間戳
sjc = time.time()
轉換類型和進制
ts = str(int(sjc*1000))
下面構建salt
導入random模塊,
import random
生成隨機數并轉換類型和進制
salt = ts + str(int(random.random()*10))
接下來是構建sign,需要用到python中的hashlib庫來進行md5的加密,代碼如下
導入模塊
import hashlib
拼接字符串
con = "fanyideskweb" + e + salt + "97_3(jkMYg@T[KZQmqjTK"
md5加密
sign = hashlib.md5(con.encode(encoding='UTF-8')).hexdigest()
復制data中的內容
在PyCharm中粘貼后按下Ctrl+R可以進行替換,需要勾選Regex(正則表達式匹配模式)
匹配的正則表達式代碼如下:
^(.*): (.*)'$1':'$2',
匹配好后,將i、salt、sign和ts替換成前面生成的變量
data = {'i': e,'from': 'AUTO','to': 'AUTO','smartresult': 'dict','client': 'fanyideskweb','salt': salt,'sign': sign,'ts': ts,'bv': '9c4fffad2fb69d08cd130e408e0f8108','doctype': 'json','version': '2.1','keyfrom': 'fanyi.web','action': 'FY_BY_REALTlME'
}
構建headers,這里給出了三個必要的參數,不確定的小伙伴可以將請求頭中的Request Headers全部復制過來也行
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36','Referer': 'http://fanyi.youdao.com/','Cookie': 'OUTFOX_SEARCH_USER_ID=-1154806696@10.168.8.76; OUTFOX_SEARCH_USER_ID_NCOO=1227534676.2988937; JSESSIONID=aaa7LDLdy4Wbh9ECJb_Vw; ___rl__test__cookies=1563334957868'
}
發出請求
res = requests.post(url,data=data,headers=header).text
用正則進行匹配翻譯的內容
導入re模塊
import re
開始匹配
rep = re.findall('"tgt":"(.*?)"',res,re.S)[0]
輸出匹配的內容
print(rep)
經過封裝,完整代碼如下
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Created by 秋葉夏風def get_data(e):'''構建data數據函數:param e: 輸入要翻譯的內容:return: 字典類型的data數據'''import timesjc = time.time()ts = str(int(sjc * 1000))import randomsalt = ts + str(int(random.random() * 10))import hashlibcon = "fanyideskweb" + e + salt + "97_3(jkMYg@T[KZQmqjTK"sign = hashlib.md5(con.encode(encoding='UTF-8')).hexdigest()data = {'i': e,'from': 'AUTO','to': 'AUTO','smartresult': 'dict','client': 'fanyideskweb','salt': salt,'sign': sign,'ts': ts,'bv': '9c4fffad2fb69d08cd130e408e0f8108','doctype': 'json','version': '2.1','keyfrom': 'fanyi.web','action': 'FY_BY_REALTlME'}return datadef get_para(e):'''獲取需要的參數:param e: 輸入字符串:return:'''header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/\537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36','Cookie': 'OUTFOX_SEARCH_USER_ID=-1154806696@10.168.8.76; \OUTFOX_SEARCH_USER_ID_NCOO=1227534676.2988937; \JSESSIONID=aaa7LDLdy4Wbh9ECJb_Vw; ___rl__test__cookies=1563334957868','Referer': 'http://fanyi.youdao.com/'}return get_data(e),headerdef search(res):'''用于匹配響應的結果:param res::return:'''import remodel = '"tgt":"(.*?)"'rep = re.findall(model, res, re.S)rep = rep[0]return repdef main():import requestsurl = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'e = input('please input:')data = get_para(e)[0]header = get_para(e)[1]response = requests.post(url,data=data,headers=header).textresult = search(response)print(result)
if __name__ == '__main__':while True:main()