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中字典dict常用操作方法实例总结
Apr 04 Python
Python中的自省(反射)详解
Jun 02 Python
Python数据操作方法封装类实例
Jun 23 Python
Python编程之gui程序实现简单文件浏览器代码
Dec 08 Python
Jupyter安装nbextensions,启动提示没有nbextensions库
Apr 23 Python
Python实现深度遍历和广度遍历的方法
Jan 22 Python
python实现本地批量ping多个IP的方法示例
Aug 07 Python
Anaconda之conda常用命令介绍(安装、更新、删除)
Oct 06 Python
Python树莓派学习笔记之UDP传输视频帧操作详解
Nov 15 Python
简单了解django处理跨域请求最佳解决方案
Mar 25 Python
keras slice layer 层实现方式
Jun 11 Python
浅谈Selenium 控制浏览器的常用方法
Dec 04 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
第三节--定义一个类
2006/11/16 PHP
php及codeigniter使用session-cookie的方法(详解)
2017/04/06 PHP
PHP简单实现二维数组的矩阵转置操作示例
2017/11/24 PHP
PHP生成指定范围内的N个不重复的随机数
2019/03/18 PHP
用jscript实现列出安装的软件列表
2007/06/18 Javascript
javascript 24小时弹出一次的代码(利用cookies)
2009/09/03 Javascript
ymPrompt的doHandler方法来实现获取子窗口返回值的方法
2010/06/25 Javascript
在javascript将NodeList作为Array数组处理的方法
2010/07/09 Javascript
js用Date对象处理时间实现思路及代码
2013/01/31 Javascript
javascript中的throttle和debounce浅析
2014/06/06 Javascript
javascript与css3动画结合使用小结
2015/03/11 Javascript
js实现将选中内容分享到新浪或腾讯微博
2015/12/16 Javascript
JS常用算法实现代码
2016/11/14 Javascript
利用express启动一个server服务的方法
2017/09/17 Javascript
React.js绑定this的5种方法(小结)
2018/06/05 Javascript
Vue实现点击显示不同图片的效果
2019/08/10 Javascript
jQuery实现移动端下拉展现新的内容回弹动画
2020/06/24 jQuery
[02:32]DOTA2完美大师赛场馆静安体育中心观赛全攻略
2017/11/08 DOTA
Python的几个高级语法概念浅析(lambda表达式闭包装饰器)
2016/05/28 Python
Python实现识别手写数字 Python图片读入与处理
2020/03/23 Python
python实现比较文件内容异同
2018/06/22 Python
Django进阶之CSRF的解决
2018/08/01 Python
在Pycharm中执行scrapy命令的方法
2019/01/16 Python
Python爬虫实现爬取百度百科词条功能实例
2019/04/05 Python
Python基础之高级变量类型实例详解
2020/01/03 Python
Python tkinter三种布局实例详解
2020/01/06 Python
Python小白不正确的使用类变量实例
2020/05/29 Python
Python爬虫开发与项目实战
2020/12/16 Python
python Protobuf定义消息类型知识点讲解
2021/03/02 Python
小学生开学感言
2014/02/28 职场文书
中华美德颂演讲稿
2014/05/20 职场文书
2015年学校教务处工作总结
2015/05/11 职场文书
2016年小学教师政治学习心得体会
2016/01/23 职场文书
话题作文之学会尊重
2019/12/16 职场文书
mysql 直接拷贝data 目录下文件还原数据的实现
2021/07/25 MySQL
python_tkinter事件类型详情
2022/03/20 Python