简易下载器的实现

支持代理、失败重试、确保包含指定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通过url下载文件不可读_python-selenium实现的简易下载器,并常见错误解决相关推荐

  1. 小程序配置阿里云OSS下载文件,在请求头里配置生成强制下载链接,(拿到下载链接可以下载文件至本地)

    小程序配置阿里云OSS下载文件,在请求头里配置生成强制下载链接,(拿到下载链接可以下载文件至本地)(Win10电脑开发环境)**这里只说明小程序端问题**<菜鸡总结大神勿喷!蟹蟹~> 大体 ...

  2. ftp服务器上的文件发生错误450,FTP常见错误解决办法

    一般来说,只要网站能访问,FTP就应该能连接的,之前好长一段时间一直遇到连接不上香港主机的问题,还以为是宽带出口线路不好,原来是自己学识浅薄,在同事的指点下才明白所以然,下面总结一下FTP连接中的常见 ...

  3. python下载文件加上日期_Python实现给下载文件显示进度条和下载时间代码

    本篇文章小编给大家分享一下Python实现给下载文件显示进度条和下载时间代码,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 该模块调用了三个库: 1. ...

  4. python urllib下载文件怎么停止_python下载文件的三种方法

    Python开发中时长遇到要下载文件的情况,最常用的方法就是通过Http利用urllib或者urllib2模块. 当然你也可以利用ftplib从ftp站点下载文件.此外Python还提供了另外一种方法 ...

  5. python下载文件暂停恢复_python下载文件记录黑名单的实现代码

    具体代码如下所示: #!/usr/bin/python # -*- coding: GBK -*- # -*- coding: UTF-8 -*- from ftplib import FTP imp ...

  6. python模拟浏览器下载文件在哪里_python下selenium模拟浏览器基础操作

    1.安装及下载 selenium安装: pip install selenium  即可自动安装selenium geckodriver下载:https://github.com/mozilla/ge ...

  7. python下载文件并改名_python – 重命名下载的文件selenium

    我正在使用selenium从此页面自动下载csv格式的文件: 这是我正在使用的代码: profile = webdriver.FirefoxProfile() profile.set_preferen ...

  8. python下载文件并改名_Python 实现自动重命名网易云音乐下载文件

    网易云音乐 PC 版的下载文件都是按照 歌手名 - 歌曲名.mp3 的格式命名的,然而我比较喜欢直接以歌曲名作为文件名.手动一个一个文件改肯定是不行的,太 tm 蠢了(笑 以前我是用 shell 写的 ...

  9. python怎样判断一个文件是否存在_python如何判断一个文件是否存在

    python如何判断一个文件是否存在 发布时间:2020-09-23 11:38:42 来源:亿速云 阅读:82 作者:Leah python如何判断一个文件是否存在?针对这个问题,这篇文章详细介绍了 ...

最新文章

  1. 2020年行政区划代码_2020年南宁市行政区划,了解南宁市有几个区,详细数据
  2. 为什么a*算法采用哈密尔顿距离作为启发函数比不在位数为启发函数的性能要好?_【论文研读】路径规划中的Hybrid A*算法...
  3. 微服务很香--麻辣味,但要慢慢消化
  4. hdu4353 Finding Mine三角形内的点数
  5. java怎么确定数据在区间内_处理数据时,单元格内内容太多无法计数怎么破?...
  6. 101次从入门到放弃,终于找到一个数据分析利器!
  7. ANDROID定义自己的看法——onMeasure,MeasureSpec源代码 过程 思考具体解释
  8. java求立方体表面积和体积_有关正方体、长方体表面积和体积的计算题
  9. Win7扫雷的H5完整复刻实现(一) / js扫雷算法的初次鉴定与地图初始化实现
  10. StataIC——协整检验与误差修正模型
  11. 荣耀安装google谷歌服务框架_荣耀V20怎么下载安装谷歌服务助手,GMS框架安装教程...
  12. SDU程序设计思维Week15-作业 字符串
  13. qq拼音 搜狗拼音的对比
  14. 自定义SharePoint新网站创建过程(2)
  15. 无线测温采集设备及无线测温监控系统的选型指导-安科瑞王婧
  16. When Color Constancy Goes Wrong:Correcting Improperly White-Balanced Images阅读札记
  17. js实现微信表情发送
  18. 【情暖寒冬 让爱同行】中创算力开展“寒冬送温暖”公益活动
  19. Vue项目中created生命周期重复执行,未缓存下来
  20. ubuntu 下 电驴下载及配置

热门文章

  1. C++ const 关键字小结
  2. C++ vector的用法
  3. 深度学习--数据增强
  4. Spring Cloud Feign设计原理
  5. mpvue小程序架构搭建详细介绍
  6. 图片轮播,纯js+css
  7. 在MOSS 2007中查看文档库和站点的大小
  8. ThinkPHP 学习笔记 ( 一 ) 项目部署:应用部署方式与模块分组部署方式
  9. Apache服务器部署ASP.NET网站
  10. 当 IDENTITY_INSERT 设置为 OFF 时,不能为表中的标识列插入显式值