欢迎光临!
若无相欠,怎会相见

Python学习之BeautifulSoup 4 下载图片

今天学习的是 BeautifulSoup 4,使用 BeautifulSoup 4 下载图片。

其实,网上有很多人使用 BeautifulSoup 4 模块编写爬虫,不过,本次我的实验还不是爬虫,只是一个单纯的图片下载器。

模块

本次使用到的模块有:urllib2,optparse,beautifulsoup4,OS,urlparse。

其中,urllib2的作用是处理从 urls 接收的数据。optparse模块用于命令行的参数。beautifulsoup的主要功能是从网页抓取数据。OS模块提供了很多与操作系统交互的函数。urlparse以及代码中的urlsplit都是用来处理URL的。

urlparse模块将一个URL拆解成6个元组,即scheme, netloc, path, params, query, fragment。如下:

属性 指数 空值
scheme 0 网络协议 scheme parameter
netloc 1 服务器地址 empty string
path 2 文件相对路径 empty string
params 3 参数 empty string
query 4 查询条件 empty string
fragment 5 片段 empty string

urlsplit在官方文档中将一个URL拆解成5个元组,即scheme, netloc, path,  query, fragment,如下:

属性 指数 空值
scheme 0 网络协议 scheme parameter
netloc 1 服务器地址 empty string
path 2 文件相对路径 empty string
query 3 查询条件 empty string
fragment 4 片段 empty string

源代码

源代码基本上不需要详解了。因为,基本上每一行都有我的注释。既是理解代码,又让自己养成了写注释的习惯。

# -*- coding: utf-8 -*-
# @Time    : 2017/11/27 16:52
# @Author  : Darker
# @Site    : www.liangz.org
# @File    : bs4test.py
# @Software: PyCharm


import urllib2
import optparse
from urlparse import urlsplit
from bs4 import BeautifulSoup
from os.path import basename


#查找页面所有图片链接
def findImages(url):
    print(u'[+] 需要查找图片的链接:' + url)
    # 打开链接
    urlContent = urllib2.urlopen(url).read()
    # BeautifulSoup解析页面内容
    soup = BeautifulSoup(urlContent)
    # 查找img标签,即包含图片的标签
    imgTags = soup.findAll('img')
    return imgTags


#下载图片方法
def downloadImage(imgTag):
    try:
        print(u'[+] 下载图片...')
        #img标签的src属性,即图片地址
        imgSrc = imgTag['src']
        #读取图片内容
        imgContent = urllib2.urlopen(imgSrc).read()
        #basename(urlsplit(imgSrc)[2])这个是获取文件在服务器上的相对位置
        imgFileName = basename(urlsplit(imgSrc)[2])
        #创建(打开)文件
        imgFile = open(imgFileName, 'wb')
        #将图片内容保存到文件中
        imgFile.write(imgContent)
        #关闭文件,即保存完毕
        imgFile.close()
        return imgFileName
    except:
        return ''


def main():
    #命令行参数
    parser = optparse.OptionParser(u'使用方法 python bs4test.py -u <target url>')
    parser.add_option('-u', dest='url', type='string', help=u'指定网络地址')
    (options, args) = parser.parse_args()
    url = options.url
    #当没有输入URL时,打印用法
    if url == None:
        print(parser.usage)
        exit(0)
    else:
        imgTags = findImages(url)
        # 循环下载图片
        for imgTag in imgTags:
            downloadImage(imgTag)

if __name__ == '__main__':
    main()

使用方法

其实在代码中已经写了。就是在命令行使用:python bs4test.py -u [url] 命令就行了。举个例子:

另外说一点,如果图片是通过JavaScript动态加载的,是无法下载的。

吐槽一下,通过写文章这种方式,真是一种提升技术的好方法。为了不误导别人,我需要到python官网,慢慢查找官方文档,翻译英文,以一种比较容易理解的方式写在文中。

如有错误,敬请指出,谢谢阅读!                                      –2017-11-27  22:12:14

赞(0) 打赏
转载请注明:飘零博客 » Python学习之BeautifulSoup 4 下载图片
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

欢迎光临