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网络编程学习笔记(二):socket建立网络客户端
Jun 09 Python
python多进程实现进程间通信实例
Nov 24 Python
widows下安装pycurl并利用pycurl请求https地址的方法
Oct 15 Python
一文带你了解Python中的字符串是什么
Nov 20 Python
djang常用查询SQL语句的使用代码
Feb 15 Python
深入解析python中的实例方法、类方法和静态方法
Mar 11 Python
如何通过Python实现标签云算法
Jul 02 Python
Python列表(list)所有元素的同一操作解析
Aug 01 Python
Python操作excel的方法总结(xlrd、xlwt、openpyxl)
Sep 02 Python
使用Python打造一款间谍程序的流程分析
Feb 21 Python
Python 从attribute到property详解
Mar 05 Python
python:解析requests返回的response(json格式)说明
Apr 30 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性能的编码技巧以及性能优化详细解析
2013/08/24 PHP
php生成html文件方法总结
2014/12/01 PHP
使用xampp搭建运行php虚拟主机的详细步骤
2015/10/21 PHP
PHP常见的几种攻击方式实例小结
2019/04/29 PHP
PHP实现统计代码行数小工具
2019/09/19 PHP
jQuery的一些注意
2006/12/06 Javascript
Javascript中的数学函数集合
2007/05/08 Javascript
JS中的log对象获取以及debug的写法介绍
2014/03/03 Javascript
JavaScript使用二分查找算法在数组中查找数据的方法
2015/04/07 Javascript
js去除浏览器默认底图的方法
2015/06/08 Javascript
jQuery实现select模糊查询(反射机制)
2017/01/14 Javascript
Angular.js中处理页面闪烁的方法详解
2017/03/09 Javascript
jquery动态赋值id与动态取id方法示例
2017/08/21 jQuery
karma+webpack搭建vue单元测试环境的方法示例
2018/05/24 Javascript
Vue.js项目中管理每个页面的头部标签的两种方法
2018/06/25 Javascript
微信小程序bindinput与bindsubmit的区别实例分析
2019/04/17 Javascript
js贪心算法 钱币找零问题代码实例
2019/09/11 Javascript
Vue实现验证码功能
2019/12/03 Javascript
Python序列之list和tuple常用方法以及注意事项
2015/01/09 Python
python实现简单爬虫功能的示例
2016/10/24 Python
Python信息抽取之乱码解决办法
2017/06/29 Python
python实现kNN算法
2017/12/20 Python
python切片及sys.argv[]用法详解
2018/05/25 Python
Python 解决OPEN读文件报错 ,路径以及r的问题
2019/12/19 Python
AUC计算方法与Python实现代码
2020/02/28 Python
css3实现input输入框颜色渐变发光效果代码
2014/04/02 HTML / CSS
CSS3 真的会替代 SCSS 吗
2021/03/09 HTML / CSS
英国创新设计文具、卡片和礼品包装网站:Paperchase
2018/07/14 全球购物
波兰最大的电商平台:Allegro.pl
2021/02/06 全球购物
最新大学职业规划书范文
2013/12/30 职场文书
科技开发中心办公室主任岗位责任制
2014/02/10 职场文书
《临死前的严监生》教学反思
2014/02/13 职场文书
员工安全承诺书
2014/05/22 职场文书
安全负责人任命书
2014/06/06 职场文书
关于读书的演讲稿600字
2014/08/27 职场文书
反腐倡廉观后感
2015/06/08 职场文书