设为首页 收藏本站
查看: 592|回复: 0

[经验分享] 【Python真的很强大】使用casperjs获取javascript渲染生成的html内容

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-5-8 09:00:03 | 显示全部楼层 |阅读模式
 文章摘要:其实这里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)

     

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-374443-1-1.html 上篇帖子: 搜索引擎–elasticsearch python客户端pyes 建立索引和搜索 下篇帖子: 【转】飘逸的python
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表