在Python中使用CasperJS获取JS渲染生成的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)
(0)

相关推荐

  • Python中还原JavaScript的escape函数编码后字符串的方法

    遇到一个问题需要用Python把JavaScript中escape的中文给还原,但找了大半天,也没有找到答案,只好自己深入研究解决方案. 我们先来看在js中escape一段文字的编码 复制代码 代码如下: a = escape('这是一串文字'); alert(a); 输出: 复制代码 代码如下: %u8FD9%u662F%u4E00%u4E32%u6587%u5B57 咋一看,就感觉有点类似json格式,我们来看看标准的json格式编码同样的汉子"这是一串文字" 复制代码 代码如下:

  • pyv8学习python和javascript变量进行交互

    python取得javascript里面的值 复制代码 代码如下: import PyV8 with PyV8.JSContext() as env1:    env1.eval("""                var_i = 1;                var_f = 1.0;                var_s = "test";                var_b = true;            ""

  • python使用PyV8执行javascript代码示例分享

    安装相应的库,我使用的是PyV8 需要注意的是里面写的function函数需要用()括起来 复制代码 代码如下: import PyV8 class Test(): def js(self): ctxt = PyV8.JSContext() ctxt.enter() func = ctxt.eval('''(function(){return '###'})''') print func() print '213' if __name__ == '__main__': crawler = Tes

  • 在Python中使用CasperJS获取JS渲染生成的HTML内容的教程

    文章摘要:其实这里casperjs与python没有直接关系,主要依赖casperjs调用phantomjs webkit获取html文件内容.长期以来,爬虫抓取 客户端javascript渲染生成的html页面 都极为 困难, Java里面有 HtmlUnit, 而Python里,我们可以使用独立的跨平台的CasperJS.     创建site.js(接口文件,输入:url,输出:html file)   //USAGE: E:\toolkit\n1k0-casperjs-e3a77d0\b

  • 在Python中通过getattr获取对象引用的方法

    getattr函数 (1)使用 getattr 函数,可以得到一个直到运行时才知道名称的函数的引用. >>> li = ["Larry", "Curly"] >>> li.pop <built-in method pop of list object at 0x7fb75c255518> // 该语句获取列表的 pop 方法的引用,注意该语句并不是调用 pop 方法,调用 pop 方法的应该是 li.pop(), 这里

  • Python中按键来获取指定的值

    Python中按键来获取值,相对来说要容易些,毕竟只需要dict[key]就可以找到,但里面同样有个问题,如果其中的键不存在的话,会抛出异常,如果不用try...except...等异常处理机制的话,程序就会中断!这里提供两种很安全,很健壮的处理方法. 方式一: dict[key] + 判断 >>> dct = {'Name': 'Alice', 'Age': 18, 'uid': 1001, 'id': 1001} >>> def get_value1(dct, ke

  • 在python中使用xlrd获取合并单元格的方法

    处理excel表格的时候经常遇到合并单元格的情况,使用xlrd中的merged_cells的方法可以获取当前文档中的所有合并单元格的位置信息. import xlrd xls = xlrd.open_workbook('test.xls') sh = xls.sheet_by_index(0) 读取excel并读取第一页的内容. for crange in sh.merged_cells: rs, re, cs, ce = crange merged_cells返回的是一个列表,每一个元素是合并

  • python简单几步获取各种DOS命令显示的内容详解流程

    我们经常在C/C++中用"system("pause");"作暂停语句外,还有很多可以用system()调用,比如以下这些dos命令的功能也很不错: system("title C++颜色设置程序"); //设置控制台窗口的标题,即cmd.exe的标题 system("mode con cols=64 lines=25"); //设置窗口宽度高度 system("date /t"); //显示日期 syst

  • 在python中利用dict转json按输入顺序输出内容方式

    一般常规的我们保存数据为dict类型时,系统会自动帮我们排序:但有时我们想按照输入顺序的key:value保存到dict中,而不想要改变顺序,则我们可以通过使用collecions,进行排序. collections是一个python的内建模块. 示例如下: # -*- coding:utf-8 -*- #dic = {} dic = dict() dic['b'] = 1 dic['a'] = 2 dic['b0'] = 3 dic['a1'] = 4 print("dic is:"

  • python中使用urllib2获取http请求状态码的代码例子

    采集内容常需要得到网页返回的验证码做进一步处理 下面代码是用python写的用来获取网页http状态码的脚本 #!/usr/bin/python # -*- coding: utf-8 -*- #encoding=utf-8 #Filename:states_code.py import urllib2 url = 'http://www.jb51.net/' response = None try: response = urllib2.urlopen(url,timeout=5) excep

  • 利用Python中的输入和输出功能进行读取和写入的教程

    读取.写入和 Python 编写程序的最后一个基本步骤就是从文件读取数据和把数据写入文件.阅读完这篇文章之后,可以在自己的 to-do 列表中加上检验这个技能学习效果的任务. 简单输出 贯穿整个系列,一直用 print 语句写入(输出)数据,它默认把表达式作为 string 写到屏幕上(或控制台窗口上).清单 1 演示了这一点.清单 1 重复了第一个 Python 程序 "Hello, World!",但是做了一些小的调整. 清单 1. 简单输出 >>> print

  • 在Python中获取操作系统的进程信息

    本文主要介绍在 Python 中使用 psutil 获取系统的进程信息. 1 概述 psutil 是 Python 的一个进程和系统工具集模块,通过使用 psutil,我们可以在 Python 中获取操作系统中进程的相关信息. 本文中使用的 rpm 包为: python2-psutil.x86_64,该 rpm 包定义如下: python2-psutil.x86_64 : A process and system utilities module for Python 2 代码示例 下面给出一个

  • Python中文件I/O高效操作处理的技巧分享

    如何读写文本文件? 实际案例 某文本文件编码格式已直(如UTF-8,GBK,BIG5),在python2.x和python3.x中分别如何读取这些文件? 解决方案 字符串的语义发生了变化: python2 python3 str bytes unicode str python2.x 写入文件前对 unicode 编码,读入文件后对二进制字符串解码 >>> f = open('py2.txt', 'w') >>> s = u'你好' >>> f.wri

随机推荐