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 相关文章推荐
读写json中文ASCII乱码问题的解决方法
Nov 05 Python
python计算两个矩形框重合百分比的实例
Nov 07 Python
对python自动生成接口测试的示例讲解
Nov 30 Python
python 读取修改pcap包的例子
Jul 23 Python
解决django 新增加用户信息出现错误的问题
Jul 28 Python
pandas如何处理缺失值
Jul 31 Python
python selenium 执行完毕关闭chromedriver进程示例
Nov 15 Python
Python字典取键、值对的方法步骤
Sep 30 Python
Python文件的操作示例的详细讲解
Apr 08 Python
pytorch MSELoss计算平均的实现方法
May 12 Python
Python 实现绘制子图及子图刻度的变换等问题
May 31 Python
Python中如何处理常见报错
Jan 18 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
DC这些乐高系列动画电影你看过几部?
2020/04/09 欧美动漫
PHP中数字检测is_numeric与ctype_digit的区别介绍
2012/10/04 PHP
PHP开发框架kohana3 自定义路由设置示例
2014/07/14 PHP
PHP中几个可以提高运行效率的代码写法、技巧分享
2014/08/21 PHP
php生成4位数字验证码的实现代码
2015/11/23 PHP
PHP addAttribute()函数讲解
2019/02/03 PHP
JavaScript窗口功能指南之在窗口中书写内容
2006/07/21 Javascript
jquery animate 动画效果使用说明
2009/11/04 Javascript
js获取网页高度(详细整理)
2012/12/28 Javascript
jQuery 操作input中radio的技巧
2016/07/18 Javascript
[js高手之路]原型式继承与寄生式继承详解
2017/08/28 Javascript
js实现点击按钮复制文本功能
2020/07/20 Javascript
vue移动端监听滚动条高度的实现方法
2018/09/03 Javascript
微信小程序实现的绘制table表格功能示例
2019/04/26 Javascript
Vue的属性、方法、生命周期实例代码详解
2019/09/17 Javascript
javascript实现动态时钟的启动和停止
2020/07/29 Javascript
javascript局部自定义鼠标右键菜单
2020/12/08 Javascript
[51:53]完美世界DOTA2联赛决赛日 Inki vs LBZS 第二场 11.08
2020/11/10 DOTA
Python写的一个简单DNS服务器实例
2014/06/04 Python
virtualenv实现多个版本Python共存
2017/08/21 Python
简单了解Python中的几种函数
2017/11/03 Python
Django添加sitemap的方法示例
2018/08/06 Python
Python 输出时去掉列表元组外面的方括号与圆括号的方法
2018/12/24 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
2019/09/25 Python
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
2019/12/09 Python
Python 音频生成器的实现示例
2019/12/24 Python
python 如何上传包到pypi
2020/12/24 Python
python反扒机制的5种解决方法
2021/02/06 Python
adidas澳大利亚官方网站:adidas Australia
2018/04/15 全球购物
有影响力的品牌之家:Our Social Collective
2019/06/08 全球购物
竞选班长自荐书范文
2014/03/09 职场文书
怎样写离婚协议书
2014/09/10 职场文书
委托公证书样本
2015/01/23 职场文书
秋菊打官司观后感
2015/06/03 职场文书
新店开张宣传语
2015/07/13 职场文书
mysql连接查询中and与where的区别浅析
2021/07/01 MySQL