网页抓取数据小工具-简化数值变量值

笔者出于兴趣或者工作需要,会经常对一些网站的数据进行数据抓取,对于像淘宝、携程、百度这类大型互联网公司的网站,出于安全或者性能考虑,常常会针对网站加入反抓取策略脚本。

在该类脚本中,常见的手法有以下几种:

1. 针对简单数值变量的值,会把它用一个数值表达式来表示,让你没办法一眼看穿它,如:_lkqr = - ((104 | 3525868) % 705192)

2. 把一个简单的数值,用手法1中两个变量进行运算,得到真正数值。如: _set = _lkqr + _lnz

3. 提供一个字符串转换函数,让你无法理解它给你的字符串的真正涵义。

4. 加入一些适当的废代码,让你很难抓住真正的逻辑

5. 把Js调用的方式,采用数组方式来调用。如window.document会写成window[‘document‘]

6. 其他。。。

在这篇文章中,我主要是想针对问题1做了一个简单的小程序,化复杂表达式为简单数值,提高分析效率。

 1             ExprEvalUtil expUtil = new ExprEvalUtil();
 2             Regex regex = new Regex(@"\({1,}((0x[0-9a-f]+)|(\d+))(\s*[\+\-\*\/\%\|\&\^\>\<]{1,2}\s*\(*[ \t]*((0x[0-9a-f]+)|(\d+))\s*\)*)+", RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | RegexOptions.Compiled);
 3             String jsContent = null;
 4             FileStream fs = new FileStream("d:\\somejs.js", FileMode.Open);
 5             using (TextReader reader = new StreamReader(fs))
 6             {
 7                 jsContent = reader.ReadToEnd();
 8             }
 9
10             string result = regex.Replace(jsContent, m =>
11             {
12                 string value = m.Value;
13                 int lkValue = 0;
14                 int index = -1;
15                 while ((index = value.IndexOf(‘(‘, index + 1)) != -1)
16                 {
17                     lkValue++;
18                 }
19
20                 int rkValue = 0;
21                 //index = 0;
22                 while ((index = value.IndexOf(‘)‘, index + 1)) != -1)
23                 {
24                     rkValue++;
25                 }
26
27                 String preStr = "";
28                 if (rkValue < lkValue)
29                 {
30                     value = value.Remove(0, lkValue - rkValue);
31                     preStr = new String(‘(‘, lkValue - rkValue);
32                 }
33
34                 String postStr = "";
35                 if (rkValue > lkValue)
36                 {
37                     value = value.Remove(value.Length - rkValue + lkValue);
38                     postStr = new String(‘)‘, rkValue - lkValue);
39                 }
40
41                 try
42                 {
43                    value = expUtil.Eval(value).ToString();
44                 }
45                 catch (Exception ex)
46                 {
47                     return m.Value;
48                 }
49
50                 return preStr + value + postStr;
51             });
52
53             Console.WriteLine(result);

其中的ExpEvalUtil代码,我利用了网上的一个Javascript解释器(Jussica)引擎实现,代码如下:

    public class ExprEvalUtil
    {
        private ScriptEngine engine = new ScriptEngine();

        public int Eval(string expr)
        {
            return (int)Convert.ChangeType(engine.Evaluate(expr), typeof(int));
        }
    }

通过上述代码进行一个处理后,你是不是觉得有点眼前一新的感觉了?

笔者实际上对后面几个问题解决,也有了新的思路,欢迎更多同学加入探讨

时间: 2024-10-10 18:45:38

网页抓取数据小工具-简化数值变量值的相关文章

从网页抓取数据的一般方法

首先要了解对方网页的执行机制 ,这能够用httpwacth或者httplook来看一下http发送和接收的数据.这两个工具应该说是比較简单易懂的.这里就不再介绍了.主要关注的内容是header和post的内容.通常会包括cookie,Referer页面和其它一些乱其八糟可能看不懂的变量,还有就是正常交互的參数,比方须要post或者get的querystring所包括的东西. httplook和httpwacth 网上有非常多下载的,这里推荐使用httpwach,由于能够直接嵌入到ie中,个人认为

ASP.NET网页抓取数据

我的数据通过一个TextBox输入,这些代码是写在一个button的点击事件里的. 网页数据抓取大概分为两步,第一步是获取网页源代码: 具体注释如下: var currentUrl = TextBox1.Text;//获得要抓取的网页的URL地址         var request = WebRequest.Create(currentUrl) as HttpWebRequest;//请求对象        var response=request.GetResponse()as HttpW

网页抓取小工具(IE法)

网页抓取小工具(IE法)-- 吴姐 http://club.excelhome.net/thread-1095707-1-1.html 用IE提取网页资料的好处在于:所见即所得,网页上能看到的信息一般都能获取. 本工具功能不多,主要是便于提取网页上展示的信息所在元素的代码.希望能对大家有点小帮助. 网页抓取小工具.rar (22.91 KB, 下载次数: 2426) 本工具使用方法: 1.在B1内输入网址,可以是已打开的网页,也可以是未打开的 2.A2和B2的内容不要更改,第二行的其他单元格可以

java抓取网页数据,登录之后抓取数据。

最近做了一个从网络上抓取数据的一个小程序.主要关于信贷方面,收集的一些黑名单网站,从该网站上抓取到自己系统中. 也找了一些资料,觉得没有一个很好的,全面的例子.因此在这里做个笔记提醒自己. 首先需要一个jsoup的jar包,我用的1.6.0..下载地址为:http://pan.baidu.com/s/1mgqOuHa 1,获取网页内容(核心代码,技术有限没封装). 2,登录之后抓取网页数据(如何在请求中携带cookie). 3,获取网站的ajax请求方法(返回json). 以上这三点我就用一个类

PHP的cURL库:抓取网页,POST数据及其他,HTTP认证 抓取数据

From : http://developer.51cto.com/art/200904/121739.htm 下面是一个小例程: ﹤?php// 初始化一个 cURL 对象$curl = curl_init(); // 设置你需要抓取的URLcurl_setopt($curl, CURLOPT_URL, 'http://cocre.com'); // 设置headercurl_setopt($curl, CURLOPT_HEADER, 1); // 设置cURL 参数,要求结果保存到字符串中还

网页中抓取数据

下面写个例子,实现从网页中抓取数据. 这个例子中,只是从网页中获取了数据,但是没有进行任何处理,只是将数据保存到一个txt文件中. 该例子是在android工程中写的. package com.example.creepertest; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.I

node.js抓取数据(fake小爬虫)

在node.js中,有了 cheerio 模块.request 模块,抓取特定URL页面的数据已经非常方便. 一个简单的就如下 var request = require('request'); var cheerio = require('cheerio'); request(url,function(err,res){ if(err) return console.log(err); var $ = cheerio.load(res.body.toString()); //解析页面内容 })

htmlparser实现从网页上抓取数据

package parser; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.

基于Casperjs的网页抓取技术【抓取豆瓣信息网络爬虫实战示例】

CasperJS is a navigation scripting & testing utility for the PhantomJS (WebKit) and SlimerJS (Gecko) headless browsers, written in Javascript. PhantomJS是基于WebKit内核的headless browser SlimerJS则是基于Gecko内核的headless browser Headless browser: 无界面显示的浏览器,可以用于