c#中如何执行javascript,执行爬取指定网页

newpowersky 2017-09-10 02:02:24
我用程序访问 指定网页,得到如下的html返回,大意是设置cook -test跳转指定页面。
<script type="text/javascript" src="http://newpowersky.ohday.cn/aes.js" ></script>
<script>
function toNumbers(d) {
var e = [];
d.replace(/(..)/g,
function(d) {
e.push(parseInt(d, 16))
});
return e
}
function toHex() {
for (var d = [], d = 1 == arguments.length && arguments[0].constructor == Array ? arguments[0] : arguments, e = "", f = 0; f < d.length; f++) e += (16 > d[f] ? "0": "") + d[f].toString(16);
return e.toLowerCase()
}
var a = toNumbers("f655ba9d09a112d4968c63579db590b4"),
b = toNumbers("98344c2eee86c3994890592585b49f80"),
c = toNumbers("e4c62ce17c9e3eff9de80186313b5a9c");
document.cookie = "__test=" + toHex(slowAES.decrypt(c, 2, a, b)) + "; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/";
var i=1;<!-- location.href = "http://newpower.ohday.cn/?i=1"; -->
</script>

我如何在c#中模拟出来呢?(我用了jav)slowAES这个函数还是在网站上加载的。我要如何才可以得到cook呢?我在浏览器中执行这个javascript,得到 的"__test=" 为空。不明白是为什么?我应该如何做呢?
...全文
943 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
橘子皮... 2017-09-13
  • 打赏
  • 举报
回复
这有什么难的呢,你就用JS算出cookie值加进cookie里去get不就完了么
newpowersky 2017-09-13
  • 打赏
  • 举报
回复
[quote=引用 10 楼 closurer 的回复:] 你面对的情况其实比较复杂,因为 V8 里面是没有 window、document、location 这些文档的内建对象的。如果你执行的脚本使用了这些对象,就会出错。 如果你的需求不值得花太多时间去做,建议你还是用一个 Headless Browser[/quot] 其实我就是要模拟计算出一个__test的cook值。我再把这个值传给httphelper。也用不上windows.documetn.这些吧。 你的意思是建议用PhantomJS。应该用这个的话可以取得到。只不过我想学习下脚本怎么用?谢谢大神
闭包客 2017-09-13
  • 打赏
  • 举报
回复
Selenium、PhantomJS 这种 Headless Browser 的方案是现在比较流行的爬虫方案之一,兼容性高,可以抓取大部分网页,但是速度慢。 自己调用脚本引擎的方式比较少人做,虽然速度快,但是难度大,如果兼容性做得高,其实已经在业界有技术领先优势。一般适合抓取特定的网页。
闭包客 2017-09-13
  • 打赏
  • 举报
回复
你面对的情况其实比较复杂,因为 V8 里面是没有 window、document、location 这些文档的内建对象的。如果你执行的脚本使用了这些对象,就会出错。 如果你的需求不值得花太多时间去做,建议你还是用一个 Headless Browser
闭包客 2017-09-13
  • 打赏
  • 举报
回复
引用 8 楼 newpowersky 的回复:
[quote=引用 7 楼 closurer 的回复:] [quote=引用 4 楼 newpowersky 的回复:] [quote=引用 1 楼 closurer 的回复:] 你得使用一个 javascript 引擎。
有介绍的引擎吗?例子之类 的有吗?想试试[/quote] 我以前是自己编译的 V8,现在看到 NuGet 上有了: https://www.nuget.org/packages/ClearScript.V8/ [/quote] 大神我在https://clearscript.codeplex.com/这看了例子,但是例子里没有<script type="text/javascript" src="http://newpowersky.ohday.cn/aes.js" ></script>这种 的执行啊,我必须要先加载这个。slowAES.decrypt(c, 2, a, b))这个函数是这个aes.js里面的。 是不是我要从aes.js里面把这个函数的代码取出来,然后再engine.Execute???? [/quote] 在浏览器中,标签的解析和请求的发出不是由脚本引擎做的,所以 V8 自然没有这个功能。 在你这个例子中,你需要下载这个文件,交给 V8 去执行。
newpowersky 2017-09-13
  • 打赏
  • 举报
回复
引用 7 楼 closurer 的回复:
[quote=引用 4 楼 newpowersky 的回复:] [quote=引用 1 楼 closurer 的回复:] 你得使用一个 javascript 引擎。
有介绍的引擎吗?例子之类 的有吗?想试试[/quote] 我以前是自己编译的 V8,现在看到 NuGet 上有了: https://www.nuget.org/packages/ClearScript.V8/ [/quote] 大神我在https://clearscript.codeplex.com/这看了例子,但是例子里没有<script type="text/javascript" src="http://newpowersky.ohday.cn/aes.js" ></script>这种 的执行啊,我必须要先加载这个。slowAES.decrypt(c, 2, a, b))这个函数是这个aes.js里面的。 是不是我要从aes.js里面把这个函数的代码取出来,然后再engine.Execute????
闭包客 2017-09-13
  • 打赏
  • 举报
回复
引用 4 楼 newpowersky 的回复:
[quote=引用 1 楼 closurer 的回复:] 你得使用一个 javascript 引擎。
有介绍的引擎吗?例子之类 的有吗?想试试[/quote] 我以前是自己编译的 V8,现在看到 NuGet 上有了: https://www.nuget.org/packages/ClearScript.V8/
newpowersky 2017-09-13
  • 打赏
  • 举报
回复
引用 3 楼 wzk64657534 的回复:
[quote=引用 楼主 newpowersky 的回复:] 我用程序访问 指定网页,得到如下的html返回,大意是设置cook -test跳转指定页面。
<script type="text/javascript" src="http://newpowersky.ohday.cn/aes.js" ></script>
<script>
function toNumbers(d) {
    var e = [];
    d.replace(/(..)/g,
    function(d) {
        e.push(parseInt(d, 16))
    });
    return e
}
function toHex() {
    for (var d = [], d = 1 == arguments.length && arguments[0].constructor == Array ? arguments[0] : arguments, e = "", f = 0; f < d.length; f++) e += (16 > d[f] ? "0": "") + d[f].toString(16);
    return e.toLowerCase()
}
var a = toNumbers("f655ba9d09a112d4968c63579db590b4"),
b = toNumbers("98344c2eee86c3994890592585b49f80"),
c = toNumbers("e4c62ce17c9e3eff9de80186313b5a9c");
document.cookie = "__test=" + toHex(slowAES.decrypt(c, 2, a, b)) + "; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/";
var i=1;<!-- location.href = "http://newpower.ohday.cn/?i=1";  -->
</script>
我如何在c#中模拟出来呢?(我用了jav)slowAES这个函数还是在网站上加载的。我要如何才可以得到cook呢?我在浏览器中执行这个javascript,得到 的"__test=" 为空。不明白是为什么?我应该如何做呢?
用jquery的选择器就可以了,已经知道要什么了,只要写针对的代码就可以了[/quote] 命令行程序怎么用jquery的选择器,求讲解。
newpowersky 2017-09-13
  • 打赏
  • 举报
回复
引用 2 楼 sx_lxh 的回复:
C# HttpWebRequest获取COOKIES byte[] bytes = Encoding.Default.GetBytes(_post); CookieContainer myCookieContainer = new CookieContainer(); try { //新建一个CookieContainer HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(_loginurl); //新建一个HttpWebRequest myHttpWebRequest.ContentType = "application/x-www-form-urlencoded"; myHttpWebRequest.AllowAutoRedirect = false; myHttpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"; myHttpWebRequest.Timeout = 60000; myHttpWebRequest.KeepAlive = true; myHttpWebRequest.ContentLength = bytes.Length; myHttpWebRequest.Method = "POST"; myHttpWebRequest.CookieContainer = myCookieContainer; //设置HttpWebRequest Stream myRequestStream = myHttpWebRequest.GetRequestStream(); myRequestStream.Write(bytes, 0, bytes.Length); myRequestStream.Close(); HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse(); foreach (Cookie ck in myHttpWebResponse.Cookies) { myCookieContainer.Add(ck); } myHttpWebResponse.Close(); } catch { MessageBox.show("获取COOKIES失败!"); return; }
大神我那个网站是直接get的。我用了httphelper后得到了上面的javascript..这个方法应该不行吧
newpowersky 2017-09-13
  • 打赏
  • 举报
回复
引用 1 楼 closurer 的回复:
你得使用一个 javascript 引擎。
有介绍的引擎吗?例子之类 的有吗?想试试
newpowersky 2017-09-13
  • 打赏
  • 举报
回复
引用 15 楼 closurer 的回复:
[quote=引用 13 楼 wowfiowow 的回复:] 这有什么难的呢,你就用JS算出cookie值加进cookie里去get不就完了么
如果是一般的脚本不难的,难的是做图灵测试的脚本。图灵的脚本很鸡贼,会在你的文档里面生成元素,检查是否被正确解析,还可以通过一些 offset 属性检查是否被正确排版。 [/quote] 我访问的这个网站应该没有这么高级!!
newpowersky 2017-09-13
  • 打赏
  • 举报
回复
引用 13 楼 wowfiowow 的回复:
这有什么难的呢,你就用JS算出cookie值加进cookie里去get不就完了么
就是不知道怎么算啊。他那slowace又看不明白。
闭包客 2017-09-13
  • 打赏
  • 举报
回复
引用 13 楼 wowfiowow 的回复:
这有什么难的呢,你就用JS算出cookie值加进cookie里去get不就完了么
如果是一般的脚本不难的,难的是做图灵测试的脚本。图灵的脚本很鸡贼,会在你的文档里面生成元素,检查是否被正确解析,还可以通过一些 offset 属性检查是否被正确排版。
闭包客 2017-09-13
  • 打赏
  • 举报
回复
引用 12 楼 newpowersky 的回复:
[quote=引用 10 楼 closurer 的回复:] 你面对的情况其实比较复杂,因为 V8 里面是没有 window、document、location 这些文档的内建对象的。如果你执行的脚本使用了这些对象,就会出错。 如果你的需求不值得花太多时间去做,建议你还是用一个 Headless Browser[/quot] 其实我就是要模拟计算出一个__test的cook值。我再把这个值传给httphelper。也用不上windows.documetn.这些吧。 你的意思是建议用PhantomJS。应该用这个的话可以取得到。只不过我想学习下脚本怎么用?谢谢大神
你可以试一下用 V8 去执行一下脚本。 能不能实现你的需求,要看这段脚本的目的,有些图灵测试的脚本是专门防爬虫的,没有那么容易顺利执行。
大麦芽糖 2017-09-11
  • 打赏
  • 举报
回复
引用 楼主 newpowersky 的回复:
我用程序访问 指定网页,得到如下的html返回,大意是设置cook -test跳转指定页面。
<script type="text/javascript" src="http://newpowersky.ohday.cn/aes.js" ></script>
<script>
function toNumbers(d) {
    var e = [];
    d.replace(/(..)/g,
    function(d) {
        e.push(parseInt(d, 16))
    });
    return e
}
function toHex() {
    for (var d = [], d = 1 == arguments.length && arguments[0].constructor == Array ? arguments[0] : arguments, e = "", f = 0; f < d.length; f++) e += (16 > d[f] ? "0": "") + d[f].toString(16);
    return e.toLowerCase()
}
var a = toNumbers("f655ba9d09a112d4968c63579db590b4"),
b = toNumbers("98344c2eee86c3994890592585b49f80"),
c = toNumbers("e4c62ce17c9e3eff9de80186313b5a9c");
document.cookie = "__test=" + toHex(slowAES.decrypt(c, 2, a, b)) + "; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/";
var i=1;<!-- location.href = "http://newpower.ohday.cn/?i=1";  -->
</script>
我如何在c#中模拟出来呢?(我用了jav)slowAES这个函数还是在网站上加载的。我要如何才可以得到cook呢?我在浏览器中执行这个javascript,得到 的"__test=" 为空。不明白是为什么?我应该如何做呢?
用jquery的选择器就可以了,已经知道要什么了,只要写针对的代码就可以了
sx_lxh 2017-09-11
  • 打赏
  • 举报
回复
C# HttpWebRequest获取COOKIES byte[] bytes = Encoding.Default.GetBytes(_post); CookieContainer myCookieContainer = new CookieContainer(); try { //新建一个CookieContainer HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(_loginurl); //新建一个HttpWebRequest myHttpWebRequest.ContentType = "application/x-www-form-urlencoded"; myHttpWebRequest.AllowAutoRedirect = false; myHttpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"; myHttpWebRequest.Timeout = 60000; myHttpWebRequest.KeepAlive = true; myHttpWebRequest.ContentLength = bytes.Length; myHttpWebRequest.Method = "POST"; myHttpWebRequest.CookieContainer = myCookieContainer; //设置HttpWebRequest Stream myRequestStream = myHttpWebRequest.GetRequestStream(); myRequestStream.Write(bytes, 0, bytes.Length); myRequestStream.Close(); HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse(); foreach (Cookie ck in myHttpWebResponse.Cookies) { myCookieContainer.Add(ck); } myHttpWebResponse.Close(); } catch { MessageBox.show("获取COOKIES失败!"); return; }
闭包客 2017-09-10
  • 打赏
  • 举报
回复
你得使用一个 javascript 引擎。

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧