自制python图片下载器

这个代码的原理是用百度作为访问点,脚本根据使用者所输入的关键字去搜索图片,并且下载到使用者所创建的文件夹中。

下面为代码实例:

# encoding = 'UTF-8'
__author__ = '_chao'


import requests,urllib
import re
import sys
import socket
import os

from urllib import request


headers = {
    'Connection': 'keep-alive',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3346.9 Safari/537.36',
    'cookie':'BAIDUID=DA4019EA9B9C2455A0D0518917126251:FG=1; BIDUPSID=DA4019EA9B9C2455A0D0518917126251; PSTM=1519563931; BDUSS=5BVjZGeVczVGlWb2plc2NrVVNhOFRGczdaaUQ3aHZ5dURlZDZVYXF4UkFPc3BhQVFBQUFBJCQAAAAAAAAAAAEAAADdyqxfWWNXZWlkb2xpZWIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECtolpAraJaYm; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; H_PS_PSSID=1441_21088; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; PSINO=7; BDRCVFR[dG2JNJb_ajR]=mk3SLVN4HKm; userFrom=ala; BDRCVFR[tox4WRQ4-Km]=mk3SLVN4HKm'
}


old_url = []                                                                # 用来存放已经下载过的url

def download_imgs(html,word):
        socket.setdefaulttimeout(3)                                         # 对整个socket层设置超时时间
        tank_url = []                                                       # 存放匹配到的url
        img_urls = re.findall(r'"objURL":"(.*?)",',html)                    # 取"objURL":"和“,中间的那段
        tank_url.append(img_urls)                                           # 向tank_url中添加url
        for urls in tank_url:                                               # urls为一个列表中的多个url
            for url in urls:
                if url not in old_url:                                      # 判断是否为下载过的url,不是即下载
                    try:
                        pic = requests.get(url,timeout=5)                   # 设定请求超时5秒
                        if pic.status_code == 200:                          # 请求状态码为200(正常)的才下载
                            old_url.append(url)
                            print('正在下载第%s张的图片...' % (len(old_url))) # 获取old_url中的元素个数即可知道当前图片个数
                            request.urlretrieve(url, r'D:/'+filemane+'/img_%s.jpg' %len(old_url))
                            print('下载完成\n-------------')
                        else:
                            print('【网站请求错误!】---404')                  
                    except  Exception as e:
                        print('【网站异常!】:',e)
                else:
                    print('【已过滤重复图片】')


if __name__ == '__main__':
    print('=======================================欢迎使用超超图片下载软件=======================================\n')
    print('*****************************************************************************************************\n')
    
    path = r'D:'
    filemane = input('_________________请输入存放图片的文件夹名(默认在D盘,文件名不能重复!): ')
    os.path.isdir(path)                                                                                         # 没有not时,创建文件夹。加not为存在文件夹时,继续存入。---if not...
    os.mkdir(os.path.join(path, filemane))                                                                      # 在该路径创建一个文件夹
    print('                 【创建成功!】\n')
    word = input('_________________请输入搜索关键字 : ' )
    word = word.encode('utf-8')                                                                                 # 将输入的中文字符串转化成utf-8格式(十六进制),此时word = 'xe4\xb8\xad\xe6\x96\x87'
    s = urllib.request.quote(word.decode(sys.stdin.encoding).encode('utf8'))                                    # 再将十六进制中文转化为url编码格式,如s = '%2%3%q'
    for page in range(0,1181,20):                                                                               # 每隔20换一个页面      
        url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word='+s+'&pn={}&gsm='.format(page)    # 实现翻页,获取大量url
        response = requests.get(url,headers = headers)                                                          # 请求url
        if response.status_code == 200:                                                                         # 当状态吗为200时,才执行下载操作
            html = response.text                                                                                # 将获取的相应解析出来
            download_imgs(html, word)                                                                           # 给下载器函数传入解析页面信息和输入关键字
        else:
            pass
    exit(0)

-----这个脚本理论上的能把百度上有的关键字图片都下载下来。但是因为百度图片只有开始的前几页才是比较好看,比较符合关键字的图片,所以建议只爬取100张左右即可,否则图片质量很低。

-----可以考虑在一些大型图片下载网站爬取,期待下次的改进版本!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值