Python 爬虫 爬取图片入门
爬虫
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本。
用户看到的网页实质是由 HTML 代码构成的,爬虫爬来的便是这些内容,通过分析和过滤这些 HTML 代码,实现对图片、文字等资源的获取。
URL的含义
URL,即统一资源定位符,也就是我们说的网址,统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
URL的格式由三部分组成:
①第一部分是协议(或称为服务方式)。
②第二部分是存有该资源的主机IP地址(有时也包括端口号)。
③第三部分是主机资源的具体地址,如目录和文件名等。
爬虫爬取数据时必须要有一个目标的URL才可以获取数据,因此,它是爬虫获取数据的基本依据。
urllib2库的基本使用
response = urllib2.urlopen(url)
调用urllib2库里面的urlopen方法,传入一个URL,协议是HTTP协议,当然你也可以把HTTP换做FTP,FILE,HTTPS 等等,只是代表了一种访问控制协议,urlopen一般接受三个参数,它的参数如下:
urlopen(url, data, timeout)
第一个参数url即为URL,第二个参数data是访问URL时要传送的数据,第三个timeout是设置超时时间。
第二三个参数是可以不传送的,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()