python爬虫实战(3)--图片下载器
本篇目标
1.输入关键字能够根据关键字爬取百度图片
2.能够将图片保存到本地文件夹
1.URL的格式
进入百度图片搜索apple,这时显示的是瀑布流版本,我们选择传统翻页版本进行爬取。可以看到网址为:
https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=apple&pn=0
点击下一页发现网址变为pn=20,这里仅pn发生了改变
2.抓取图片
打开开发者选项,点击图片,出现图片的代码,如下图
复制这里的图片地址,在页面上点击右键显示源代码,查找刚刚复制的地址,我们可以看到有thumbURL,middleURL,hoverURL,objURL
这里objURL显示的图片最清晰,我们就爬取这个,所以可以写出正则表达式
pattern = re.compile('"objURL":"(.*?)",', re.S)
items = re.findall(pattern, page)
3.创建目录
def mkdir(self, path):
path = path.strip()
#判断路径是否存在
#存在为True 不存在为False
isExists = os.path.exists(path)
if not isExists:
#如果不存在则创建目录
print u"新建了名为", path, u"的文件夹"
#创建目录操作函数
os.makedirs(path)
return True
else:
#如果目录存在则不创建,并提示目录已存在
print u"名为", path, u"的文件夹已存在"
return False
4.保存图片为.jpg格式
for item in items:
try:
u = urllib2.urlopen(item, timeout=20)
except urllib2.URLError, e:
print e.reason
continue
data = u.read()
name = path + "/" + word + str(i) + ".jpg"
f = open(name, 'wb')
f.write(data)
print u"正在保存图片为", name, u"图片地址为:", item
f.close()
i += 1
item是利用正则表达式查找到的图片网址
5.编写测试代码
#-*- coding:utf-8 -*-
import urllib2
import os
import re
import sys # 设置编码
reload(sys)
sys.setdefaultencoding('utf-8')
# 获得系统编码格式
type = sys.getfilesystemencoding()
word = raw_input("请输入关键字: ".decode('utf-8').encode('gbk')).decode(type)
url = 'https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word='+word+'&pn=0'
request = urllib2.Request(url)
response = urllib2.urlopen(request)
page = response.read()
pattern = re.compile('"objURL":"(.*?)",', re.S)
items = re.findall(pattern, page)
path = word
#判断路径是否存在
#存在为True 不存在为False
isExists = os.path.exists(path)
if not isExists:
#如果不存在则创建目录
print u"新建了名为", path, u"的文件夹"
#创建目录操作函数
os.makedirs(path)
else:
#如果目录存在则不创建,并提示目录已存在
print u"名为", path, u"的文件夹已存在"
i = 1
for item in items:
# print u"第"+str(i)+u"张图片地址"
# print item
# i += 1
try:
u = urllib2.urlopen(item, timeout=20)
except urllib2.URLError, e:
print e.reason
continue
data = u.read()
name = path + "/" + word + str(i) + ".jpg"
f = open(name, 'wb')
f.write(data)
print u"正在保存图片为", name, u"图片地址为:", item
f.close()
i += 1
test
6.完善代码并封装
#-*- coding:utf-8 -*-
import urllib2
import re
import sys
import os
import time
import socket class Spider:
def __init__(self, keyword):
self.siteURL = 'https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=' + keyword
self.i = 1 def getPage(self, pageIndex):
page = (pageIndex-1)*20
url = self.siteURL + "&pn=" + str(page)
headers = {'User-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36'}
sleep_download_time = 10
try:
time.sleep(sleep_download_time)
request = urllib2.Request(url, headers=headers)
response = urllib2.urlopen(request)
except urllib2.URLError, e:
print e.reason
except socket.timeout, e:
print u"timeout"
return response.read().decode('utf-8') def getContents(self, pageIndex, keyword):
page = self.getPage(pageIndex)
pattern = re.compile('"objURL":"(.*?)",', re.S)
items = re.findall(pattern, page)
self.mkdir(keyword)
for item in items:
try:
name = keyword + "/" + keyword + str(self.i) + ".jpg"
self.saveImg(item, name)
self.i += 1
except urllib2.URLError, e:
print e.reason
except socket.timeout, e:
print u"timeout"
continue #创建新目录
def mkdir(self, path):
path = path.strip()
#判断路径是否存在
#存在为True 不存在为False
isExists = os.path.exists(path)
if not isExists:
#如果不存在则创建目录
print u"新建了名为", path, u"的文件夹"
#创建目录操作函数
os.makedirs(path)
return True
else:
#如果目录存在则不创建,并提示目录已存在
print u"名为", path, u"的文件夹已存在"
return False #保存图片到文件夹
def saveImg(self, imageURL, fileName):
u = urllib2.urlopen(imageURL)
data = u.read()
f = open(fileName, 'wb')
f.write(data)
print u"正在保存图片为", fileName, u"图片地址为:", imageURL
f.close() #传入起止页码,获取图片
# def savePagesInfo(self, start, end):
# for i in range(start,end+1):
# print u"正在查找第",i,u"个地方"
# self.getContents(i, self.title) # 设置编码
reload(sys)
sys.setdefaultencoding('utf-8')
# 获得系统编码格式
type = sys.getfilesystemencoding()
word = raw_input("请输入关键字: ".decode('utf-8').encode('gbk')).decode(type)
timeout = 20
socket.setdefaulttimeout(timeout)#这里对整个socket层设置超时时间。后续文件中如果再使用到socket,不必再设置
spider = Spider(word)
spider.getContents(1, word)
python爬虫实战(3)--图片下载器的更多相关文章
- Python爬虫实战:批量下载网站图片
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: GitPython PS:如有需要Python学习资料的小伙伴可以 ...
- Python 爬虫学习 网页图片下载
使用正则表达式匹配 # coding:utf-8 import re import urllib def get_content(url): """ Evilxr, &q ...
- 【Python爬虫实战】 图片爬虫-淘宝图片爬虫--千图网图片爬虫
所谓图片爬虫,就是从互联网中自动把对方服务器上的图片爬下来的爬虫程序.有些图片是直接在html文件里面,有些是隐藏在JS文件中,在html文件中只需要我们分析源码就能得到如果是隐藏在JS文件中,那么就 ...
- Bing图片下载器(Python实现)
分享一个Python实现的Bing图片下载器.下载首页图片并保存到到当前目录.其中用到了正则库re以及Request库. 大致流程如下: 1.Request抓取首页数据 2.re正则匹配首页图片URL ...
- 【图文详解】python爬虫实战——5分钟做个图片自动下载器
python爬虫实战——图片自动下载器 之前介绍了那么多基本知识[Python爬虫]入门知识,(没看的先去看!!)大家也估计手痒了.想要实际做个小东西来看看,毕竟: talk is cheap sho ...
- python爬虫实战——5分钟做个图片自动下载器
python爬虫实战——图片自动下载器 制作爬虫的基本步骤 顺便通过这个小例子,可以掌握一些有关制作爬虫的基本的步骤. 一般来说,制作一个爬虫需要分以下几个步骤: 分析需求(对,需求分析非常重要, ...
- Python实战:美女图片下载器,海量图片任你下载
Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知识总结.希望大家能够快速入门并学习 ...
- 第三百四十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—编写spiders爬虫文件循环抓取内容—meta属性返回指定值给回调函数—Scrapy内置图片下载器
第三百四十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—编写spiders爬虫文件循环抓取内容—meta属性返回指定值给回调函数—Scrapy内置图片下载器 编写spiders爬虫文件循环 ...
- 二十 Python分布式爬虫打造搜索引擎Scrapy精讲—编写spiders爬虫文件循环抓取内容—meta属性返回指定值给回调函数—Scrapy内置图片下载器
编写spiders爬虫文件循环抓取内容 Request()方法,将指定的url地址添加到下载器下载页面,两个必须参数, 参数: url='url' callback=页面处理函数 使用时需要yield ...
- 《精通Python网络爬虫》|百度网盘免费下载|Python爬虫实战
<精通Python网络爬虫>|百度网盘免费下载|Python爬虫实战 提取码:7wr5 内容简介 为什么写这本书 网络爬虫其实很早就出现了,最开始网络爬虫主要应用在各种搜索引擎中.在搜索引 ...
随机推荐
- review15
不同区域的星期格式 不同国家的星期的简称或全称有很大的不同.如果想用特定地区的星期格式来表示日期中的星期,可以用format的重载方法: format(Locale locale, 格式化模式,日期列 ...
- python中的list和array的不同之处 2
版权声明:本文为博主非原创文章,未经博主允许可以转载. Python中的list和array的不同之处 python中的list是python的内置数据类型,list中的数据类不必相同的,而a ...
- numpy函数:[6]arange()详解
arange函数用于创建等差数组,使用频率非常高,arange非常类似range函数,会python的人肯定经常用range函数,比如在for循环中,几乎都用到了range,下面我们通过range来学 ...
- Docker 介绍安装
简介: Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行 ...
- Element 'beans' cannot have character [children], because the type's content type is element-only
这个小问题快搞死我了,找了大半个小时. Element 'beans' cannot have character [children], because the type's content typ ...
- hdoj-2141-Can you find it?(二分查找)
题目链接 /* Name:HDU-2141-Can you find it? Copyright: Author: Date: 2018/4/12 17:15:46 Description: 暴力,复 ...
- loj 6084.「美团 CodeM 资格赛」跳格子
题目: link 题解: 尽量走\(a\). 只要保证走\(a\)后到达的点一定可以到终点就可以走. 所以从终点开始\(dfs\)出所有能够到达终点的点. 然后再从起点开始\(dfs\)路径即可. 如 ...
- npm init node 通过指令创建一个package.json文件及npm安装package.json
描述包的文件是package.json文件. 一个这样的文件,里面的信息还是挺大的.我们可以放弃手动建立.为了练手我们有命令行来建一个这样的包; 完成name,varsion....license项的 ...
- jsp有哪些内置对象?作用分别是什么?
JSP共有以下9种基本内置组件 1.request对象 客户端请求,此请求会包含来自GET/POST请求的参数通过它才能了解到客户的需求,然后做出响应. 2.response对象 响应客户请求的有关信 ...
- python基础准备
老男孩python全栈学习day1 第一讲python基础: 1.python起源:python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆(中 ...