ホームページ >バックエンド開発 >Python チュートリアル >Pythonで画像をバッチでダウンロードする3つの方法

Pythonで画像をバッチでダウンロードする3つの方法

WBOY
WBOYオリジナル
2016-06-16 08:46:351173ブラウズ

有三种方法,一是用微软提供的扩展库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]
#operIE
ie=win32com.client.Dispatch("InternetExplorer.Application")
ie.Navigate(url)
ie.Visible=True
last_url=''
dir_name=''
while last_url!=url:
print('nURL は:', 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('ドキュメントのロード状態:'、つまりドキュメント.readyState)
doc=ie.Document
#第一次必要创建目录
if(dir_name==''):
root_dir='E:\img'
dir _name=ルートディレクトリ+ '\'+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,'ダウンロード完了!', '-'*10,'サイズ:','{:.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('/ '、' _ ')
rfind('! ') 1):
end=file_name.rfind('?')
file_name=file_name[:end ]
## .write(byte)
>
def main():
#パラメータを取得
url=sys.argv[1]
print('nURL は:',url,'n')
#URL を読み取るリソースが指している
html_file=urllib.request.urlopen(url)

byte_content=html_file.read()

#HTML Web ページを保存します
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)
# 標準定型文main() 関数を呼び出して
# プログラムを開始します。
if __name__ == '__main__':
main()


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。