Python 爬虫 爬取图片入门

爬虫

网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更常常的称为网页追逐者),是一种按照必定的规则,自动的抓取万维网信息的程序或者脚本。浏览器

 

用户看到的网页实质是由 HTML 代码构成的,爬虫爬来的即是这些内容,经过分析和过滤这些 HTML 代码,实现对图片、文字等资源的获取。安全

 

URL的含义

URL,即统一资源定位符,也就是咱们说的网址,统一资源定位符是对能够从互联网上获得的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每一个文件都有一个惟一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。服务器

URL的格式由三部分组成:
①第一部分是协议(或称为服务方式)。
②第二部分是存有该资源的主机IP地址(有时也包括端口号)。
③第三部分是主机资源的具体地址,如目录和文件名等。网络

 

爬虫爬取数据时必需要有一个目标的URL才能够获取数据,所以,它是爬虫获取数据的基本依据。socket

 

urllib2库的基本使用

response = urllib2.urlopen(url)网站

调用urllib2库里面的urlopen方法,传入一个URL,协议是HTTP协议,固然你也能够把HTTP换作FTP,FILE,HTTPS 等等,只是表明了一种访问控制协议,urlopen通常接受三个参数,它的参数以下:ui

urlopen(url, data, timeout)url

第一个参数url即为URL,第二个参数data是访问URL时要传送的数据,第三个timeout是设置超时时间。spa

第二三个参数是能够不传送的,data默认为空None,timeout默认为 socket._GLOBAL_DEFAULT_TIMEOUT代理

该方法返回一个response对象,返回信息保存在这里面

若是直接 print response ,打印的是该对象的描述,须要加上read()方法,才能够看到返回的HTML内容   

urlopen()这个方法能够直接传递一个request对象,经过urllib2.Request(url)构造

详细内容待补充...

 

POST和GET数据传送

如今大多数网站都是动态网页,须要你动态地传递参数给它,它作出对应的响应。因此,在访问时,咱们须要传递数据给它。最多见的状况是登陆注册的时候。

 

数据传送分为POST和GET两种方式。

GET方式是直接以连接形式访问,连接中包含了全部的参数,固然若是包含了密码的话是一种不安全的选择,不过你能够直观地看到本身提交了什么内容。POST则不会在网址上显示全部的参数

values = { 'username' : ' ' , 'password' : ' '}

data = urllib.urlencode(values)

request = urllib2.Request(url,data)

response = urllib.urlopen(request)  

POST方式把数据隐藏到data参数里

 

geturl = url + "?"+data
request = urllib2.Request(geturl)
response = urllib2.urlopen(request)
print response.read()

get方式把数据暴露在url里

 

设置Headers

为了彻底模拟浏览器的工做,咱们须要设置一些Headers 的属性。

在请求某个url时, Header里的agent就是请求的身份,若是没有写入请求身份,服务器不必定会响应。

headers = { 'User-Agent' : user_agent }

request = urllib2.Request(url, data, headers)  

 

设置了一个headers,在构建request时传入,在请求时,就加入了headers传送,服务器若识别了是浏览器发来的请求,就会获得响应。

 

headers中还有一个参数是Referer,它的含义是告诉url本身是哪一个网址,从何而来。构造headers时在字典里再加一个Referer就好

用处:

1.好比我只想要我本身的网站访问我本身的图片服务器,那么图片服务器就能够根据Referer来判断一下是否是我本身的域名。达到防盗链的效果

2.Referer为空的状况就是这个访问不是由某个连接而来,好比直接在地址栏里输入网址访问。

 

Proxy(代理)的设置

一些网站会有相应的反爬虫措施,例如不少网站会检测某一段时间内某个IP的访问次数,若是访问评率太快以致于看起来不像正常访客,它可能会禁止这个IP的访问。因此须要设置一些代理服务器,每隔一段时间换一个代理,就算IP被禁止,依然能够换个IP继续爬取。

import urllib2
enable_proxy = True
proxy_handler = urllib2.ProxyHandler({"http" : 'http://some-proxy.com:8080'})
null_proxy_handler = urllib2.ProxyHandler({})
if enable_proxy:
opener = urllib2.build_opener(proxy_handler)
else:
opener = urllib2.build_opener(null_proxy_handler)


urllib2.install_opener(opener)

将opener应用到全局,以后全部的,不论是opener.open(request)仍是urlopen(request)发送请求,都将使用自定义代理。

 

 

爬取图片方式

#传入图片地址,文件名,保存单张图片def saveImg(imageURL,fileName):   u = urllib.urlopen(imageURL)   data = u.read()   f = open(fileName, 'wb')#以二进制打开,只用于写入   f.write(data)   f.close()