最近在项目里需要用到一个小功能,很小很小的功能,就是抓取指定网站上的内容,但是这个网站刚好是用Ajax进行加载主要内容的,这时按平时用的webclient等去抓取是无法抓取到Ajax加载的内容的,用httpwatch等分析后再模拟Post,这个成本有点高了,因为这只是一个很小的功能而已。
在博客园上发问后得到了几个方法,有用nodejs的,有用Selenium的,有用phantomjs的,开始对nodejs进行研究,看了一些介绍,也都放弃了,,这个文档是其中文版说明。
下面说一下其他的两个方法:
Selenium,这个是资源包,3.5和4.0的框架两个都在里面了,这个要配合不同的Driver来进行页面的操作,比如IEDriverServer.exe,还可以是其他的,比如Firefox,Chrome等,可以到Selenium的官网进行了解下载。
其中Selenium需要的dll和Driver都引入到项目中,我就放于Bin中,主要代码如下:
protected void Button1_Click(object sender, EventArgs e) { // Create a new instance of the Firefox driver. // Notice that the remainder of the code relies on the interface, // not the implementation. // Further note that other drivers (InternetExplorerDriver, // ChromeDriver, etc.) will require further configuration // before this example will work. See the wiki pages for the // individual drivers at http://code.google.com/p/selenium/wiki // for further information. IWebDriver driver = new InternetExplorerDriver(); //HtmlUnitDriver driver = new HtmlUnitDriver(true); //Notice navigation is slightly different than the Java version //This is because 'get' is a keyword in C# driver.Navigate().GoToUrl("http://data.shishicai.cn/cqssc/haoma/"); // Find the text input element by its name //IWebElement query = driver.FindElement(By.Name("q")); // Enter something to search for //query.SendKeys("Cheese"); // Now submit the form. WebDriver will find the form for us from the element //query.Submit(); // Google's search is rendered dynamically with JavaScript. // Wait for the page to load, timeout after 10 seconds WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); //wait.Until((d) => { return d.Title.ToLower().StartsWith("cheese"); }); // Should see: "Cheese - Google Search" TextBox1.Text = "Page title is: " + driver.PageSource; //Close the browser driver.Quit(); }
这样可以拿到网页内容,但是这期间会弹出dos窗口和Driver的界面,执行完后就会自动关闭,这是我不太满意的地方,不知道有没有什么方法可以解决。
phantomjs,这个可以直接到官网下载也可在这里下载,我下载到的是phantomjs-1.9.1-windows这个版本,解压后如下:
其中,第一个是例子,exe这个执行文件是一个运行js的平台,这个可以直接在cmd中进行调用,不记得在哪一个文章中提到在cmd中要定位到这个执行文件所在的目录后才可以执行相应的js的,不然不会成功,果真如此,打开cmd,然后直接cd phantomjs.exe所在的目录,然后执行 phantomjs hello.js可以看到结果。如果下我执行的是一个examples下的一个截图的脚本rasterize.js
其中http://www.hao123.com和hao123.png是这个脚本的参数,即对传入地址截图存为hao123.png,这样的话就可以像Selenium指导所需要的东西所入项目中,然后调cmd进行执行,这个的好处是快,而且没有弹出dos窗口和浏览器窗口。