网页css js 抓取助手(别的项目组什么项目突然心血来潮想研究一下爬虫、分析的简单原型)

优采云 发布时间: 2021-11-14 03:14

  网页css js 抓取助手(别的项目组什么项目突然心血来潮想研究一下爬虫、分析的简单原型)

  因为其他项目组都在做舆情预测项目,我只是手头没有项目,突然想研究一个简单的爬虫原型,心血来潮分析。网上查这方面的资料太多了,看得我眼花缭乱。Search Search 对于我这样的新手,想做一个简单的爬虫程序,那么HttpClient+jsoup是个不错的选择。前者是用来管理请求的,后者是用来解析页面的,主要是因为后者的select语法和jquery很像,对我这个用js的人来说太方便了。

  昨天和他们聊天时,他们选择了几个知名的开源框架来使用。聊天后,他们发现自己无法抓取动态网页,尤其是评论数和回复数等几个重要数字。还有很多。为了大致了解,比如TRS爬虫需要为js调用编写js脚本,但是分析量巨大。他们的技术人员告诉我们,如果他们配备这样的模板,他们一天只能配备2到3个。,更何况我们这些中途出家的人。碰巧挺有挑战性的,所以昨天就同意了,看看他们能不能找到一个相对简单的解决方案,当然,不考虑效率。

  举个简单的例子,如下图

  

  “我有话要说”后面的1307是后装的,但往往这些数字对于舆论分析来说还是比较重要的。

  对需求有了大致的了解后,我们来分析一下如何解决。通常,我们的一个请求,我们得到的响应中收录js代码和html元素,所以像jsoup这样的html解析器很难在这里利用,因为它可以得到的html,1307还没有生成。这时候就需要一个可以运行js的平台,把运行js代码后的页面交给html进行解析,这样才能正确得到结果。

  因为比较懒,一开始就放弃了写脚本的方式,因为分析一个页面太痛苦了,代码也乱了。他们中的许多人还使用了压缩方法,都是 a(), b() 方法。看的太累了。所以我的第一个想法是,为什么不能让这个地址在某个浏览器中运行,然后将运行结果交给html解析器解析,那么整个问题就迎刃而解了。所以我的临时解决办法是在爬虫服务器上打开一个后台浏览器,或者一个带有浏览器内核的程序,把url地址传给它来请求,然后从浏览器中取出页面的元素交给html解析器来解析,从而得到你想要的信息。

  是的,最后还是用Selenium来实现上一篇我提到的问题。我没有尝试其他任何东西。我只试过火狐引擎。整体效果还是可以接受的。

  继续昨天的话题,既然要实现上一篇提到的问题,就需要一个可以执行js代码的框架。我的第一选择是 htmlunit。先简单介绍一下htmlunit。以下段落摘自互联网。

  htmlunit 是一个开源的java 页面分析工具。启动 htmlunit 后,底层将启动一个无界面浏览器。用户可以指定浏览器类型:firefox、ie等,如果不指定,默认使用INTERNET_EXPLORER_7:

  WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3_6);

  通过一个简单的调用:

  HtmlPage 页面 = webClient.getPage(url);

  可以得到页面的HtmlPage表示,然后通过:

  InputStream 是 = targetPage.getWebResponse().getContentAsStream()

  可以获取页面的输入流,然后获取页面的源代码,这对于网络爬虫项目非常有用。

  当然,你也可以从页面中获取更多的页面元素。

  很重要的一点是HtmlUnit提供了对执行javascript的支持:

  page.executeJavaScript(javascript)

  js执行后返回一个ScriptResult对象,通过该对象可以获取js执行后的页面等信息。默认情况下,内部浏览器执行js后,会做一次页面跳转,跳转到执行js后生成的新页面。如果js执行失败,页面跳转将不会被执行。

  最后可以通过获取 page.executeJavaScript(javascript).getNewPage() 来获取执行后的页面。也就是说,这里需要人工执行javascript。显然这不符合我的初衷。另外,也可能是我水平太差了。我在爬新浪新闻页面时总是出错。我还没有找到错误在哪里。分析网上查询的结果,最可能的错误原因是htmlunit在执行某些带参数的请求时,参数的顺序或编码问题会导致请求失败并报错。关键是我运行后没有得到我需要的结果。

  然后我寻找了另一种解决方案。这时候我找到了SeleniumWebDriver,这就是我需要的解决方案。

  参考资料和例子后,就可以开始使用了。示例代码如下。

  

<p> 1 File pathToBinary = new File("D:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe");

2 FirefoxBinary ffBinary = new FirefoxBinary(pathToBinary);

3 FirefoxProfile firefoxProfile = new FirefoxProfile();

4 FirefoxDriver driver = new FirefoxDriver(ffBinary,firefoxProfile);

5

6

7 driver.get("http://cq.qq.com/baoliao/detail.htm?294064");

8

9 ArrayList list = new ArrayList();

10 list.add("http://www.sina.com.cn");

11 list.add("http://www.sohu.com");

12 list.add("http://www.163.com");

13 list.add("http://www.qq.com");

14

15 long start,end;

16

17 for(int i=0;i

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线