背景图来源:click

本次来玩一下爬虫,爬取各大网站大量的图片,这篇文章的目的主要有3点作为人工智能专栏下的一篇补充文章

作为小团子千人成像项目的资源依赖《敬请期待》

本篇文章介绍不同于其他网上的爬虫图片,网上有的文章,确实能够完成python抓去图片的功能,但是大部分的人给出的案例都只能爬取少量的图片。为了使文章循序渐进,条理更清晰,我决定由浅到深的分为2部分来实现-最经典的Python爬虫(图片)Python简单实现图片爬取功能

Python实现大量图片批量下载

以前看见图片总是一张一张复制粘贴,现在好了,学会了python就可以用程序将一张张图片,保存下来,下面我们开始分别介绍

1. Python简单实现图片爬取功能

其实上篇完成python的基础学习以后,就可以这样找一个项目来练手,比如本节python简单爬取图片,代码我会提供出来给大家一个参考,但对于刚刚完成理论基础的同学,建议是手写

爬取豆瓣或者跌吧的图片,保存在本地

Python基础中我们可以使用urllib模块请求网络,参考以下代码

simple_download_pic.py

# -*- coding: utf-8 -*-

"""Created on Fri Apr 12 17:31:25 2019@author: sunst&晴雨qy@des:爬取图片,提供两种方法"""

# re模块主要包含了正则表达式

import re

# urllib模块提供了读取Web页面数据的接口

import urllib.request

from urllib import request

# 定义一个getHtml()函数

def getSuperHtmlCode(url):

print('start-getsuperhtml')

with request.urlopen(url) as f:

data = f.read()

print('Status:', f.status, f.reason)

for k, v in f.getheaders():

print('%s:%s' % (k, v))

print('Data:', data.decode('utf-8'))

return data

# 定义一个getHtml()函数

def getHtml(url):

print('start-gethtml')

page = urllib.request.urlopen(url) # urllib.request.urlopen()方法用于打开一个URL地址

html = page.read() # read()方法用于读取URL上的数据

return html

def getImg(html):

reg = r'src="(.+?\.jpg)" pic_ext' # 正则表达式,得到图片地址

imgre = re.compile(reg) # re.compile() 可以把正则表达式编译成一个正则表达式对象.

html = html.decode('utf-8') # python3

imglist = re.findall(imgre, html) # re.findall() 方法读取html 中包含 imgre(正则表达式)的数据

# 把筛选的图片地址通过for循环遍历并保存到本地

# 核心是urllib.request.urlretrieve()方法,直接将远程数据下载到本地,图片通过x依次递增命名

x = 0

for imgurl in imglist:

urllib.request.urlretrieve(imgurl, 'D:\E\%s.jpg' % x)

x += 1

# html = getHtml("https://tieba.baidu.com/p/2555125530")

html = getSuperHtmlCode("https://tieba.baidu.com/p/2555125530")

print(html)

print(getImg(html))

注释已经写得很清楚了,提供了两种方法爬虫html代码都是正确的,一种是使用了with语句爬取跌吧截图

这次我们重新来爬取一个网站的图片

资源网站有非常多的图片

通过浏览器能看到返回来的应该是json数据

所以我们直接通过,们直接requests.get()去访问对应接口,直接利用request的json转换工具转换为json

这里如果不用request的json自动转换功能,就需要前面内容正则匹配图片链接地址,这里我们先玩一下Json

reg = r'(https://.*\.jpg)' # 正则表达式,得到图片地址

compileReg = re.compile(reg) # re.compile() 可以把正则表达式编译成一个正则表达式对象.

testurl = 'https://goss3.veer.com/creative/vcg/veer/176/veer-329471754.jpg'

print(compileReg.match(testurl))

保存图片

def saveImage(jsontext):

jsonarr = jsontext['data']['list']

print(jsonarr)

for alljsonarr in jsonarr:

print(alljsonarr['oss176'])

通过观察,jsonarr就是请求的json数据,然后观察,data包含list,list里面就是imgurl,如下控制台所示Json解析获取图片地址截图

接下来是把图片存到本地

for alljsonarr in jsonarr:

imgurl = alljsonarr['oss176']

print(imgurl)

urllib.request.urlretrieve(imgurl, 'E:\W\%s.jpg' % x)

x += 1

alljsonarr这是一个json数据,而urlretrieve接受的参数是一个网络图片链接,应该是imgurl,也就是alljsonarr[‘oss176’]才对,ok可以看一下效果。 其实这个也可以使用多线程操作,下载图片确实是比较耗时的操作,开一个线程比较好,跟Android一样爬取到的图片结果

当然这样我们能拿到图片,都没有问题,但是你认真实践了就会发现,上面的并不适合爬取大量的图片,下面就来看看如何爬取大量的图片

2. Python实现大量图片批量下载

这里爬取大量图片是为了下面一篇内容06小团子千人成像09的基础资源,因为下一篇我决定开源出来了这部分代码想了很久,涉及到隐私,涉及到对某个人的执着,好与不好就纯技术分享,这段话可忽略

在superxiaotuanzi项目中新建一个spider_baidu.py,结合【28章节失败】重新修改,前面爬取的图片比较少就叫失败的28章节, spider_baidu.py意思就是从百度图库里面爬取图片

准备工作

首先安装爬虫需要的模块,列举一下需要的模块【bs4】解析网页模块,【request】网络请求模块,【hashlib】生成hash字符串模块,【re】正则表达式模块准备需要的模块截图

创建文件夹,以及输入关键词查询没什么好说的,我们主要看一下下载图片的方法

def dowmloadPicture(html, keyword):

global num

# t =0

pic_url = re.findall('"objURL":"(.*?)",', html, re.S) # 先利用正则表达式找到图片url

print('找到关键词:' + keyword + '的图片,即将开始下载图片...')

首先,通过观察百度图片的源码,分析,先利用正则表达式找到图片url

pic_url = re.findall('"objURL":"(.*?)",', html, re.S)

findall就回去查找所有与正则匹配的图片链接地址,找到图片地址以后,则用循环遍历出来,通过request去请求网络,返回pic

for each in pic_url:

print('正在下载第' + str(num + 1) + '张图片,图片地址:' + str(each))

try:

if each is not None:

pic = requests.get(each, timeout=7)

else:

continue

except BaseException:

print('错误,当前图片无法下载')

continue

接着直接通过io操作保存图片,保存图片通过md5把url和搜索关键字以及图片数量组合成要下载的hashcode文件名,所以我们下载的图片名类似于:b04e2f728c981c934e704421095eba4e781.png

MD5加密,构建图片名

m = md5()

m.update((url + keyword).encode("utf-8"))

string = file + r'\\' + m.hexdigest() + str(num) + '.png'

# string = file + r'\\' + keyword + '_' + str(num) + '.jpg'

fp = open(string, 'wb')

fp.write(pic.content)

fp.close()

num += 1

if num >= numPicture:

return

下面是我提供出来完整代码参spider_baidu.py

import os

import re

from hashlib import md5

from urllib import error

import requests

from bs4 import BeautifulSoup

num = 0

numPicture = 0

file = ''

List = []

def Find(url):

global List

print('正在检测图片总数,请稍等.....')

t = 0

i = 1

s = 0

while t < 1000:

Url = url + str(t)

try:

Result = requests.get(Url, timeout=7)

except BaseException:

t = t + 60

continue

else:

result = Result.text

pic_url = re.findall('"objURL":"(.*?)",', result, re.S) # 先利用正则表达式找到图片url

s += len(pic_url)

if len(pic_url) == 0:

break

else:

List.append(pic_url)

t = t + 60

return s

def recommend(url):

Re = []

try:

html = requests.get(url)

except error.HTTPError as e:

return

else:

html.encoding = 'utf-8'

bsObj = BeautifulSoup(html.text, 'html.parser')

div = bsObj.find('div', id='topRS')

if div is not None:

listA = div.findAll('a')

for i in listA:

if i is not None:

Re.append(i.get_text())

return Re

def dowmloadPicture(html, keyword):

global num

# t =0

pic_url = re.findall('"objURL":"(.*?)",', html, re.S) # 先利用正则表达式找到图片url

print('找到关键词:' + keyword + '的图片,即将开始下载图片...')

for each in pic_url:

print('正在下载第' + str(num + 1) + '张图片,图片地址:' + str(each))

try:

if each is not None:

pic = requests.get(each, timeout=7)

else:

continue

except BaseException:

print('错误,当前图片无法下载')

continue

else:

# MD5加密,构建图片名

m = md5()

m.update((url + keyword).encode("utf-8"))

string = file + r'\\' + m.hexdigest() + str(num) + '.png'

# string = file + r'\\' + keyword + '_' + str(num) + '.jpg'

fp = open(string, 'wb')

fp.write(pic.content)

fp.close()

num += 1

if num >= numPicture:

return

if __name__ == '__main__': # 主函数入口

word = input("请输入搜索关键词(可以是人名,地名等): ")

# add = '张天爱_百度图片搜索'

url = '百度图片-发现多彩世界' + word + '&pn='

tot = Find(url)

Recommend = recommend(url) # 记录相关推荐

print('经过检测%s类图片共有%d张' % (word, tot))

numPicture = int(input('请输入想要下载的图片数量 '))

file = input('请建立一个存储图片的文件夹,输入文件夹名称即可')

y = os.path.exists(file)

if y == 1:

print('该文件已存在,请重新输入')

file = input('请建立一个存储图片的文件夹,)输入文件夹名称即可')

os.mkdir(file)

else:

os.mkdir(file)

t = 0

tmp = url

while t < numPicture:

try:

url = tmp + str(t)

result = requests.get(url, timeout=10)

print(url)

except error.HTTPError as e:

print('网络错误,请调整网络后重试')

t = t + 60

else:

dowmloadPicture(result.text, word)

t = t + 60

print('当前搜索结束,感谢使用')

print('猜你喜欢')

for re in Recommend:

print(re, end=' ')

实践结果

根据提示,输入相应的内容,然后就会下载图片(元服务器是百度,因为我们要爬取的就是百度的图片,资源多,也可以爬取其它网站的图片,当然得再修改代码)

正在爬取,关键字【zhaoliying】图片,保存图片的文件夹【imgs】,先下载1024张图片。说明一点,后面千人成像马赛克块生成就是使用这个文件夹的里面的图片(一共一万张)

以上便是最经典的Python爬虫(图片)案例的全部内容,说了很多废话,直接挑重点。然后你们别关注我专栏了,关注我吧,你们的关注会是我创作,总结(不管是android,python人工智能)下去的动力。

本专栏不定时更新,可以点击关注

晴雨qy 2019-04-26 21:55

爬虫python创意_最经典的Python爬虫(图片)案例相关推荐

  1. python网络爬虫与信息提取_北京理工大学_Python网络爬虫与信息提取(一)

    学习 北京理工大学 嵩天 课程笔记 课程体系结构: 1.Requests框架:自动爬取HTML页面与自动网络请求提交 2.robots.txt:网络爬虫排除标准 3.BeautifulSoup框架:解 ...

  2. pythoncookbook和流畅的python对比_为什么你学Python效率比别人慢?因为你没有这套完整的学习资料...

    以下资源免费获取方式! 关注!转发!私信"资料"即可免费领取! 入门书籍 1.<Python基础教程>(Beginning Python From Novice to ...

  3. 零基础学python 视频_全网最全Python视频教程真正零基础学习Python视频教程 490集...

    Python Web开发-进阶提升 490集超强Python视频教程 真正零基础学习Python视频教程 [课程简介] 这是一门Python Web开发进阶课程,手把手教你用Python开发完整的商业 ...

  4. python创意turtle作品和代码,python创意编程比赛作品

    这篇文章主要介绍了python创意turtle作品和代码,具有一定借鉴价值,需要的朋友可以参考下.希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下. 1.创意编程与python编程区别 ...

  5. 计算机导论python知识点_如何系统地自学 Python?

    我是自学的Python.从对Python一无所知,到在博客上写Python相关的系列文章(Python快速教程),前后有将近三年的时间.期间有不少门槛,但也充满乐趣.乐趣是自学的最大动力.Python ...

  6. 使用python数据分析_我如何使用Python分析《权力游戏》

    使用python数据分析 By Rocky Kev 洛基·凯夫(Rocky Kev) I wanted to learn Python for a long time, but I could nev ...

  7. 3 x 10的python表达式_这道数学题用PYTHON编程语言怎么写? 编程语言python是用

    我觉着,这个应该这样解决比较符合计算机解题思路. 下面的回答的,思考的东西太多. # -*- coding: utf-8 -*- __author__ = 'lpe234' __date__ = '2 ...

  8. java执行python脚本_通过Java调用Python脚本

    在进行开发的过程中,偶尔会遇到需要使用Java调用Python脚本的时候,毕竟Python在诸如爬虫,以及科学计算等方面具有天然的优势.最近在工作中遇到需要在Java程序中调用已经写好的Python程 ...

  9. python初学者_初学者的热门Python资源

    python初学者 Python新手? 还是您已经是一位经验丰富的开发人员,希望增加和提高您的Python知识? 我们为希望学习Python编程的任何人编制了一份推荐资源的书包. 我们对这些资源进行了 ...

  10. 为什么要学python语言_我们为什么要学习Python语言?

    原标题:我们为什么要学习Python语言? 聊到我们为什么要学习Python语言?小编不禁又想起大佬潘石屹准备开启Python学习旅程时所发布的微博. 我们为什么要学习Python语言? 在农业社会时 ...

最新文章

  1. 借势春晚 百度内容生态“后来居上”
  2. Coursera课程Python for everyone:Quiz: Reading Web Data From Python
  3. 那个双非本科,还想转算法岗的姑娘,最后怎么了?
  4. 微信小程序自定义组件,提示组件
  5. python中summary_python summary 1: class
  6. 数据结构与算法——常用数据结构及其Java实现
  7. CSS - Iconfont
  8. LayUI中的内置模块之 工具集文档 - layui.util
  9. 字节跳动-大数据研发面试准备
  10. C# 本地图片转Base64码和Base64码显示
  11. Transform.up与Vector3.up
  12. Bresenham画圆 正负画圆法 中点画圆法
  13. Wi-Fi DFS与TPC介绍
  14. ReferenceError Cannot access ‘xxx‘ before initialization
  15. UVM-config机制
  16. Excel从txt导入文本并将空行删除
  17. 宽带连接错误的处理办法651、691、623、678、645、720、721、718、734、769
  18. Matlab中ylim函数的使用
  19. GUI上半段学习总结
  20. 会声会影2023旗舰版中文版永久功能使用技巧说明

热门文章

  1. SAP系统 会计科目主数据详解
  2. php表格行数怎么设置,表格怎么排版
  3. Your local changes to the following files would be overwritten by merge
  4. 微信/支付宝扫码支付流程
  5. 科学计算机求n次方,科学计算器怎么算n次方_科学计算器的度分秒怎么按
  6. 原生JS实现的跳一跳小游戏完整实例
  7. error: passing ‘const xxx’ as ‘this’ argument discards qualifiers [-fpermissive]的解决方案
  8. python笔记:7.2.2.2 一元多因素方差分析_交互效应图(购房面积影响因素交互效应)
  9. 如何利用PS动作一秒将字体生成逼真刺绣效果
  10. 金融数据分析期末报告:基于时间序列的回归模型及其应用