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 相关文章推荐
忘记ftp密码使用python ftplib库暴力破解密码的方法示例
Jan 22 Python
python利用有道翻译实现"语言翻译器"的功能实例
Nov 14 Python
Python学习pygal绘制线图代码分享
Dec 09 Python
不管你的Python报什么错,用这个模块就能正常运行
Sep 14 Python
使用python3实现操作串口详解
Jan 01 Python
Django工程的分层结构详解
Jul 18 Python
pytorch获取vgg16-feature层输出的例子
Aug 20 Python
python3.8与pyinstaller冲突问题的快速解决方法
Jan 16 Python
TensorFlow实现从txt文件读取数据
Feb 05 Python
opencv+python实现均值滤波
Feb 19 Python
python3.7+selenium模拟淘宝登录功能的实现
May 26 Python
Python classmethod装饰器原理及用法解析
Oct 17 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
ThinkPHP自定义Redis处理SESSION的实现方法
2016/05/16 PHP
PHP 计算两个时间段之间交集的天数示例
2019/10/24 PHP
Laravel框架中队列和工作(Queues、Jobs)操作实例详解
2020/04/06 PHP
PHP实现简单日历类编写
2020/08/28 PHP
accesskey 提交
2006/06/26 Javascript
在浏览器中获取当前执行的脚本文件名的代码
2011/07/19 Javascript
JS弹出对话框实现方法(三种方式)
2015/12/18 Javascript
Bootstrap教程JS插件滚动监听学习笔记分享
2016/05/18 Javascript
JavaScript学习笔记整理_关于表达式和语句
2016/09/19 Javascript
JS 动态判断PC和手机浏览器实现代码
2016/09/21 Javascript
Ajax异步获取html数据中包含js方法无效的解决方法
2017/02/20 Javascript
JavaScript函数表达式详解及实例
2017/05/05 Javascript
node.js操作mongodb简单示例分享
2017/05/25 Javascript
JS处理一些简单计算题
2018/02/24 Javascript
Vue用v-for给src属性赋值的方法
2018/03/03 Javascript
js合并两个数组生成合并后的key:value数组
2018/05/09 Javascript
了解JavaScript表单操作和表单域
2019/05/27 Javascript
MockJs结合json-server模拟后台数据
2020/08/26 Javascript
微信小程序自定义组件components(代码详解)
2019/10/21 Javascript
vue项目打包之开发环境和部署环境的实现
2020/04/23 Javascript
在Python的Django框架中创建语言文件
2015/07/27 Python
Python使用selenium实现网页用户名 密码 验证码自动登录功能
2018/05/16 Python
Python爬虫框架Scrapy基本用法入门教程
2018/07/26 Python
python实现一个简单的udp通信的示例代码
2019/02/01 Python
python爬取微信公众号文章的方法
2019/02/26 Python
Python爬虫 bilibili视频弹幕提取过程详解
2019/07/31 Python
Python函数基本使用原理详解
2020/03/19 Python
python属于解释语言吗
2020/06/11 Python
德国高尔夫商店:Golfshop.de
2019/06/22 全球购物
在线实验室测试:HealthLabs.com
2020/05/03 全球购物
党的群众路线对照检查材料
2014/08/27 职场文书
小学德育工作总结2015
2015/05/12 职场文书
甲午风云观后感
2015/06/02 职场文书
Nginx工作原理和优化总结。
2021/04/02 Servers
一文搞懂php的垃圾回收机制
2021/06/18 PHP
Golang原生rpc(rpc服务端源码解读)
2022/04/07 Golang