`

【Python真的很强大】使用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)
    
    
     
0
1
分享到:
评论

相关推荐

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

    长期以来,爬虫抓取 客户端javascript渲染生成的html页面 都极为 困难, Java里面有 HtmlUnit, 而Python里,我们可以使用独立的跨平台的CasperJS。  创建site.js(接口文件,输入:url,输出:html file)  //USAGE: ...

    Linux版本casperjs,抓取js加载的页面

    总的来说,`casperjs`在Linux环境下的使用为Java爬虫开发者提供了强大的工具,能够有效地抓取和解析JavaScript渲染的动态页面。通过深入理解`casperjs`的API和使用方式,你可以构建出更加健壮、高效的网络爬虫系统,...

    casperjs网页截屏例子

    CasperJS是开源的,它提供了丰富的API,使得开发者可以编写简洁、清晰的脚本来控制浏览器的行为,如导航、点击、填表、执行JavaScript以及抓取页面内容。它支持模拟用户交互,这对于网页自动化测试和数据抓取非常...

    casperjs1.1.0-beta3.jar

    2. **DOM操作**:通过`evaluate()`函数,开发者可以在CasperJS中执行页面上下文内的JavaScript代码,获取或修改DOM元素的状态,实现对页面内容的分析和处理。 3. **测试框架**:CasperJS内置了强大的测试机制,允许...

    casperjs-1.1.3.zip

    - 使用`evaluate()`函数获取页面上的数据,因为它在页面的上下文中执行,可以访问到DOM元素和JavaScript变量。 - `casper.each()`或`casper.eachThen()`可以遍历页面元素并执行操作。 - `casper.capture()`或`...

    CasperJS 离线帮助手册(html格式)

    CasperJS是一个开源的,用JavaScript编写的,基于PhantomJS的导航脚本和测试工具 ,它简化了定义一个完成的导航操作所需的步骤,还提供了很有用的函数封装,方法,和语法糖,它可以完成下面这些常见任务: 定义 & 排序...

    casperjs.pdf

    CasperJS是一个基于JavaScript的导航脚本和测试框架,它被设计来让开发者可以在网页上执行自动化任务,如爬取网页内容、进行自动化测试等。它基于PhantomJS引擎,提供了对DOM的访问以及操作。CasperJS可以在多种操作...

    PyPI 官网下载 | webtest-casperjs-0.1.tar.gz

    PyPI是Python开发者发布和分享自己编写的Python软件包的主要平台,用户可以从中方便地获取和安装所需的Python库。 描述中的信息“资源来自pypi官网,资源全名:webtest-casperjs-0.1.tar.gz”进一步确认了这个资源...

    casperjs_biztest.rar

    4. **屏幕截图**:由于CasperJS是基于PhantomJS的,它可以很容易地捕获网页的截图,这对于视觉测试或生成网页快照非常方便。 5. **网络请求监控**:可以使用`resourceRequested`和`resourceReceived`事件来跟踪HTTP...

    casperjs-1.1.4-1.zip

    CasperJS的核心功能是模拟用户交互,如点击、滚动、填写表单等,同时它还提供了强大的断言库来验证网页元素的状态。通过这个1.1.4-1版本,用户可以利用JavaScript编写测试脚本,实现对网页应用的无界面测试,大大...

    casperjs抓取简单实例

    综合以上信息,这个项目可能是一个Java项目,它使用CasperJS作为其数据抓取模块,尤其是从百度百科获取信息。项目包含了一个简单的爬虫,用户可以输入关键词,然后程序会用CasperJS访问百度百科并抓取相关的条目信息...

    phantomjs&casperjs

    5. **生成全尺寸的网页截图**:PhantomJS可以捕获整个网页的截图,包括滚动条下的内容。 在实际使用中,开发者可以根据需求选择使用PhantomJS单独完成任务,或者配合CasperJS进行更复杂的自动化流程控制。两者结合...

    casperjs抓取淘宝手机信息

    casperjs抓取淘宝手机信息实例

    webtest-casperjs:将 casperjs 与 WebTest 结合使用

    **描述解析:** 描述提到“在 WebTest 中使用 casper js”,意味着我们要学习如何将 CasperJS 的强大功能集成到 WebTest 中,以便进行更复杂的浏览器自动化操作,如模拟用户交互、处理JavaScript渲染的内容等。...

    casperjs:使用 PhantomJs 和 CasperJs 测试 Web 应用程序

    总的来说,CasperJS 结合 PhantomJS 提供了一个强大的无头浏览器测试解决方案,尤其适用于进行前端自动化测试和网页抓取。通过学习和熟练掌握 CasperJS,开发者可以更高效地保证 Web 应用的质量,减少手动测试的工作...

    casperjs.pptx

    CasperJS是一种基于JavaScript编写的开源导航脚本与测试工具,它利用WebKit(如Safari、Chrome等浏览器使用的渲染引擎)来实现对网页的模拟访问与交互。CasperJS的设计理念是功能专一、接口简单且易于使用。 #### ...

    phantomjs和casperjs下载地址.zip

    CasperJs 是一个基于 PhantomJs 的工具,其比起 PhantomJs 可以更加方便的进行 navigation。 推荐使用PhantomJs1.9版本的 phantomjs和casperjs下载地址,casperjs下载地址,phantomjs下载地址

    phantomjs + casperjs

    4. **报告生成**:自动生成网页的PDF版本,或者将网页内容导出为其他格式。 在安装PhantomJS时,提供的"phantomjs-1.9.7-windows"是一个Windows平台的PhantomJS二进制文件,包含了可执行程序。用户可以直接下载并将...

    php-casperjs, CasperJS的简单PHP包装.zip

    php-casperjs, CasperJS的简单PHP包装 php PHP是一个简单的PHP包装器,用于设计用于对网页进行用户测试的精细库 CasperJS ...它很容易集成到PHPUnit测试用例中。使webcrawler从未如此容易 !安装在使用php之前,你需要

Global site tag (gtag.js) - Google Analytics