首先声明:目标网址是从别人案例里得到的,内容你懂的。。。

本来闲来无事,学习下爬虫的知识,遇到恶心的反盗链,好在目标网址防盗链简单,代码里注明了如何去查看目标网址的防盗检查;

防盗链原理

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

关于python 爬虫遇到的反盗链的更多相关文章

  1. Referer反反盗链

    0x00 前言 最近用Python非常多,确实感受到了Python的强大与便利.但同时我并没有相见恨晚的感觉,相反我很庆幸自己没有太早接触到Python,而是基本按着C→C++→Java→Python ...

  2. 通过设置Referer反"反盗链"

    package cn.searchphoto.util; import java.io.File; import java.io.FileOutputStream; import java.io.In ...

  3. 对付"反盗链"

    对付"反盗链" 某些站点有所谓的反盗链设置,其实说穿了很简单, 就是检查你发送请求的header里面,referer站点是不是他自己, 所以我们只需要像把headers的refer ...

  4. sevlet实现反盗链

    有时候为了网站的版权和安全问题,我们需要为我们的网站应用设置防盗链,这样可以保证我们网站的一些资源的安全性.防盗链的主要是通过获取http的请求头referer的信息来和我们的网站地址做对比,如果相同 ...

  5. 跳过图片反盗链js

    页面增加<iframe> <iframe id="ifa" style="display:none" /> 原来html: <im ...

  6. Python爬虫开发:反爬虫措施以及爬虫编写注意事项

  7. python 爬虫 urllib模块 反爬虫机制UA

    方法: 使用urlencode函数 urllib.request.urlopen() import urllib.request import urllib.parse url = 'https:// ...

  8. python爬虫之字体反爬

    一.什么是字体反爬? 字体反爬就是将关键性数据对应于其他Unicode编码,浏览器使用该页面自带的字体文件加载关键性数据,正常显示,而当我们将数据进行复制粘贴.爬取操作时,使用的还是标准的Unicod ...

  9. Python爬虫入门教程 23-100 石家庄链家租房数据抓取

    1. 写在前面 作为一个活跃在京津冀地区的开发者,要闲着没事就看看石家庄这个国际化大都市的一些数据,这篇博客爬取了链家网的租房信息,爬取到的数据在后面的博客中可以作为一些数据分析的素材. 我们需要爬取 ...

随机推荐

  1. nim_duilib(15)之duilib属性列表.xml

    Note 为了更加方便查看duilib的属性(github有时候打不开),特此记录. 阅读本文,可以知道控件有哪些属性,可以写在xml文件中.个别需要结合源码一起看 from here 原文 < ...

  2. 【LeetCode】509. Fibonacci Number 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 日期 题目地址:https://leetc ...

  3. 【LeetCode】945. Minimum Increment to Make Array Unique 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力求解,TLE 一次遍历 日期 题目地址:http ...

  4. 【LeetCode】43. Multiply Strings 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  5. 【LeetCode】807. Max Increase to Keep City Skyline 解题报告(Python &C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  6. ZOJ 3785:What day is that day?(数论)

    What day is that day? Time Limit: 2 Seconds Memory Limit: 65536 KB It's Saturday today, what day is ...

  7. js处理复杂数据格式数组嵌套对象,对象嵌套数组,reduce处理数据格式

    let list=[ {id:1,name:'a'}, {id:1,name:'b'}, {id:1,name:'c'}, {id:2,name:'A'}, {id:2,name:'B'}, {id: ...

  8. <学习opencv> opencv 概述及初探

    目录 Opencv3 当前模块 OpenCV 贡献库(opencv_contrib) OpenCV 头文件 旧式C风格头文件 新式C++风格头文件 例程 DEMO1 - 显示图片 DEMO2 - 视频 ...

  9. Spring企业级程序设计 • 【第7章 Spring框架整合】

    全部章节   >>>> 本章目录 7.1 模型数据解析及控制器返回值 7.1.1 SSM框架环境搭建 7.1.1 ModelAndView多种用法 7.1.2 整合MyBati ...

  10. 计算机网络-4-11-IP多播

    IP多播 IP多播的基本概念 与单播相比,在一对多的通信中,多播可以大大减少网络资源.在互联网上进行多播就叫做IP多播,IP多播所传送的分组需要使用多播IP地址.能够运行多播协议的路由器叫做多播路由器 ...