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面向对象_详谈类的继承与方法的重载
Jun 07 Python
python嵌套字典比较值与取值的实现示例
Nov 03 Python
使用python判断你是青少年还是老年人
Nov 29 Python
python 格式化输出百分号的方法
Jan 20 Python
python调用matlab的m自定义函数方法
Feb 18 Python
python开发游戏的前期准备
May 05 Python
python文字转语音的实例代码分析
Nov 12 Python
Python字典中的值为列表或字典的构造实例
Dec 16 Python
浅谈pytorch中torch.max和F.softmax函数的维度解释
Jun 28 Python
Python批量将csv文件转化成xml文件的实例
May 10 Python
还在手动盖楼抽奖?教你用Python实现自动评论盖楼抽奖(一)
Jun 07 Python
宝塔更新Python及Flask项目的部署
Apr 11 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 伪静态之IIS篇
2014/06/02 PHP
tp5 sum某个字段相加得到总数的例子
2019/10/18 PHP
Extjs学习笔记之九 数据模型(上)
2010/01/11 Javascript
Tinymce+jQuery.Validation使用产生的BUG
2010/03/29 Javascript
实现局部遮罩与关闭原理及代码
2013/02/04 Javascript
JavaScript中判断整字类型最简洁的实现方法
2014/11/08 Javascript
JavaScript实现按照指定长度为数字前面补零输出的方法
2015/03/19 Javascript
JavaScript使用指针操作实现约瑟夫问题实例
2015/04/07 Javascript
基于jQuery实现的扇形定时器附源码下载
2015/10/20 Javascript
jquery滚动条插件(可以自定义)
2016/12/11 Javascript
基于Angular.js实现的触摸滑动动画实例代码
2017/02/19 Javascript
jQuery实现图片上传预览效果功能完整实例【测试可用】
2018/05/28 jQuery
原生JS实现的轮播图功能详解
2018/08/06 Javascript
jQuery实现购物车的总价计算和总价传值功能
2018/11/28 jQuery
VUE简单的定时器实时刷新的实现方法
2019/01/20 Javascript
详解为什么Vue中的v-if和v-for不建议一起用
2021/01/13 Vue.js
跟老齐学Python之坑爹的字符编码
2014/09/28 Python
跟老齐学Python之Python文档
2014/10/10 Python
Python中生成器和迭代器的区别详解
2018/02/10 Python
对python指数、幂数拟合curve_fit详解
2018/12/29 Python
8种用Python实现线性回归的方法对比详解
2019/07/10 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
2019/11/25 Python
飞利浦比利时官方网站:Philips比利时
2016/08/24 全球购物
GE设备配件:GE Appliance Parts(家电零件、配件和滤水器)
2018/11/28 全球购物
bonprix荷兰网上商店:便宜的服装、鞋子和家居用品
2020/07/04 全球购物
非常详细的C#面试题集
2016/07/13 面试题
庆元旦文艺演出主持词
2014/03/27 职场文书
学校志愿者活动总结
2014/06/27 职场文书
百万英镑观后感
2015/06/09 职场文书
成功的商业计划书这样写才最靠谱
2019/07/12 职场文书
导游词之南京栖霞山
2019/10/18 职场文书
python3 hdf5文件 遍历代码
2021/05/19 Python
浅谈MySQL表空间回收的正确姿势
2021/10/05 MySQL
python编程简单几行代码实现视频转换Gif示例
2021/10/05 Python
Python 恐龙跑跑小游戏实现流程
2022/02/15 Python
「海贼王」112.9万粉丝纪念图标公布
2022/03/21 日漫