使用casperjs获取javascript渲染生成的html内容

文章摘要:其实这里casperjs与python没有直接关系,主要依赖casperjs调用phantomjs webkit获取html文件内容。长期以来,爬虫抓取 客户端javascript渲染生成的html页面 都极为 困难, Java里面有 HtmlUnit , 而Python里,我们可以使用独立的跨平台的 CasperJS 。

创建site.js(接口文件,输入:url,输出:html file)

//USAGE: E:\toolkit\n1k0-casperjs-e3a77d0\bin>python casperjs site.js --url=http://spys.ru/free-proxy-list/IE/ --outputfile=‘temp.html‘

var fs = require(‘fs‘);
var casper = require(‘casper‘).create({
 pageSettings: {
 loadImages: false,       
 loadPlugins: false,      
 userAgent: ‘Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36 LBBROWSER‘
},
logLevel: "debug",//日志等级
verbose: true    // 记录日志到控制台
 });
var url = casper.cli.raw.get(‘url‘);
var outputfile = casper.cli.raw.get(‘outputfile‘);
//请求页面
casper.start(url, function () {
fs.write(outputfile, this.getHTML(), ‘w‘);
});

casper.run();

python 代码, checkout_proxy.py

import json
import sys
#import requests
#import requests.utils, pickle
from bs4 import BeautifulSoup
import os.path,os
import threading
#from multiprocessing import Process, Manager
from datetime import datetime
import traceback
import logging
import re,random
import subprocess
import shutil
import platform
output_file =  os.path.join(os.path.dirname(os.path.realpath(__file__)),‘proxy.txt‘)
global_log  = ‘http_proxy‘ + datetime.now().strftime(‘%Y-%m-%d‘) + ‘.log‘
if not os.path.exists(os.path.join(os.path.dirname(os.path.realpath(__file__)),‘logs‘)):
  os.mkdir(os.path.join(os.path.dirname(os.path.realpath(__file__)),‘logs‘))
global_log = os.path.join(os.path.dirname(os.path.realpath(__file__)),‘logs‘,global_log)
logging.basicConfig(level=logging.DEBUG,format=‘[%(asctime)s] [%(levelname)s] [%(module)s] [%(funcName)s] [%(lineno)d] %(message)s‘,filename=global_log,filemode=‘a‘)
log = logging.getLogger(__name__) 
#manager = Manager()
#PROXY_LIST = manager.list()
mutex = threading.Lock()
PROXY_LIST = []
def isWindows():
  if "Windows" in str(platform.uname()):
  return True
  else:
  return False
def getTagsByAttrs(tagName,pageContent,attrName,attrRegValue):
  soup = BeautifulSoup(pageContent)																							   
  return soup.find_all(tagName, { attrName : re.compile(attrRegValue) })
def getTagsByAttrsExt(tagName,filename,attrName,attrRegValue):
  if os.path.isfile(filename):
  f = open(filename,‘r‘)	  
  soup = BeautifulSoup(f)
  f.close()
  return soup.find_all(tagName, { attrName : re.compile(attrRegValue) })
  else:
  return None
class Site1Thread(threading.Thread):
  def __init__(self,outputFilePath):
    threading.Thread.__init__(self)
  self.outputFilePath = outputFilePath
  self.fileName = str(random.randint(100,1000)) + ".html"
  self.setName(‘Site1Thread‘)
  def run(self):
  site1_file = os.path.join(os.path.dirname(os.path.realpath(__file__)),‘site.js‘)
  site2_file = os.path.join(self.outputFilePath,‘site.js‘)
  if not os.path.isfile(site2_file) and os.path.isfile(site1_file):
    shutil.copy(site1_file,site2_file)
  #proc = subprocess.Popen(["bash","-c", "cd %s && ./casperjs site.js --url=http://spys.ru/free-proxy-list/IE/ --outputfile=%s" % (self.outputFilePath,self.fileName) ],stdout=subprocess.PIPE)
  if isWindows():
    proc = subprocess.Popen(["cmd","/c", "%s/casperjs site.js --url=http://spys.ru/free-proxy-list/IE/ --outputfile=%s" % (self.outputFilePath,self.fileName) ],stdout=subprocess.PIPE)
  else:
    proc = subprocess.Popen(["bash","-c", "cd %s && ./casperjs site.js --url=http://spys.ru/free-proxy-list/IE/ --outputfile=%s" % (self.outputFilePath,self.fileName) ],stdout=subprocess.PIPE)
  out=proc.communicate()[0]
  htmlFileName = ‘‘
  #因为输出路径在windows不确定,所以这里加了所有可能的路径判断
  if os.path.isfile(self.fileName):
    htmlFileName = self.fileName
  elif os.path.isfile(os.path.join(self.outputFilePath,self.fileName)):
    htmlFileName = os.path.join(self.outputFilePath,self.fileName)
  elif os.path.isfile(os.path.join(os.path.dirname(os.path.realpath(__file__)),self.fileName)):
    htmlFileName = os.path.join(os.path.dirname(os.path.realpath(__file__)),self.fileName)
  if (not os.path.isfile(htmlFileName)):
    print ‘Failed to get html content from http://spys.ru/free-proxy-list/IE/‘
    print out
    sys.exit(3)
  mutex.acquire()
  PROXYList= getTagsByAttrsExt(‘font‘,htmlFileName,‘class‘,‘spy14$‘)
  for proxy in PROXYList:
    tdContent = proxy.renderContents()
    lineElems = re.split(‘[<>]‘,tdContent)
    if re.compile(r‘\d+‘).search(lineElems[-1]) and re.compile(‘(\d+\.\d+\.\d+)‘).search(lineElems[0]):
    print lineElems[0],lineElems[-1]
    PROXY_LIST.append("%s:%s" % (lineElems[0],lineElems[-1]))
  mutex.release()
  try:
    if os.path.isfile(htmlFileName):
    os.remove(htmlFileName)
  except:
    pass
if __name__ == ‘__main__‘:
  try:
  if(len(sys.argv)) < 2:
    print "Usage:%s [casperjs path]" % (sys.argv[0])
    sys.exit(1)
  if not os.path.exists(sys.argv[1]):
    print "casperjs path: %s does not exist!" % (sys.argv[1])
    sys.exit(2)
  if os.path.isfile(output_file):
    f = open(output_file)
    lines = f.readlines()
    f.close
    for line in lines:
    PROXY_LIST.append(line.strip())
  thread1 = Site1Thread(sys.argv[1])
  thread1.start()
  thread1.join()
  f = open(output_file,‘w‘)
  for proxy in set(PROXY_LIST):
    f.write(proxy+"\n")
  f.close()
  print "Done!"
  except SystemExit:
  pass
  except:
    errMsg = traceback.format_exc()
    print errMsg
    log.error(errMsg)
时间: 2024-07-31 02:42:55

使用casperjs获取javascript渲染生成的html内容的相关文章

[搬运自我的CSDN博客] python抓取javascript动态生成HTML内容的实践

<注:CSDN博客在美国访问特别卡,所以转移到cnblogs来发文章> 本实验在Ubuntu14.04上完成.使用的浏览器是火狐(Firefox 33.0),python版本是2.7.6. 大家都知道用urllib配合正则表达式抓取静态HTML的内容很方便,但是如果网页中有javascript动态生成的内容,urllib就无能为力了. 此时我们要借助一个额外的工具:selenium.它的工作原理是操纵(火狐)浏览器浏览目标网页,等待网页中的javascript全部执行完毕后再对HTML源码进行

javascript如何生成指定行数的表格

javascript如何生成指定行数的表格:使用javascript可以动态生成一个表格,但是有些时候需要根据需要生成指定行数的表格,下面就通过代码实例介绍一下如何实现此功能.代码如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <title>动态生成表格代码</title> <style type="text/css"&g

JavaScript自动生成博文目录导航

我们在写博客的时候,如果博文里面有目录,会给人结构清晰.一种一目了然的感觉,看目录就知道这篇博文要讲解的内容,并且点击目录标题就可以跳转到具体的内容,这样园友们在看博客的时候就可以很方便地浏览自己感兴趣的内容,但是遗憾的是博客园不支持博文目录的生成,好像也有园友给博客园提建议,希望能够像CSDN那样能够自动生成博文目录,但是不知道是什么原因,博客园一直都没有把这个功能加上去,既然没有,那我就自己做吧,研究了2天,总算是按照自己的设想做出来了,最终效果如下: 下面来介绍一下这个小工具的实现. 一.

在JavaScript中生成自定义的对象

使用对象便于组织信息.下面我们介绍如何在JavaScript中生成自定义的对象. ---------------------- JavaScript 对象 在前面几章中我们学到JavaScript中有些内置的对象,比如String, Date, Array等等.除此之外,你还可以定义自己的对象. 对象是一种特殊的数据,含有属性和函数. 下面让我们用一个例子来说明:比如一个人是一个对象.属性是与对象有联系的值,比如人的属性包括姓名,身高,体重,年龄,肤色,眼睛的颜色等等.所有人都有这些属性,但是每

[转]JavaScript自动生成博文目录导航

转自:http://www.cnblogs.com/xdp-gacl/p/3718879.html 我们在写博客的时候,如果博文里面有目录,会给人结构清晰.一种一目了然的感觉,看目录就知道这篇博文要讲解的内容,并且点击目录标题就可以跳转到具体的内容,这样园友们在看博客的时候就可以很方便地浏览自己感兴趣的内容,但是遗憾的是博客园不支持博文目录的生成,好像也有园友给博客园提建议,希望能够像CSDN那样能够自动生成博文目录,但是不知道是什么原因,博客园一直都没有把这个功能加上去,既然没有,那我就自己做

JavaScript随机生成颜色的方法

JavaScript随机生成颜色的方法 这篇文章主要介绍了JavaScript随机生成颜色的方法的相关资料,非常不错,代码简单易懂,具有参考借鉴价值,需要的朋友可以参考下 废话不多说了直接给大家贴js代码了,具体代码如下所述: ? 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 <!DOCTYPE html> <html>

Javascript动态生成表格的性能调优

    vision 0.8 [耗时672ms]终极优化 将字符串作为数组对象的方式是目前效率最高,性能最优的方式.   <script> var t1 = new Date(); </script> <html> <head> <title></title> <script> function testTime(){ var t2 = new Date(); alert(t2-t1+"ms"); }

shell脚本获取网页快照并生成缩略图

获取网页快照并生成缩略图可分两步进行: 1.获取网页快照 2.生成缩略图 获取网页快照 这里我们用 phantomjs 来实现.关于 phantomjs 的详细用法可参考 官方网站 . 1.安装 我的环境是CentOS6.5,安装时直接下载 tarball 然后解压即可. # wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.8-linux-i686.tar.bz2 # tar -jxvf phantomjs-1

JavaScript or jQuery 获取option value值 以及文本内容的方法

1.html <div class="form-group"> <label>保险公司</label> <select class="form-control" id="testSelect"> <option value="平安">平安保险</option> <option value="太平洋">太平洋保险</op