python批量下载图片的三种方法

806次阅读  |  发布于5年以前

有三种方法,一是用微软提供的扩展库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()

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8