首先声明:目标网址是从别人案例里得到的,内容你懂的。。。
本来闲来无事,学习下爬虫的知识,遇到恶心的反盗链,好在目标网址防盗链简单,代码里注明了如何去查看目标网址的防盗检查;
防盗链原理
http标准协议中有专门的字段记录referer
一来可以追溯上一个入站地址是什么
二来对于资源文件,可以跟踪到包含显示他的网页地址是什么
因此所有防盗链方法都是基于这个Referer字段
防盗链的作用
在很多地方,如淘宝、拍拍、有啊等C2C网站,发布商品需要对宝贝进行描述,就需要图片存储,而为了使自己辛辛苦苦拍摄的图片不被别人调用,就需要防盗链的功能。
提供防盗链的图片网站很多,如有照片、又拍网、百度相册、QQ相册、网易相册等等,但是既能支持网店外链,又有防盗链功能的网站很少;
上述原理部分具体详细解释请再百度;
#!/usr/bin/env python #coding:utf-8 #date 20171202 #author maomao from bs4 import BeautifulSoup import os import requests import sys reload(sys) sys.setdefaultencoding('gbk') ###解决windows 下python 中文的编码问题 class DownLoadBeautiful(object): def __init__(self,URL): self.URL = URL def allUrls(self): headers = { 'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1" } ###设置请求的头部,伪装成浏览器 start_html = requests.get(self.URL,headers=headers) ###使用了更为人性化的requests来发送请求 soup = BeautifulSoup(start_html.text,'lxml') ###使用BS4 框架来解析网页源码 hreflist = soup.find('div',attrs={'class':'all'}).find_all('a') ###查找主页里面所有的图片链接html标签 for href in hreflist: title = href.get_text() ###图片链接的具体中文描述 path = str(title).strip() os.makedirs(os.path.join("D:meizitu",path)) ###在本地创建保存 os.chdir("D:meizi\"+path) hrefs = href['href'] ###获取图片的URL html = requests.get(hrefs,headers=headers) ###请求图片的URL html_soup = BeautifulSoup(html.text,'lxml') ###解析图片URL的网页源码 max_span = html_soup.find('div',attrs={'class':'pagenavi'}).find_all('span')[-2].get_text() ###分析图片一共多少页 for page in xrange(1,int(max_span)+1): page_url = hrefs + '/' + str(page) ###拼接每张图片的URL img_html = requests.get(page_url,headers=headers) ###请求每张图片的URL img_soup = BeautifulSoup(img_html.text,'lxml') ###解析每张图片的源码 img_url = img_soup.find('div',attrs={'class':'main-image'}).find('img')['src'] ####查找实际每张图片的具体地址 headers = { 'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1", 'Referer':page_url } ###因为网站有防盗链,重新设置了头部的Referer ;F12里打开网络监听,在Request Headers 里面 img = requests.get(img_url,headers=headers,stream=True) ###请求图片的实际URL print img.url name = img_url[-9:-4] f = open(name+'.jpg','wb') ###将图片下载并保存,注意对于多媒体文件,必须使用二进制写入 f.write(img.content) f.close() if __name__ == "__main__": test = DownLoadBeautiful("http://www.mzitu.com/all") test.allUrls()
以上代码,基本功能已实现,还有很多需要改进的地方:使用代理服务器、并发爬取、日志功能、容错机制等等;
过程是最终要的,爬虫的知识还有很多,继续学习ing