用单进程、多线程并发、多线程分别实现爬一个或多个网站的所有链接,用浏览器打开所有链接并保存截图 python

#coding=utf-8
import requests
import re,os,time,ConfigParser
from selenium import webdriver
from multiprocessing.dummy import Pool

######单进程#####

#创建保存截图的目录

def createImagesPath():
    dirname=os.path.dirname(os.path.abspath(__file__)) 
    #print dirname
    imges_path=os.path.join(dirname,time.strftime("%Y%m%d")) 
    #print imges_path
    try:
        if not os.path.exists(imges_path):
            os.mkdir(imges_path)   
        print u"截图保存的目录:",imges_path
        return imges_path 
    except Exception,e:
        print e

#从文件中获取要爬的网站地址
def getWebUrls(web_urls_file_path):
    web_urls=[]
    try:
        with open(web_urls_file_path) as fp:  
            lines=fp.readlines() 
        for line in lines: 
            if line.strip():
                web_urls.append(line.strip()) 
        return web_urls 
    except Exception,e:
        print e

#获取单个网站的所有有效链接
def getLinks(web_url):
    try:
        response=requests.get(web_url) 
        #print response
        html=response.text
        links=re.findall(r‘href="(.*?)"‘,html)
        valid_links=[]
        invalid_links=[]     
        for link in links:  
            if link.strip().startswith("//"):   
                valid_links.append("http:"+link.strip())
            elif link.strip()=="" or link.strip()=="#" or link.strip()=="/" or link.strip().count("javascript")>=1 or link.strip().count("mailto:") >= 1:   
                invalid_links.append(link)
            elif re.search(r"(\.jpg)|(\.jpeg)|(\.gif)|(\.ico)|(\.png)|(\.js)|(\.css)$",link.strip()) or re.match(r‘/[^/].*‘,link.strip()):
                invalid_links.append(link)
            else:
                valid_links.append(link.strip())
        valid_links=list(set(valid_links))  
        return valid_links     
    except Exception,e:
        print e

#保存有效的链接到.txt文件
def saveLinks(links):
    dirname=os.path.dirname(os.path.abspath(__file__)) 
    #print dirname
    links_path=os.path.join(dirname,time.strftime("%Y%m%d")) 
    #print links_path
    try:
        if not os.path.exists(links_path):
            os.mkdir(links_path)   
        links_file_path=os.path.join(links_path,"links.txt")
        print u"链接保存的路径:",links_file_path   
        with open(links_file_path,"w") as fp: 
            fp.writelines([link+"\n" for link in links])   
    except Exception,e:
        print e

#模拟浏览器打开链接并保存截图
class OpenLinkAndSaveImg(object):
    def __init__(self,browser_type):
        try:
            configFilePath=os.path.dirname(os.path.abspath(__file__))+"\\browserAndDriver.ini"
            print u"浏览器驱动配置文件路径:",configFilePath  
            cf=ConfigParser.ConfigParser()
            cf.read(configFilePath)
            browser_type=browser_type.strip().lower()
            driver_path=cf.get("browser_driver",browser_type.strip()).strip()
            print u"浏览器:%s ,驱动位置:%s"%(browser_type,driver_path)
            if browser_type=="ie":
                self.driver=webdriver.Ie(executable_path=eval(driver_path))
            elif browser_type=="chrome":
                self.driver=webdriver.Chrome(executable_path=eval(driver_path))
            elif browser_type=="firefox":
                self.driver=webdriver.Firefox(executable_path=eval(driver_path))
            else:
                print "invalid browser!"
        except Exception,e:
            print e
   
    #打开链接并保存截图
    def openLinkAndSaveImg(self,link_index_imgspath): 
        try:
            link,index,imgspath=link_index_imgspath   
            self.driver.get(link)   
            self.driver.maximize_window()   
            self.driver.get_screenshot_as_file(os.path.join(imgspath,str(index+1)+".png"))
        except Exception,e:
            print e
 
    def end(self):
        self.driver.quit()

if __name__=="__main__":

#单进程
    imgs_path=createImagesPath()
    #weburls=getWebUrls(r"e:\\urls.txt")
    weburls=getWebUrls(os.path.dirname(os.path.abspath(__file__))+"\\urls.txt")
    links=[]    
    start_time=time.time()
    for weburl in weburls:
        links+=getLinks(weburl)
    print u"链接数:%s ;获取所有链接耗时:%s"%(len(links),time.time()-start_time)
    saveLinks(links)
    start_time1=time.time()
    open_link_and_save_img=OpenLinkAndSaveImg("ie")
    for i in range(len(links)):
        open_link_and_save_img.openLinkAndSaveImg((links[i],i,imgs_path))
    open_link_and_save_img.end()
    print u"单进程打开所有链接并截图耗时耗时:",time.time()-start_time1

######多线程(线程池并发执行)######

#coding=utf-8
import requests
import re,os,time,ConfigParser
from selenium import webdriver
from multiprocessing.dummy import Pool

#创建保存截图的目录
def createImagesPath():
    dirname=os.path.dirname(os.path.abspath(__file__)) 
    #print dirname
    imges_path=os.path.join(dirname,time.strftime("%Y%m%d")) 
    #print imges_path
    try:
        if not os.path.exists(imges_path): 
            os.mkdir(imges_path)   
        print u"所有截图保存的目录:",imges_path
        return imges_path 
    except Exception,e:
        print e

#从文件中获取要爬的网站地址
def getWebUrls(web_urls_file_path):
    web_urls=[]
    try:
        with open(web_urls_file_path) as fp:
            lines=fp.readlines() 
        for line in lines: 
            if line.strip():
                web_urls.append(line.strip())  
        return web_urls 
    except Exception,e:
        print e

#获取单个网站的所有有效链接
def getLinks(web_url):
    try:
        response=requests.get(web_url) 
        #print response
        html=response.text
        links=re.findall(r‘href="(.*?)"‘,html)
        valid_links=[]
        invalid_links=[]       
        for link in links:    
            if link.strip().startswith("//"):   
                valid_links.append("http:"+link.strip())
            elif link.strip()=="" or link.strip()=="#" or link.strip()=="/" or link.strip().count("javascript")>=1 or link.strip().count("mailto:") >= 1:   
                invalid_links.append(link)
            elif re.search(r"(\.jpg)|(\.jpeg)|(\.gif)|(\.ico)|(\.png)|(\.js)|(\.css)$",link.strip()) or re.match(r‘/[^/].*‘,link.strip()):
                invalid_links.append(link)
            else:
                valid_links.append(link.strip())
        valid_links=list(set(valid_links))  
        return valid_links     
    except Exception,e:
        print e

#保存有效的链接到.txt文件
def saveLinks(links):
    dirname=os.path.dirname(os.path.abspath(__file__)) 
    #print dirname
    links_path=os.path.join(dirname,time.strftime("%Y%m%d")) 
    #print links_path
    try:
        if not os.path.exists(links_path):
            os.mkdir(links_path)  
        links_file_path=os.path.join(links_path,"links.txt")
        print u"所有链接保存的路径:",links_file_path  
        with open(links_file_path,"w") as fp:   
            fp.writelines([link+"\n" for link in links])   
    except Exception,e:
        print e

#获取浏览器和驱动
def getBrowserAndDriver(browser_type):
    try:
        configFilePath=os.path.dirname(os.path.abspath(__file__))+"\\browserAndDriver.ini"
        print u"浏览器驱动配置文件路径:",configFilePath    
        cf=ConfigParser.ConfigParser()
        cf.read(configFilePath)
        browser_type=browser_type.strip().lower()
        driver_path=cf.get("browser_driver",browser_type.strip()).strip()
        print u"浏览器:%s ,驱动位置:%s"%(browser_type,driver_path)
        return browser_type,driver_path
    except Exception,e:
        print e

#打开链接并保存截图
def openLinkAndSaveImg(browser_driver_link_index_imgspath):  
        try:
            browser,driverpath,link,index,imgspath=browser_driver_link_index_imgspath   
            command="webdriver."+browser.capitalize()+"(executable_path="+driverpath+")"
            driver=eval(command)
            driver.get(link)      
            driver.maximize_window()   
            driver.get_screenshot_as_file(os.path.join(imgspath,str(index+1)+".png"))  
            driver.quit()
        except Exception,e:
            print e

if __name__=="__main__":
    imgs_path=createImagesPath()
    #weburls=getWebUrls(r"e:\\urls.txt")
    weburls=getWebUrls(os.path.dirname(os.path.abspath(__file__))+"\\urls.txt")
    p=Pool(5)
    start_time1=time.time()
    links_list=p.map(getLinks,weburls)
    end_time1=time.time()
    links=[]
    for link_list in links_list:
        links+=link_list
    saveLinks(links)
    print u"链接数:%s ;获取所有链接耗时:%s"%(len(links),end_time1-start_time1)
    browser,driver=getBrowserAndDriver("ie")
    browser_driver_link_index_imgspath=zip([browser]*len(links),[driver]*len(links),links,range(len(links)),[imgs_path]*len(links))
    start_time2=time.time()
    p.map(openLinkAndSaveImg,browser_driver_link_index_imgspath)
    p.close()
    p.join()
    print u"多线程打开所有链接并截图耗时:",time.time()-start_time2

######多线程######

#coding=utf-8
import requests
import re,os,time,ConfigParser
from selenium import webdriver
from multiprocessing.dummy import Pool
import Queue
import threading

#创建保存截图的目录
def createImagesPath():
    dirname=os.path.dirname(os.path.abspath(__file__)) 
    #print dirname
    imges_path=os.path.join(dirname,time.strftime("%Y%m%d")) 
    #print imges_path
    try:
        if not os.path.exists(imges_path):
            os.mkdir(imges_path)   
        print u"所有截图保存的目录:",imges_path
        return imges_path 
    except Exception,e:
        print e

#从文件中获取要爬的网站地址
def getWebUrls(web_urls_file_path):
    web_urls=[]
    try:
        with open(web_urls_file_path) as fp:
            lines=fp.readlines()  
        for line in lines: 
            if line.strip():
                web_urls.append(line.strip())
        return web_urls 
    except Exception,e:
        print e

#获取单个网站的所有有效链接
def getLinks(web_url):
    try:
        response=requests.get(web_url) 
        #print response
        html=response.text
        links=re.findall(r‘href="(.*?)"‘,html)
        valid_links=[]
        invalid_links=[]       
        for link in links:      
            if link.strip().startswith("//"):   
                valid_links.append("http:"+link.strip()) 
            elif link.strip()=="" or link.strip()=="#" or link.strip()=="/" or link.strip().count("javascript")>=1 or link.strip().count("mailto:") >= 1:   
                invalid_links.append(link)
            elif re.search(r"(\.jpg)|(\.jpeg)|(\.gif)|(\.ico)|(\.png)|(\.js)|(\.css)$",link.strip()) or re.match(r‘/[^/].*‘,link.strip()):
                invalid_links.append(link)
            else:
                valid_links.append(link.strip())
        valid_links=list(set(valid_links)) 
        return valid_links     
    except Exception,e:
        print e

#保存有效的链接到.txt文件(当前目录\年月日\links.txt)
def saveLinks(links):
    dirname=os.path.dirname(os.path.abspath(__file__)) 
    #print dirname
    links_path=os.path.join(dirname,time.strftime("%Y%m%d")) 
    #print links_path
    try:
        if not os.path.exists(links_path):  
            os.mkdir(links_path)   
        links_file_path=os.path.join(links_path,"links.txt") 
        print u"所有链接保存的路径:",links_file_path  
        with open(links_file_path,"w") as fp:   
            fp.writelines([link+"\n" for link in links])   
    except Exception,e:
        print e

#多线程
class MyThread(threading.Thread):
    def __init__(self,browser,queue):
        threading.Thread.__init__(self)
        self.queue=queue
        try:
            configFilePath=os.path.dirname(os.path.abspath(__file__))+"\\browserAndDriver.ini"
            #print u"浏览器驱动配置文件路径:",configFilePath
            cf=ConfigParser.ConfigParser()
            cf.read(configFilePath)
            browser_type=browser.strip().lower()
            driver_path=cf.get("browser_driver",browser_type.strip()).strip()
            #print u"浏览器:%s ,驱动位置:%s"%(browser_type,driver_path)
            if browser_type=="ie":
                self.driver=webdriver.Ie(executable_path=eval(driver_path))
            elif browser_type=="chrome":
                self.driver=webdriver.Chrome(executable_path=eval(driver_path))
            elif browser_type=="firefox":
                self.driver=webdriver.Firefox(executable_path=eval(driver_path))
            else:
                print "invalid browser!"

except Exception,e:
            print e

def run(self):
        print "Starting"+self.name
        openLinkAndSaveImg(self.driver,self.queue)
        self.driver.quit()

#打开链接并保存截图
def openLinkAndSaveImg(driver,queue):  
        while not queue.empty():
            queueLock.acquire()
            link_index_imgspath=queue.get()
            queueLock.release()
            try:             
                link,index,imgspath=link_index_imgspath   
                driver.get(link)     
                driver.maximize_window()  
                driver.get_screenshot_as_file(os.path.join(imgspath,str(index+1)+".png"))
            except Exception,e:
                print e

if __name__=="__main__":
    #多线程
    imgs_path=createImagesPath()
    #weburls=getWebUrls(r"e:\\urls.txt")
    weburls=getWebUrls(os.path.dirname(os.path.abspath(__file__))+"\\urls.txt")
    p=Pool(5)
    start_time1=time.time()
    links_list=p.map(getLinks,weburls)
    end_time1=time.time()
    links=[]
    for link_list in links_list:
        links+=link_list
    saveLinks(links)
    print u"链接数:%s ;获取所有链接耗时:%s"%(len(links),end_time1-start_time1)

link_index_imgspath=zip(links,range(len(links)),[imgs_path]*len(links))
    
    queueLock=threading.Lock()
    threads=[]
    link_index_imgspath_Queue=Queue.Queue(len(links))
    for element in link_index_imgspath:
        link_index_imgspath_Queue.put(element)

start_time2=time.time()

for i in range(5):
        thread=MyThread("ie",link_index_imgspath_Queue)
        thread.start()
        threads.append(thread)

for t in threads:
        t.join()

print u"多线程打开所有链接并截图耗时:",time.time()-start_time2

print "end!"

原文地址:https://www.cnblogs.com/reyinever/p/9250455.html

时间: 2024-11-05 20:25:25

用单进程、多线程并发、多线程分别实现爬一个或多个网站的所有链接,用浏览器打开所有链接并保存截图 python的相关文章

多线程并发常见问题

一 概述 1.volatile 保证共享数据一旦被修改就会立即同步到共享内存(堆或者方法区)中. 2.线程访问堆中数据的过程 线程在栈中建立一个变量的副本,修改完毕后将数据同步到堆中. 3.指令重排 为了提高执行效率,CPU会将没有依赖关系的指令重新排序.如果希望控制重新排序,可以使用volatile修饰一个变量,包含该变量的指令前后的指令各自独立排序,前后指令不能交叉排序. 二 常见问题及应对 1.原子性问题 所谓原子性,指的是一个操作不可中断,即在多线程并发的环境下,一个操作一旦开始,就会在

Cocos2d-x优化中多线程并发访问

多线程并发访问在Cocos2d-x引擎中用的不是很多,这主要是因为中整个结构设计没有采用多线程.源自于Objective-C的Ref对象,需要使用AutoreleasePool进行内存管理,AutoreleasePool是非线程安全的,所有不推荐在子多线程中调用Ref对象的retain(). release()和autorelease()等函数.另外,OpenGL上下文对象也是不支持线程安全的.但是有的时候我们需要异步加载一些资源,例如:加载图片纹理.声音的预处理和网络请求数据等.如果是异步加载

简单的多线程并发同步演示

#include "stdafx.h"#include <iostream>#include <Windows.h>using namespace std;HANDLE hMutex;DWORD WINAPI Fun(LPVOID lp){    while(1){        WaitForSingleObject(hMutex,INFINITE);        cout<<"fun"<<endl;//如果不用信

Java基础】并发 - 多线程

Java基础]并发 - 多线程 分类: Java2014-05-03 23:56 275人阅读 评论(0) 收藏 举报 Java 目录(?)[+] 介绍 Java多线程 多线程任务执行 大多数并发应用程序时围绕执行任务(task)进行管理的:所谓任务就是抽象的,离散的工作单元. 围绕执行任务来管理应用程序时,第一步是要指明一个清晰的任务边界.大多数应用服务器程序都选择了下面这个自然的任务辩解:单独的客户请求: 任务时逻辑上的单元: 任务 Runnable 表示一个任务单元(java.lang)

iOS Core data多线程并发访问的问题

大家都知道Core data本身并不是一个并发安全的架构:不过针对多线程访问带来的问题,Apple给出了很多指导:同时很多第三方的开发者也贡献了很多解决方法.不过最近碰到的一个问题很奇怪,觉得有一定的特殊性,与大家分享一下. 这个问题似乎在7.0.1以前的版本上并不存在:不过后来我升级版本到了7.0.4.app的模型很简单,主线程在前台对数据库进行读写,而后台线程不断地做扫描(只读).为此每个线程中各创建了一个NSManagedObjectContext. 这个模型其实有点奇怪,因为普遍的模型是

课二:前摄器设计模式(不使用多线程并发)

Asio库为同步和异步提供一一对应的操作.异步支持是基于前摄器设计模式.该模式的优势和劣势将在下面说明,与之对应的是反射器模式,该模式是一种同步模式. 前摄器的实现: 在Asio库中,前摄器的实现方式如下,该实现方式跨平台一致. 前摄器设计模式: 一.异步操作 定义一个异步执行的操作,例如在一个套接字上进行异步的读写. 二.异步操作处理 执行异步操作并当操作结束时,执行事件完成队列上的某个事件.从更高的层次看,如 stream_socket_service 这样的服务均是异步操作处理器. 三.事

代码就支持了多线程并发

100行代码就支持了多线程并发,批量写入日志 一,您选择用什么样的日志组件 日志组件,不得不提大名鼎鼎的Log4Net.比较常用的还有 Enterprise Library Logging,ServiceStack Logging.当然您还可以补充,我就只用过这几款. 上边提到的3款日志组件,都要在.config里加代码,特别是Log4Net,还要把SQL写在配置里.我就是仅仅只写个日志,还要配置这么多信息,让人略有不爽. 所以在很长一段时间里,我用下边这个方法写日志:   这个方法足够的简单,

java 多线程并发问题总结

java 多线程并发主要通过关键字synchronized实现 Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行.另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块. 二.然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该ob

解决多线程并发问题

1.文件锁 如果对该表的更新或插入的操作,都会经过一个统一的文件,这种方式是可以解决的多进程并发的问题: 实现方式如下: public static function cbInventoryReserve() { $LOCK_FILE_PATH = $_SERVER['DOCUMENT_ROOT']."wmsinventoryapi/inventory/InventoryReserve.php"; $fp = fopen( $LOCK_FILE_PATH, "r"