python批量下载图片的三种方法


Posted in Python onApril 22, 2013

有三种方法,一是用微软提供的扩展库win32com来操作IE,二是用selenium的webdriver,三是用python自带的HTMLParser解析。win32com可以获得类似js里面的document对象,但貌似是只读的(文档都没找到)。selenium则提供了Chrome,IE,FireFox等的支持,每种浏览器都有execute_script和find_element_by_xx方法,可以方便的执行js脚本(包括修改元素)和读取html里面的元素。不足是selenium只提供对python2.6和2.7的支持。HTMLParser则是需要自己写个类继承基类,重写解析元素的方法。个人感觉selenium用起来更方便,很容易操作html里的元素。
代码如下:

win32com:

#将滚动条滑到底,最多滑动20000像素
#模拟键盘右键,查看多张图片
import sys
import win32com.client,win32api
import urllib.request
import time
import os
def main():
    #获取参数
    url=sys.argv[1]
    #操作IE
    ie=win32com.client.Dispatch("InternetExplorer.Application")
    ie.Navigate(url)
    ie.Visible=True
    last_url=''
    dir_name=''
    while last_url!=url:
        print('\nThe URL is:',url,'\n')
        while ie.ReadyState != 4:    
            time.sleep(1)
        while ie.Document.readyState != "complete": 
            time.sleep(1)
        #滑动滚动条
        win=ie.Document.parentWindow
        lastY=-1;
        for i in range(40):
            win.scrollTo(0,500*i)
            nowY=win.pageYOffset
            if(nowY==lastY):
                break
            lastY=nowY
            time.sleep(0.4)
        print('Document load state:',ie.Document.readyState)
        doc=ie.Document
        #第一次需要创建目录
        if(dir_name==''):
            root_dir='E:\\img'
            dir_name=root_dir+'\\'+doc.title
            dir_name=dir_name.replace('|','-')
            if(os.path.exists(root_dir)!=True):
                os.mkdir(root_dir)
            if(os.path.exists(dir_name)!=True):
                os.mkdir(dir_name)
        all_image=doc.images
        print('共有',all_image.length,'张图片')
        count=0;
        for img in all_image:
            if(img.id=='b_img'):
                count=count+1
                print(count,img.src)
                time.sleep(1)
                img_file=urllib.request.urlopen(img.src)
                byte=img_file.read()
                print(count,'donwload complete!','-'*10,'size:','{:.3}'.format(byte.__len__()/1024),'KB')
                if(byte.__len__()>7000):
                    file_name=img.src.replace('/','_')
                    file_name=file_name.replace(':','_')
                    end=file_name.__len__()
                    if(file_name.rfind('!')!=-1):
                        end=file_name.rfind('!')
                    if(file_name.rfind('?')!=-1):
                        end=file_name.rfind('?')
                    file_name=file_name[:end]
                    write_file=open(dir_name+'\\'+file_name,'wb')
                    write_file.write(byte)
                    write_file.close()
                    print(count,file_name,'complete!')
        #下一张
        last_url=url
        win32api.keybd_event(39,0)
        time.sleep(1)
        url=ie.Document.url
        print(last_url,url)
    #ie.Quit()
if __name__ == '__main__':
    main()

selenium:

# -*- coding: cp936 -*-
import sys
import urllib
import time
import os
from selenium import webdriver
def main():
    #获取参数
    url=sys.argv[1]
    #操作IE
    driver=webdriver.Chrome()
    driver.get(url)
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    #创建目录
    dir_name=driver.find_element_by_tag_name('title').text
    print dir_name
    root_dir='E:\\img'
    dir_name=root_dir+'\\'+dir_name
    dir_name=dir_name.replace('|','-')
    if(os.path.exists(root_dir)!=True):
        os.mkdir(root_dir)
    if(os.path.exists(dir_name)!=True):
        os.mkdir(dir_name)
    images=driver.find_elements_by_tag_name('img')
    count=0
    for image in images:
        count=count+1
        image_url=str(image.get_attribute('src'))
        img_file=urllib.urlopen(image_url)
        byte=img_file.read()
        print count,'donwload complete!','-'*10,'size:',byte.__len__()/1024,'KB'
        if(byte.__len__()>7000):
            file_name=image_url.replace('/','_')
            file_name=file_name.replace(':','_')
            end=file_name.__len__()
            if(file_name.rfind('!')!=-1):
                end=file_name.rfind('!')
            if(file_name.rfind('?')!=-1):
                end=file_name.rfind('?')
            file_name=file_name[:end]
            write_file=open(dir_name+'\\'+file_name,'wb')
            write_file.write(byte)
            write_file.close()
            print count,file_name,'complete!'
    driver.quit()
if __name__ == '__main__':
    main()

HTMLParser:

# import modules used here -- sys is a very standard one
import sys
import urllib.request
# Gather our code in a main() function
from html.parser import HTMLParser
class MyHTMLParser(HTMLParser):
    def handle_starttag(self,tag,attrs):
        if(tag=='img'):
            for attr in attrs:
                if(attr[0]=='src'):
                    img_file=urllib.request.urlopen(attr[1])
                    byte=img_file.read()
                    #文件大于1000b则生成文件,添加计数,下载多少图片,显示html代码
                    if(byte.__len__()>1000):
                        file_name=attr[1].replace('/','_')
                        file_name=file_name.replace(':','_')
                        end=file_name.__len__()
                        if(file_name.rfind('!')!=-1):
                            end=file_name.rfind('!')
                        if(file_name.rfind('?')!=-1):
                            end=file_name.rfind('?')
                        file_name=file_name[:end]
##                        print(file_name)
                        write_file=open('E:\\img\\'+file_name,'wb')
                        write_file.write(byte)
                        write_file.close()
def main():
    #获取参数
    url=sys.argv[1]
    print('\nThe URL is:',url,'\n')
    #读取url所指向的资源
    html_file=urllib.request.urlopen(url)
    byte_content=html_file.read()
    #将html网页保存起来
    url_file=open('E:\\img\\html\\result.htm','wb')
    url_file.write(byte_content)
    url_file.close()
    #从字节转换为字符串
    s=str(byte_content, encoding = "utf-8")
    #print(s)
    #bytes.decode(html_file.read())
    parser=MyHTMLParser(strict=False)
    parser.feed(s)
# Standard boilerplate to call the main() function to begin
# the program.
if __name__ == '__main__':
    main()
Python 相关文章推荐
Python基础篇之初识Python必看攻略
Jun 23 Python
使用Python读取大文件的方法
Feb 11 Python
使用Python获取并处理IP的类型及格式方法
Nov 01 Python
Python中的取模运算方法
Nov 10 Python
解决pycharm运行出错,代码正确结果不显示的问题
Nov 30 Python
Python Flask 搭建微信小程序后台详解
May 06 Python
python利用itertools生成密码字典并多线程撞库破解rar密码
Aug 12 Python
TensorFLow 不同大小图片的TFrecords存取实例
Jan 20 Python
python3 xpath和requests应用详解
Mar 06 Python
python shapely.geometry.polygon任意两个四边形的IOU计算实例
Apr 12 Python
小结Python的反射机制
Sep 28 Python
Python 列表推导式需要注意的地方
Oct 23 Python
如何运行Python程序的方法
Apr 21 #Python
python读取注册表中值的方法
Apr 08 #Python
重命名批处理python脚本
Apr 05 #Python
Python编写的com组件发生R6034错误的原因与解决办法
Apr 01 #Python
Python中用Ctrl+C终止多线程程序的问题解决
Mar 30 #Python
python利用hook技术破解https的实例代码
Mar 25 #Python
利用python获得时间的实例说明
Mar 25 #Python
You might like
php中file_get_contents与curl性能比较分析
2014/11/08 PHP
php使用get_class_methods()函数获取分类的方法
2016/07/20 PHP
实例分析PHP将字符串转换成数字的方法
2019/01/27 PHP
js压缩工具 yuicompressor 使用教程
2010/03/31 Javascript
为超链接加上disabled后的故事
2010/12/10 Javascript
关于textarea提交的内容无法换行的解决办法
2013/04/09 Javascript
js 表单提交后按钮变灰的实例代码
2013/08/16 Javascript
基于JavaScript实现回到页面顶部动画代码
2016/05/24 Javascript
跨域请求的完美解决方法(JSONP, CORS)
2016/06/12 Javascript
总结javascript中的六种迭代器
2016/08/16 Javascript
JavaScript实现页面定时刷新(定时器,meta)
2016/10/12 Javascript
基于Bootstrap仿淘宝分页控件实现代码
2016/11/07 Javascript
bootstrap modal弹出框的垂直居中
2016/12/14 Javascript
js阻止移动端页面滚动的两种方法
2017/01/25 Javascript
Vue声明式渲染详解
2017/05/17 Javascript
深入浅析ES6 Class 中的 super 关键字
2017/10/20 Javascript
jQuery实现的响应鼠标移动方向插件用法示例【附源码下载】
2018/08/28 jQuery
vue+element-ui实现表格编辑的三种实现方式
2018/10/31 Javascript
npm全局环境变量配置详解
2020/12/15 Javascript
haskell实现多线程服务器实例代码
2013/11/26 Python
python判断数字是否是超级素数幂
2018/09/27 Python
Django 解决新建表删除后无法重新创建等问题
2020/05/21 Python
浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)
2020/06/04 Python
浅析图片上传及canvas压缩的流程
2020/06/10 HTML / CSS
英国经济型酒店品牌:Travelodge
2019/12/17 全球购物
外企C语言笔试题
2013/11/10 面试题
十一个高级MySql面试题
2014/10/06 面试题
教师年终个人自我评价
2013/10/04 职场文书
宿舍保安职务说明书
2014/02/25 职场文书
建筑公司员工自我鉴定
2014/04/08 职场文书
市级青年文明号申报材料
2014/05/26 职场文书
趣味运动会广播稿
2014/09/13 职场文书
领导干部遵守党的政治纪律情况思想汇报
2014/09/14 职场文书
质量承诺书格式范文
2015/04/28 职场文书
家长意见和建议怎么写
2015/06/04 职场文书
新闻简讯格式及范文
2015/07/22 职场文书