Having fun web crawling with phantomJs

A couple of weeks ago, a colleague of mine showed me this cool tool called phantomJs.
This is a headless browser, that can receive javascript to do almost anything you would want from a regular browser, just without rendering anything to the screen.

This could be really useful for tasks like running ui tests on a project you created, or crawling a set of web pages looking for something.

...So, this is exactly what i did!
There's a great site I know of that has a ton of great ebooks ready to download, but the problem is that they show you only 2 results on each page, and the search never finds anything!

Realizing that this site has a very simple url structure (e.g.: website/page/#), I just created a quick javascript file, telling phantomjs to go through the first 50 pages and search for a list of keywords that interest me. If i find something interesting, it saves the name of the book along with the page link into a text file so i can download them all later. :)

Here's the script :
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
var page;
var fs = require( 'fs' );
var pageCount = 0;
 
scanPage(pageCount);
 
function scanPage(pageIndex) {
  // dispose of page before moving on
  if ( typeof page !== 'undefined' )
   page.release();
 
  // dispose of phantomjs if we're done
  if (pageIndex > 50) {
   phantom.exit();
   return ;
  }
 
  pageIndex++;
  
  // start crawling...
  page = require('webpage ').create();
  var currentPage = ' your-favorite-ebook-site-goes-here/page/ ' + pageIndex;
  page.open(currentPage, function(status) {
   if (status === ' success ') {
    window.setTimeout(function() {
     console.log(' crawling page ' + pageIndex);
     
     var booksNames = page.evaluate(function() {
      // there are 2 book titles on each page, just put these in an array
      return [ $($(' h2 a ')[0]).attr(' title '), $($(' h2 a ')[1]).attr(' title ') ];
     });
     checkBookName(booksNames[0], currentPage);
     checkBookName(booksNames[1], currentPage);
     
     scanPage(pageIndex);
    }, 3000);
   }
   else {
    console.log(' error crawling page ' + pageIndex);
    page.release();
   }
  });
}
 
// checks for interesting keywords in the book title,
// and saves the link for us if necessary
function checkBookName(bookTitle, bookLink) {
  var interestingKeywords = [' C #','java','nhibernate','windsor','ioc','dependency injection',
   'inversion of control ',' mysql '];
  for (var i=0; i<interestingKeywords.length; i++) {
   if (bookTitle.toLowerCase().indexOf(interestingKeywords[i]) !== -1) {
    // save the book title and link
    var a = bookTitle + ' => ' + bookLink + ' ; ';
    fs.write(' books.txt ', a, ' a');
    console.log(a);
    break ;
   }
  }
}

And this is what the script looks like, when running :
Just some notes on the script :
  • I added comments to try to make it as clear as possible. Feel free to contact me if it isn't.
  • I hid the real website name from the script for obvious reasons. This technique could be useful for a variety of things, but you should check first about legality issues.
  • I also added an interval of 3 seconds between each website crawl. Another precaution from putting too much load on their site.

In order to use this script, or something like it, just go to the phantomjs homepage, download it, and run this at the command line :
C:\your-phantomjs-lib\phantomjs your-script.js

Enjoy! :)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值