网抓重要就是要了解,浏览器以那种方式向服务器请求数据(post或者get常用方式)和向服务器发送了什么请求,这请求包括:头文件,请求类型,请求目标数据等等!本编文章以有道翻译为例!此教程仅做大家学习交流!
请求包数据查找技巧交流:
4.随意输入一个汉字,我们会在网络里面看到,翻译后有三条数据请求,我们一一点开看看;
5.在第一条http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule 请求的response里面就看到了我们想要的数据!第二第三条均返回空!
6.找到有用请求后,我们再返回到请求连接里面,会发现他的请求方式是post,和相关请求数据!
7.请求头见图
8.再看一下最重要的请求数据,POSTDATA
8.1 请求数据简单解析,多请求几次我们可以发现只有4个参数会发生变化.这也是我们接下要找的4个重要参数.
8.2我们先来找sign参数,通过sign参数我们可以很容易发现其他3个参数是跟sign连在一起的!
8.2.1 这些参数要在哪里找呢?我们去在开发者工具里面找到sources选项里面,然后按ctrl+shift+f进行全局查找sign,发现他是在fanyi.min.js里面,我们打开它,然后在ctrl+f 进行查找
8.2.2.很快我们就查找到,sign: n.md5("fanyideskweb" + e + i + "n%A-rKaT5fb[Gy?;N5@Tj") 这一段,然后我们在8336哪里直接打断!
function(e) {
var t = n.md5(navigator.appVersion)
, r = "" + (new Date).getTime()
, i = r + parseInt(10 * Math.random(), 10);
return {
ts: r,
bv: t,
salt: i,
sign: n.md5("fanyideskweb" + e + i + "n%A-rKaT5fb[Gy?;N5@Tj")
}
8.2.3.然后我们再输入一个文字进行翻译,很快就跳到断点处,我们就可以,看到相应的变量代表的是什么值!
9. 接下的事情就是相应的参数,解析和解密了
VB.NET 源码部分
这里的MD5加密使用了JSMD5库,VB.NET自带的MD5没加密成功,有人研究成功的请赐教一二!
代码比较简单就直接贴上了,代码有简单的注释!
Imports System.IO
Imports System.Net
Imports System.Text
Imports System.Web
Public Class Form1
''翻译网址
Private Const YDURL As String = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Debug.Print(Get_youdaoxx(GET_STR(TextBox1.Text)))
Dim res As String = PostData(YDURL, Get_youdaoxx(GET_STR(TextBox1.Text)))
Dim jstr As String = GET_JSONDATA(res)
TextBox2.Text = jstr
End Sub
''' <summary>
''' 解析翻译结果
''' </summary>
''' <param name="sttr"></param>
''' <returns></returns>
Public Function GET_JSONDATA(ByVal sttr As String) As String
Try
Dim js As Object
js = CreateObject("ScriptControl")
js.Language = "JScript"
js.AddCode("var json=" & sttr & ";var jss = eval(json);var al= jss.translateResult[0].length;var strr='';for (var i=0;i<al;i++){ strr=strr+jss.translateResult[0][i].tgt;}")
js.State = 1
js.allowui = True
Return js.eval("strr")
Catch ex As Exception
Return "json数据解析失败"
End Try
End Function
''' <summary>
''' 字符串处理
''' </summary>
''' <param name="ST"></param>
''' <returns></returns>
Function GET_STR(ByVal ST As String) As String
On Error Resume Next
Dim TMP As String = ""
TMP &= Replace(Replace(Replace(ST, vbCrLf, ""), vbCr, ""), vbLf, "")
Return TMP
End Function
''' <summary>
''' 获取post数据
''' </summary>
''' <param name="str"></param>
''' <returns></returns>
Function Get_youdaoxx(ByVal str As String) As String
On Error Resume Next
Dim MD As New JsMd5
Dim bv As String = MD.md5("5.0 (Windows)")
Dim ts As String = GetTimeStamp()
Dim salt As String = GetTimeStamp() & "1"
Dim sign As String = MD.md5("fanyideskweb" & str & salt & "n%A-rKaT5fb[Gy?;N5@Tj")
Dim t_str As String = HttpUtility.UrlEncode(str, Encoding.GetEncoding("utf-8")) '.ToUpper
Return "i=" & t_str & "&from=" & ComboBox1.Text.ToString.Split("|")(1) & "&to=" & ComboBox2.Text.ToString.Split("|")(1) & "&smartresult=dict&client=fanyideskweb&salt=" & salt & "&sign=" & sign & "&ts=" & ts & "&bv=" & bv & "&doctype=json&version=2.1&keyfrom=fanyi.web&action=FY_BY_REALTlME"
End Function
''' <summary>
''' 获取时间截
''' </summary>
''' <param name="bflag"></param>
''' <returns></returns>
Function GetTimeStamp(Optional bflag = False) As String
On Error Resume Next
Dim span As TimeSpan = Date.UtcNow - New DateTime(1970, 1, 1, 0, 0, 0, 0)
Dim ret As String
If bflag Then
ret = Convert.ToInt64(span.TotalSeconds).ToString()
Else
ret = Convert.ToInt64(span.TotalMilliseconds).ToString()
End If
Return ret
End Function
''' <summary>
''' POST请求翻译结果
''' </summary>
''' <param name="url"></param>
''' <param name="data"></param>
''' <returns></returns>
Function PostData(ByVal url As String, ByVal data As String) As String
On Error Resume Next
Dim request As HttpWebRequest = WebRequest.Create(url)
request.Method = "POST"
request.Host = "fanyi.youdao.com"
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0"
request.Accept = "application/json, text/javascript, */*; q=0.01"
request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"
request.Referer = "http://fanyi.youdao.com/"
request.Headers.Set("Cookie", "td_cookie=3685168649; YOUDAO_MOBILE_ACCESS_TYPE=1; OUTFOX_SEARCH_USER_ID=66319307@10.169.0.84; OUTFOX_SEARCH_USER_ID_NCOO=189249582.97468826; JSESSIONID=aaauLcGg98nVZ4ETKmQ2w; ___rl__test__cookies=" & GetTimeStamp())
Dim encoding As New UTF8Encoding()
Dim bys As Byte() = encoding.GetBytes(data)
request.ContentLength = bys.Length
Dim newStream As Stream = request.GetRequestStream()
newStream.Write(bys, 0, bys.Length)
newStream.Close()
Dim sr As StreamReader = New StreamReader(request.GetResponse().GetResponseStream)
Return sr.ReadToEnd
End Function
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
MaximizeBox = False
End Sub
End Class
<左右滑动查看完整代码>
相关实例下载
https://www.lanzous.com/i6ok5af
好啦!今天教程到此结束啦!