from: https://blog.csdn.net/chufazhe/article/details/51145834

摘要:
在使用selenium和firefox抓取网页指定firefox_profile后遇到问题,生成的日志文件太大直接导致C盘资源耗尽,火狐浏览器直接就停止工作了。

一、环境
windows2008 server(尴尬,C盘空间还剧小)

python 3.4

selenium + firefox

二、代码情况
利用selenium 调用Firefox内核爬取网站

sFirefoxProfile ='C:\\Users\\username\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\2alxrl56.default' # firefox 配置文件路径
fProfile= FirefoxProfile(sFirefoxProfile) # Firefox配置文件,如果不设置这个也可能会被认为是爬虫
driver = webdriver.Firefox(fProfile)

抓取一段时间之后发现爬虫不再抓取网页,火狐停止工作,发现是C盘用户路径下面生成了大量的临时文件,其中日志文件特别大。

C:\Users\username\AppData\Local\Temp\3\tmpuuvium\webdriver-py-profilecopy

爬虫每次启动之后都会从指定的Firefox配置文件路径复制到临时目录中,并且开始生成日志文件。

一开始我希望能够不让爬虫启动的时候都重新生成临时目录,直接使用上次复制后得到的配置文件,但是经过检索并没有发现可行的办法。在检索过程中发现了selenium.webdriver.firefox.firefox_profile 的<a target=_blank href="https://selenium.googlecode.com/git/docs/api/py/_modules/selenium/webdriver/firefox/firefox_profile.html">源代码</a>。发现并没有类似的方法,而且找到了每次生成临时目录的相关代码。

class FirefoxProfile(object):
ANONYMOUS_PROFILE_NAME = "WEBDRIVER_ANONYMOUS_PROFILE"
DEFAULT_PREFERENCES = None

def __init__(self, profile_directory=None):
"""
Initialises a new instance of a Firefox Profile
:args:
- profile_directory: Directory of profile that you want to use.
This defaults to None and will create a new
directory when object is created.
"""
if not FirefoxProfile.DEFAULT_PREFERENCES:
with open(os.path.join(os.path.dirname(__file__),
WEBDRIVER_PREFERENCES)) as default_prefs:
FirefoxProfile.DEFAULT_PREFERENCES = json.load(default_prefs)

self.default_preferences = copy.deepcopy(
FirefoxProfile.DEFAULT_PREFERENCES['mutable'])
self.native_events_enabled = True
self.profile_dir = profile_directory
self.tempfolder = None
if self.profile_dir is None:
self.profile_dir = self._create_tempfolder()
else:
self.tempfolder = tempfile.mkdtemp()
newprof = os.path.join(self.tempfolder, "webdriver-py-profilecopy")
shutil.copytree(self.profile_dir, newprof,
ignore=shutil.ignore_patterns("parent.lock", "lock", ".parentlock"))
self.profile_dir = newprof
self._read_existing_userjs(os.path.join(self.profile_dir, "user.js"))
self.extensionsDir = os.path.join(self.profile_dir, "extensions")
self.userPrefs = os.path.join(self.profile_dir, "user.js")

可以发现在设置FirefoxProfile的过程就会生成临时目录,并且会完成一次拷贝。而生成临时目录是通过tempfile的mkdtemp()实现的。
我去看了一下tempfile的mkdtemp()方法:

tempfile.mkstemp([suffix=''[, prefix='tmp'[, dir=None[, text=False]]]])

在未指定dir的情况下,将根据系统环境变量TMPDIR, TEMP或者TMP的设置来保存临时文件。由于不能在FireProfile的代码上改动,所以问题变成设置环境变量TMPDIR。

# 设置环境变量
os.environ['TMPDIR']=os.path.join(os.path.abspath('.'), 'profile')
这样,每次爬虫每次启动都会在当前目录的profile目录下生成临时文件。尽管解决方案不够理想,但是足够让爬虫继续运行下去了。
也许直接在Selenium的源代码直接修改后重新编译会更省事,留待以后尝试吧。

注:

python环境变量的设置

1、os.environ['环境变量名称']='环境变量值' #其中key和value均为string类型
2、os.putenv('环境变量名称', '环境变量值')

获取系统环境变量
1、os.environ['环境变量名称']
2、os.getenv('环境变量名称')

以上方法,推荐用os.environ,因为使用os.putenv()并不会真正改变os.environ字典里面的环境变量,即某些平台无效,但是使用os.environ有一个潜在的隐患:在一些平台上,包括FreeBSD和Mac OS X,修改environ会导致内存泄露。设置的环境变量只存在于当前的python shell中(设置成功后用print os.environ['环境变量名称']或printos.getenv('环境变量名称') 查看)。

参考资料:
1. FireProfile源代码:

https://selenium.googlecode.com/git/docs/api/py/_modules/selenium/webdriver/firefox/firefox_profile.html

2. tempfile的相关方法:

http://www.cnblogs.com/captain_jack/archive/2011/01/19/1939555.html

3. python设置获取环境变量的方法:

http://aurorawu.lofter.com/post/18f005_6fd653

使用Selenium+firefox抓取网页指定firefox_profile后的问题的更多相关文章

  1. c# 关于抓取网页源码后中文显示乱码的原因分析和解决方法

    原因分析:首先,目前大多数网站为了提升网页浏览传输速率都会对网站内容在传输前进行压缩,最常用的是GZIP压缩解压解压算法,也是支持最广的一种. 因为网站传输时采用的是GZIP压缩传输,如果我们接受we ...

  2. scrapy和selenium结合抓取动态网页

    1.安装python (我用的是2.7版本的) 2.安装scrapy:   详情请参考 http://blog.csdn.net/wukaibo1986/article/details/8167590 ...

  3. 使用selenium webdriver+beautifulsoup+跳转frame,实现模拟点击网页下一页按钮,抓取网页数据

    记录一次快速实现的python爬虫,想要抓取中财网数据引擎的新三板板块下面所有股票的公司档案,网址为http://data.cfi.cn/data_ndkA0A1934A1935A1986A1995. ...

  4. [转载]爬虫的自我解剖(抓取网页HtmlUnit)

    网络爬虫第一个要面临的问题,就是如何抓取网页,抓取其实很容易,没你想的那么复杂,一个开源HtmlUnit包,4行代码就OK啦,例子如下: 1 2 3 4 final WebClient webClie ...

  5. 爬虫的自我解剖(抓取网页HtmlUnit)

    网络爬虫第一个要面临的问题,就是如何抓取网页,抓取其实很容易,没你想的那么复杂,一个开源`HtmlUnit`包,4行代码就OK啦,例子如下: final WebClient webClient=new ...

  6. 利用Crowbar抓取网页异步加载的内容 [Python俱乐部]

    利用Crowbar抓取网页异步加载的内容 [Python俱乐部] 利用Crowbar抓取网页异步加载的内容 在做 Web 信息提取.数据挖掘的过程中,一个关键步骤就是网页源代码的获取.但是出于各种原因 ...

  7. PHP使用CURL抓取网页

    CURL是一个非常强大的开源库,支持很多协议,包括HTTP.FTP.TELNET等,我们使用它来发送HTTP请求.它给我 们带来的好处是可以通过灵活的选项设置不同的HTTP协议参数,并且支持HTTPS ...

  8. python抓取网页过程

    准备过程 1.抓取网页的过程 准备好http请求(http request)->提交对应的请求->获得返回的响应(http response)->获得网页源码 2.GET还是POST ...

  9. PHP利用Curl实现多线程抓取网页和下载文件

    PHP 利用 Curl  可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,然而因为php语言本身不支持多线程,所以开发爬虫程序效率并不高,一般采集 数据可以利用 PHPquery ...

随机推荐

  1. PHP策略模式1

    [IUser.php] <?php /** * 策略模式 * 将一组特定的行为和算法封装成类,用来适应某些特定的上下文环境,实现从硬编码到解耦 * 应用举例:电商系统针对不同性别跳转到不同的商品 ...

  2. Python Singleton模式

    注意:在重写__new__方法时,object.__new__(cls)不能传参数 #!/usr/bin/env python # -*- coding: utf-8 -*- class Single ...

  3. 将多行按分隔符"|"合成一行

    原数据文件s.txt api_test account info 参数错误 合并后数据格式 api_test|account||参数错误||||| 方法介绍: 1.sed + xargs sed 's ...

  4. linux 释放内存及查看内存命令

    查看内存使用情况: free -m 清理内存: echo 1 > /proc/sys/vm/drop_caches 再次查看内存使用情况 free -m 查看内存条数命令: dmidecode  ...

  5. System.ArgumentException: 目标数组的长度不够。请检查 destIndex 和长度以及数组的下限

    扫码支付接口将要上线,近几天在优化系统性能.昨天把日志Helper类的日志记录改成了使用Queue<T>对象来实现异步处理.做了单元测试,并模拟多线程来测试后,发现正常.今天将站点部署到准 ...

  6. python 定义类 简单使用

    在test.py文件里面 #coding=utf-8 #类的定义 class user: #定义私有属性 __name = '' __age = 0 #定义基本属性 sex = '' #定义构造函数 ...

  7. javascript 面向对象之路.2 - 小蜜蜂

    接着上篇文章继续. 要实现上篇中gif图片的效果, 我们要写js, 算法并不是很复杂, 本次也仅仅展示了实现功能的代码, 并没有从面向对象的角度去构思或重构代码. 这里, 我们定义了一些变量, 用来定 ...

  8. (转)Hashtable与ConcurrentHashMap区别

    ConcurrentHashMap融合了hashtable和hashmap二者的优势. hashtable是做了同步的,hashmap未考虑同步.所以hashmap在单线程情况下效率较高.hashta ...

  9. 如何删除WINDOWS中服务中不再使用的服务?

    右键选择那个不需要的服务,点击属性,看到"服务名",拷贝下来 然后通过管理员的方式进入到控制台,输入 sc delete "你刚才拷贝的服务名" ,就行了,注意 ...

  10. pymysql 数据库操控

    模块安装 pip install pymysql 执行sql语句 import pymysql #添加数据 conn = pymysql.connect(host='127.0.0.1', port= ...