java爬虫抓取动态网页(豆瓣View:headlessbrowser网页抓取(网络爬虫)的应用)

优采云 发布时间: 2021-09-21 14:05

  java爬虫抓取动态网页(豆瓣View:headlessbrowser网页抓取(网络爬虫)的应用)

  CasperJS是一个导航脚本&用于PhantomJS(WebKit)和SlimerJS(Gecko)无头浏览器的测试实用程序,用Javascript编写

  Phantom JS是一款基于WebKit内核的无头浏览器

  Slimerjs是一款基于gecko内核的无头浏览器

  无头浏览器:没有界面显示的浏览器。它可以用于自动测试、网页截图、JS注入、DOM操作等。它是一个非常新的web应用工具。虽然该浏览器没有任何界面输出,但它可以在许多方面得到广泛的应用。整篇文章文章将介绍使用casperjs的web页面爬行(web crawler)的应用。这篇文章只是起到了吸引翡翠的作用。事实上,无头浏览器技术的应用将非常广泛,甚至可能会深刻地影响web前端和后端技术的发展

  本文使用了著名的网站[]“operation”(仅供研究、学习和使用。我希望该站不会打扰我

  

  ),以测试功能强大的无头浏览器网页捕获技术的威力

  第一步是安装casperjs,打开casperjs官网,下载并安装最新稳定版本的casperjs,官网上有非常详细的文档,这是学习casperjs最好的第一手资料,当然如果安装了NPM,也可以通过NPM直接安装。同时,这也是官方推荐的安装方法。关于安装的内容不多。官方文件非常详细

  

  

   1 npm install casperjs

2 node_modules/casperjs/bin/casperjs selftest

  视图代码

  第二步是分析target网站.一般来说,内容类网站分为列表页和详细内容页。Douban也不例外。先看看豆瓣列表的页长。经过分析,发现豆瓣电影网站的列表页像T。他的。首先,你可以点击排序规则。翻页不像翻过传统的页码,而是点击最后一页来加载更多。对于这样一个页面,传统的爬虫程序通常会停止烹饪,或者实现非常复杂。但是,对于无头浏览器技术,这是一个很小的例子分析网页,你可以看到点击这个[load more]位置可以持续显示更多的电影信息

  

  第三步是开始编写代码获取电影详情页面的链接信息。我们不礼貌。模拟点击此处采集超链接列表。以下代码是获取链接的代码。引用并创建casperjs对象。如果网页需要插入脚本,您可以引用要插入的脚本生成Casper对象时,注入到clientscript部分的网页中。为了加快网页的加载速度,我们禁止下载图片和插件:

  

  

   1 pageSettings: {

2 loadImages: false, // The WebPage instance used by Casper will

3 loadPlugins: false // use these settings

4 },

  视图代码

  )

  完成获取详细信息页面链接的代码。单击[load more]并循环50次。事实上,可以通过[判断while(而不是“loading more”)然后(stop)]来改进循环。获取后,使用require('utils')。Dump(…)要输出链接列表,请将以下代码另存为getdoublanlist.js,然后运行casperjs getdoublanlist.js以获取并输出该类别下的所有详细页面链接

  

  

   1 1 phantom.outputEncoding="uft8";

2 var casper = require('casper').create({

3 // clientScripts: [

4 // 'includes/jquery.js', // These two scripts will be injected in remote

5 // 'includes/underscore.js' // DOM on every request

6 // ],

7 pageSettings: {

8 loadImages: false, // The WebPage instance used by Casper will

9 loadPlugins: false // use these settings

10 },

11 logLevel: "info", // Only "info" level messages will be logged

12 verbose: false // log messages will be printed out to the console

13 });

14

15 casper.start("https://movie.douban.com/explore#!type=movie&tag=%E7%BB%8F%E5%85%B8&sort=recommend&page_limit=20&page_start=0", function () {

16 this.capture("1.png");

17 });

18

19 casper.then(function () {

20 this.click("a.more",10,10);

21 var i = 0;

22 do

23 {

24 i ++;

25 casper.waitForText('加载更多', function() {

26 this.click("a.more",10,10);//this.capture("2.png"); // read data from popup

27 });

28 }

29 while (i {

15 console.log(data.toString());

16 strUrls = strUrls + data.toString();

17

18 });

19

20 urllist.stderr.on('data', (data) => {

21 console.log(data);

22 });

23

24 urllist.on('exit', (code) => {

25 console.log(`Child exited with code ${code}`);

26 var urlData = JSON.parse(strUrls);

27 var content2 = "";

28 for(var key in urlData){

29 if (content2 != "") {

30 content2 = content2 + "\r\n" + urlData[key];

31 }

32 else {

33 content2 = urlData[key];

34 }

35 }

36 var recordurl = new record.RecordAllUrl();

37 recordurl.RecordUrlInText(content2);

38 console.log(content2);

39 });

40

  GetAllUrls

  引用的recordurl模块不是用mongodb编写的,您可以自己完成

  

  

   1 exports.RecordAllUrl = RecordUrl;

2 var fs = require('fs');

3 function RecordUrl() {

4 var file = "d:/urllog.txt";

5 var RecordUrlInFile = function(theurl) {

6

9 fs.appendFile(file, theurl, function(err){

10 if(err)

11 console.log("fail " + err);

12 else

13 console.log("写入文件ok");

14 });

15 };

16 var RecordUrlInMongo = function() {

17 console.log('Hello ' + name);

18 };

19 return {

20 RecordUrlInDB: RecordUrlInMongo,

21 RecordUrlInText: RecordUrlInFile

22 } ;

23 };

  记录URL

  第四步是分析细节页面并编写细节页面捕获程序

  在这一步中,您已经获得了要捕获的详细页面列表。现在让我们打开一个电影详细页面,看看结构如何,并分析如何捕获每个信息。对于信息捕获,我们必须综合使用DOM、文本处理、JS脚本和其他技术。我想获得这部分的信息,包括di校长、编剧、乐谱等等。我们在本文中不再重复。这里我们只提取一些信息项的示例

  

  1.grab director list:domcss选择器'div#info span:nth child(1)span.Attrs a')的director列表。我们使用函数gettexcontent(strule,strmesg)方法来获取内容

  

  

   1 phantom.outputEncoding="GBK";

2 var S = require("string");

3 var casper = require('casper').create({

4 clientScripts: [

5 'includes/jquery.js', // These two scripts will be injected in remote

6 'includes/underscore.js' // DOM on every request

7 ],

8 pageSettings: {

9 loadImages: false, // The WebPage instance used by Casper will

10 loadPlugins: false // use these settings

11 },

12 logLevel: "info", // Only "info" level messages will be logged

13 verbose: false // log messages will be printed out to the console

14 });

15

16 //casper.echo(casper.cli.get(0));

17 var fetchUrl='https://movie.douban.com/subject/25662329/', fetchNumber;

18 if(casper.cli.has('url'))

19 fetchUrl = casper.cli.get('url');

20 else if(casper.cli.has('number'))

21 fetchNumber = casper.cli.get('number');

22 casper.echo(fetchUrl);

23

24 casper.start(fetchUrl, function () {

25 this.capture("1.png");

26 //this.echo("启动程序....");

27 //this.echo(this.getHTML('div#info span:nth-child(3) a'));

28 //this.echo(this.fetchText('div#info span:nth-child(1) a'));

29

30 //抓取导演

31 getTextContent('div#info span:nth-child(1) span.attrs a','抓取导演');

32

33

34 });

35

36 //get the text content of tag

37 function getTextContent(strRule, strMesg)

38 {

39 //给evaluate传入参数

40 var textinfo = casper.evaluate(function(rule) {

41 var valArr = '';

42 $(rule).each(function(index,item){

43 valArr = valArr + $(this).text() + ',';

44 });

45 return valArr.substring(0,valArr.length-1);

46 }, strRule);

47 casper.echo(strMesg);

48 require('utils').dump(textinfo.split(','));

49 return textinfo.split(',');

50 };

51

52 //get the attribute content of tag

53 function getAttrContent(strRule, strMesg, Attr)

54 {

55 //给evaluate传入参数

56 var textinfo = casper.evaluate(function(rule, attrname) {

57 var valArr = '';

58 $(rule).each(function(index,item){

59 valArr = valArr + $(this).attr(attrname) + ',';

60 });

61 return valArr.substring(0,valArr.length-1);

62 }, strRule, Attr);

63 casper.echo(strMesg);

64 require('utils').dump(textinfo.split(','));

65 return textinfo.split(',');

66 };

67

68 casper.run();

  获得董事

  2.使用CSS选择器很难捕捉生产国家和地区。分析网页后,我们可以发现,首先,信息没有放置在标签中,文本“America”直接位于标签中

  在这个高级元素中。对于此类信息,我们使用另一种方法,文本分析和截取。首先,映射字符串模块var s=require(“字符串”);此模块也将单独安装。然后获取整个信息,然后用文本截取:

  

  

  

   1 //影片信息全文字抓取

2 nameCount = casper.evaluate(function() {

3 var valArr = '';

4 $('div#info').each(function(index,item){

5 valArr = valArr + $(this).text() + ',';

6 });

7 return valArr.substring(0,valArr.length-1);

8 });

9 this.echo("影片信息全文字抓取");

10 this.echo(nameCount);

11 //this.echo(nameCount.indexOf("制片国家/地区:"));

12

13 //抓取国家

14 this.echo(S(nameCount).between("制片国家/地区:","\n"));

  GetCountry

  其他信息也可以类似地获得

  第五步:存储捕获的信息并将其作为分析源,建议使用NoSQL数据库存储,如mongodb,更适合存储此类非结构化数据,性能更好

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线