爬虫python创意_最经典的Python爬虫(图片)案例
背景图来源: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爬虫(图片)案例相关推荐
- python网络爬虫与信息提取_北京理工大学_Python网络爬虫与信息提取(一)
学习 北京理工大学 嵩天 课程笔记 课程体系结构: 1.Requests框架:自动爬取HTML页面与自动网络请求提交 2.robots.txt:网络爬虫排除标准 3.BeautifulSoup框架:解 ...
- pythoncookbook和流畅的python对比_为什么你学Python效率比别人慢?因为你没有这套完整的学习资料...
以下资源免费获取方式! 关注!转发!私信"资料"即可免费领取! 入门书籍 1.<Python基础教程>(Beginning Python From Novice to ...
- 零基础学python 视频_全网最全Python视频教程真正零基础学习Python视频教程 490集...
Python Web开发-进阶提升 490集超强Python视频教程 真正零基础学习Python视频教程 [课程简介] 这是一门Python Web开发进阶课程,手把手教你用Python开发完整的商业 ...
- python创意turtle作品和代码,python创意编程比赛作品
这篇文章主要介绍了python创意turtle作品和代码,具有一定借鉴价值,需要的朋友可以参考下.希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下. 1.创意编程与python编程区别 ...
- 计算机导论python知识点_如何系统地自学 Python?
我是自学的Python.从对Python一无所知,到在博客上写Python相关的系列文章(Python快速教程),前后有将近三年的时间.期间有不少门槛,但也充满乐趣.乐趣是自学的最大动力.Python ...
- 使用python数据分析_我如何使用Python分析《权力游戏》
使用python数据分析 By Rocky Kev 洛基·凯夫(Rocky Kev) I wanted to learn Python for a long time, but I could nev ...
- 3 x 10的python表达式_这道数学题用PYTHON编程语言怎么写? 编程语言python是用
我觉着,这个应该这样解决比较符合计算机解题思路. 下面的回答的,思考的东西太多. # -*- coding: utf-8 -*- __author__ = 'lpe234' __date__ = '2 ...
- java执行python脚本_通过Java调用Python脚本
在进行开发的过程中,偶尔会遇到需要使用Java调用Python脚本的时候,毕竟Python在诸如爬虫,以及科学计算等方面具有天然的优势.最近在工作中遇到需要在Java程序中调用已经写好的Python程 ...
- python初学者_初学者的热门Python资源
python初学者 Python新手? 还是您已经是一位经验丰富的开发人员,希望增加和提高您的Python知识? 我们为希望学习Python编程的任何人编制了一份推荐资源的书包. 我们对这些资源进行了 ...
- 为什么要学python语言_我们为什么要学习Python语言?
原标题:我们为什么要学习Python语言? 聊到我们为什么要学习Python语言?小编不禁又想起大佬潘石屹准备开启Python学习旅程时所发布的微博. 我们为什么要学习Python语言? 在农业社会时 ...
最新文章
- 借势春晚 百度内容生态“后来居上”
- Coursera课程Python for everyone:Quiz: Reading Web Data From Python
- 那个双非本科,还想转算法岗的姑娘,最后怎么了?
- 微信小程序自定义组件,提示组件
- python中summary_python summary 1: class
- 数据结构与算法——常用数据结构及其Java实现
- CSS - Iconfont
- LayUI中的内置模块之 工具集文档 - layui.util
- 字节跳动-大数据研发面试准备
- C# 本地图片转Base64码和Base64码显示
- Transform.up与Vector3.up
- Bresenham画圆 正负画圆法 中点画圆法
- Wi-Fi DFS与TPC介绍
- ReferenceError Cannot access ‘xxx‘ before initialization
- UVM-config机制
- Excel从txt导入文本并将空行删除
- 宽带连接错误的处理办法651、691、623、678、645、720、721、718、734、769
- Matlab中ylim函数的使用
- GUI上半段学习总结
- 会声会影2023旗舰版中文版永久功能使用技巧说明
热门文章
- SAP系统 会计科目主数据详解
- php表格行数怎么设置,表格怎么排版
- Your local changes to the following files would be overwritten by merge
- 微信/支付宝扫码支付流程
- 科学计算机求n次方,科学计算器怎么算n次方_科学计算器的度分秒怎么按
- 原生JS实现的跳一跳小游戏完整实例
- error: passing ‘const xxx’ as ‘this’ argument discards qualifiers [-fpermissive]的解决方案
- python笔记:7.2.2.2 一元多因素方差分析_交互效应图(购房面积影响因素交互效应)
- 如何利用PS动作一秒将字体生成逼真刺绣效果
- 金融数据分析期末报告:基于时间序列的回归模型及其应用