序
今天学习的是 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
最新评论
这个软件有bug的,客户端windows有些键不能用如逗号、句号
没有收到邮件通知
我的评论通知貌似坏掉了,定位一下问题
测试一下重新部署后的邮件功能
居然看到自己公司的MIB库,诚惶诚恐
那可能是RobotFramework-ride的版本问题。我装的1.7.4.2,有这个限制。我有空再尝试下旧版本吧,感谢回复。
你好!我在python2.7中安装RobotFramework-ride的时候提示wxPython的版本最高是2.18.12,用pip下载的wxPython版本是4.10,而且我在那个路径下没有找到2
真的太好了,太感谢了,在bilibili和CSDN上都找遍了,终于在你这里找到了