python-selenium实现的简易下载器,并常见错误解决
简易下载器的实现
支持代理、失败重试、确保包含指定ID元素(可根据需求自定义修改)
# coding: utf-8
from Utils import logging
from bs4 import BeautifulSoup as bs
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.proxy import ProxyType
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
class HtmlDownloader:
def __init__(self):
self.driver = webdriver.PhantomJS()
def setProxy(self, proxyStr):
# 利用DesiredCapabilities(代理设置)参数值,重新打开一个sessionId
proxy=webdriver.Proxy()
proxy.proxy_type=ProxyType.MANUAL
proxy.http_proxy=proxyStr
# 将代理设置添加到webdriver.DesiredCapabilities.PHANTOMJS中
proxy.add_to_capabilities(webdriver.DesiredCapabilities.PHANTOMJS)
self.driver.start_session(webdriver.DesiredCapabilities.PHANTOMJS)
def rmProxy(self):
# 还原为系统代理
proxy=webdriver.Proxy()
proxy.proxy_type=ProxyType.DIRECT
proxy.add_to_capabilities(webdriver.DesiredCapabilities.PHANTOMJS)
browser.start_session(webdriver.DesiredCapabilities.PHANTOMJS)
def download(self, returnType, url, ensureId, proxyStr = None):
if proxyStr:
self.setProxy(proxyStr)
else:
self.rmProxy()
self.driver.get(url)
# special for xxx.com
# your code here
# ensure for some element
try:
WebDriverWait(self.driver, 30).until(EC.presence_of_element_located((By.ID, ensureId)))
if returnType == "html":
downloadResult = self.driver.page_source
elif returnType == "bs":
downloadResult = bs(self.driver.page_source, 'lxml')
logging("i", "download %s bytes" % len(self.driver.page_source))
return downloadResult
except Exception,e:
logging("e", str(e))
finally:
self.driver.close()
def safeDownload(self, returnType, url, ensureId, proxyStr = None):
downloadResult = None
failTimes = 0
while not downloadResult:
downloadResult = self.download(returnType, url, ensureId, proxyStr)
if not downloadResult:
failTimes += 1
if failTimes == 5:
logging("w", "failed %s times, will abort" % failTimes)
break
logging("w", "failed %s times, will retry" % failTimes)
return downloadResult
元素不可见导致不能操作的错误
# ElementNotVisibleException: Message: {"errorMessage":"Element is not currently visible and may not be manipulated"
# Screenshot: available via screen
首先尝试设定窗口大小
self.driver.set_window_size(1024, 768)
不行的话再尝试滚动页面,如滚动到底部:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
python-selenium实现的简易下载器,并常见错误解决的更多相关文章
- Python实战:美女图片下载器,海量图片任你下载
Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知识总结.希望大家能够快速入门并学习 ...
- 使用python做一个IRC在线下载器
使用python做一个IRC在线下载器 1.开发流程 2.软件流程 3.开始 3.0 准备工作 3.1寻找API接口 3.2 文件模块 3.2.1 选择文件弹窗 3.2.2 提取文件名 3.2.2.1 ...
- 用python实现的百度音乐下载器-python-pyqt-改进版
之前写过一个用python实现的百度新歌榜.热歌榜下载器的博文,实现了百度新歌.热门歌曲的爬取与下载.但那个采用的是单线程,网络状况一般的情况下,扫描前100首歌的时间大概得到40来秒.而且用Pyqt ...
- 用 python 实现一个多线程网页下载器
今天上来分享一下昨天实现的一个多线程网页下载器. 这是一个有着真实需求的实现,我的用途是拿它来通过 HTTP 方式向服务器提交游戏数据.把它放上来也是想大家帮忙挑刺,找找 bug,让它工作得更好. k ...
- Python selenium自动化网页抓取器
(开开心心每一天~ ---虫瘾师) 直接入正题---Python selenium自动控制浏览器对网页的数据进行抓取,其中包含按钮点击.跳转页面.搜索框的输入.页面的价值数据存储.mongodb自动i ...
- Python 排错UnicodeEncodeError 'ascii' codec can't encode character 错误解决方法
Python UnicodeEncodeError 'ascii' codec can't encode character 错误解决方法 by:授客 QQ:1033553122 错误描述: py ...
- python selenium设置chrome的下载路径
python可以通过ChromeOptions设置chrome参数,如下载路径等,代码如下(python 3.6.7): #-*-coding=utf-8-*- from selenium impor ...
- python使用gevent实现并发下载器
并发下载原理 import gevent from gevent import monkey import urllib.request monkey.patch_all() def my_downl ...
- Python 2.6 安装wxPython后提示"64.....32"错误解决办法
ImportError: /usr/local/lib/wxPython-unicode-2.8.10.1/lib/python2.6/site-packages/wx-2.8-mac-unicode ...
随机推荐
- Missing iOS Distribution signing identity问题解决
问题描述 打包上传APPStore Xcode报以下错误:Missing iOS Distribution signing identity for XXXXXX 查看证书后发现,Develop证书 ...
- CI框架多目录设置
1,设置目的,前台与后台实现独立目录管理 2.通过http://www.myci.com 访问前台,通过http://www.myci.com/admin 访问后台, 多目录的意思是指在同一个网 ...
- mysql如何将一个表导出为excel表格
方法一:进入到mysql的控制台,输入: 1. SELECT * INTO OUTFILE ‘./test.xls‘ FROM tb1 WHERE 1 ORDER BY id DESC LIMIT ...
- python - zipfile
参考:http://www.cnblogs.com/sislcb/archive/2008/11/28/1342822.html zipfile - python处理zip文件的压缩与解压 ZipFi ...
- POJ3274-牛的属性-HASH-ACM
原题:POJ3274 参考:进击的阿俊 已知有n头牛,用一个K位二进制数Ak,Ak-1,...,A1表示一头牛具有的特征,Ai=1表示具有特征i.现给定按顺序排列的N头牛的k位特征值,称某个连续范围内 ...
- MySql数据库3【优化4】连接设置的优化
1.wait_timeout / interactive_timeout 连接超时 服务器关闭连接之前等待活动的秒数.MySQL所支持的最大连接数是有限的,因为每个连接的建立都会消耗内存,因此我们希 ...
- PHP获取每月第一天与最后一天
<?phpfunction getthemonth($date){$firstday = date('Y-m-01', strtotime($date));$lastday = date('Y- ...
- Python 异常处理--raise函数用法
raise语句手工引发一个异常: "raise" [expression ["," expression ["," expression]] ...
- [原创]用python写了一个简单的markdown编辑器
以前我常用openoffice记录东西,最喜欢它的当然是在linux上能用了,还有里面的公式输入,前几天才了解markdown这个东东,初步了解发现它正是我需要的东西,可以用它随心所欲地记录些东西,而 ...
- iOS中浅淡UIApplication单例-b
在iOS的操作系统中 每一个程序都对应一个application单例,每一个application都对应一个Appdelegate代理,在代理中控制程序的各个状态.我们在程序中获取Applicatio ...