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 内容简介 为什么写这本书 网络爬虫其实很早就出现了,最开始网络爬虫主要应用在各种搜索引擎中.在搜索引 ...
随机推荐
- 51nod 1243 二分+贪心
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1243 1243 排船的问题 题目来源: Codility 基准时间限制: ...
- maven pom.xml 配置 cxf-codegen-plugin 生成web服务客户类型
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- EXCEL对比重复数据
一. EXCEL 突出重复项 1. 选择对应的数据 EXCEL 里选择好数据 2. 选择条件格式 这样就完成了数据重复的突出,可以按条件筛选.选择自己想要的数据
- GEF入门实例_总结_06_为编辑器添加内容
一.前言 本文承接上一节:GEF入门实例_总结_05_显示一个空白编辑器 在上一节我们为我们的插件添加了一个空白的编辑器,这一节我们将为此编辑器添加内容. 二.GEF的MVC模式 在此只简单总结一下, ...
- 《Effective C++》——条款08:别让异常逃离析构函数
考虑如下代码: class Widget{ public: ... ~Widget(){...}//假设这个可能吐出一个异常 }; void doSomething() { std::vector&l ...
- Ajax与后台的交互
Ajax Java 交互 jsp代码 <%@ page language="java" import="java.util.*" pageEncoding ...
- hdu5087 Revenge of LIS II (dp)
只要理解了LIS,这道题稍微搞一下就行了. 求LIS(最长上升子序列)有两种方法: 1.O(n^2)的算法:设dp[i]为以a[i]结尾的最长上升子序列的长度.dp[i]最少也得是1,就初始化为1,则 ...
- 463. Island Perimeter Add to List
You are given a map in form of a two-dimensional integer grid where 1 represents land and 0 represen ...
- 学习动态性能表(11)v$latch$v$latch_children
学习动态性能表 第十一篇-(1)-V$LATCH 2007.6.7 Oracle Rdbms应用了各种不同类型的锁定机制,latch即是其中的一种.Latch是用于保护SGA区中共享数据结构的一种串 ...
- 谈谈Linux内核驱动的coding style
最近在向Linux内核提交一些驱动程序,在提交的过程中,发现自己的代码离Linux内核的coding style要求还是差很多.当初自己对内核文档里的CodingStyle一文只是粗略的浏览,真正写代 ...