python3爬取女神图片,破解盗链问题
title: python3爬取女神图片,破解盗链问题
date: 2018-04-22 08:26:00
tags: [python3,美女,图片抓取,爬虫, 盗链]
comments: true
前言
其实,抓取图片和抓取小说内容没有任何本质的区别,步骤都是一样的。
但是图片读取的时候,会遇到一个盗链问题。这个问题是花的解决时间最长的。
环境
语言: python3
操作系统: mac 10.12.16
自定义工具包:soup_tool
其依赖工具如下:
from urllib import request
from urllib.parse import quote
from bs4 import BeautifulSoup
import os
import threading
import re
import ssl
version 0.1 单个网址链接抓取所有特定图片
抓取分析
首先打开单个美女图片集
https://www.nvshens.com/g/24816
可以看到我标注的
使用chrome的检查功能,可以看到当前页有3张我们想要的图片
其中,可以以第二张图片的格式作为模板
只要替换001直到002、003、……、044
再找下图片总共有多少张,看我标注的count就可以了
这样就可以不用分页去抓取了。
至此,基本分析完毕,开始动手吧
动手实战
因为之前爬取小说网站的积累,写了一个工具类,主要就是用了request请求链接,BeautifulSoup解析网页,ssl解决https问题
工具类代码不一一贴出来了,最后会给个本项目github的地址
1.首先是初始化,建立class
class Capture:
引用自定义工具类
from soup_tool import Soup
from soup_tool import MyThread
然后定义初始化的一些参数
def __init__(self):
self.index_page_url = 'http://www.nvshens.com'
# 作品内容主页
self.one_page_url = 'https://www.nvshens.com/g/:key/'
# root folder
self.folder_path = 'nvshens/'
# 每个线程的沉睡时间
self.sleep_time = 2
# 后缀
self.file_hz = '.img'
2.根据key来检索分析图集主页
接着,我们得将本网页的获取做成动态的,将网址
中的24816作为搜索key
定义一个方法 readPageFromSearch
def readPageFromSearch(self, search_key):
"""
根据输入key读取搜索页面
:param search_key:
:return:
"""
方法里,第一个事,先建立个根目录
# 创建文件夹 /nvshens/search_key
path = self.folder_path + search_key
Soup.create_folder(path)
然后打开美女图集第一页,使用soup解析
# 打开搜索页面第1页
page_url = self.one_page_url.replace(':key', search_key)
print(page_url)
soup_html = Soup.get_soup(page_url)
从soup中取到id是dinfo的div,然后找到里面的span,获取其中的文本,再处理掉“张照片”几个字,得到最大图片张数
text_page = soup_html.find("div", {'id': 'dinfo'}).find('span').get_text()
print('text_page', text_page)
last = text_page.replace('张照片', '')
item_size = int(last)
再接着,我们要找到模板,但是第一张照片也不能不管,所以先从第一张获取,我们先看下规律
# 第1张
https://img.onvshen.com:85/gallery/25366/24816/0.jpg
# 第2张
https://img.onvshen.com:85/gallery/25366/24816/001.jpg
# 第3张
ttps://img.onvshen.com:85/gallery/25366/24816/002.jpg
这样,我们应该就知道怎么办了,取到第一张后,使用soup的find_next_sibling方法获取下一个标签节点
# 第1张图片
image_one = soup_html.find("ul", {'id': 'hgallery'}).find('img')
image_one_url = image_one.get('src')
print('image_one_url', image_one_url)
# 第2张图片链接作为模版
image_two = image_one.find_next_sibling()
image_two_url = image_two.get('src')
print('image_two_url', image_two_url)
然后,根据第二章的url,首先用"/"分割,取最右一组数,得到“24816/001.jpg”,在用"."分割,获取后缀,知道是jpg还是png
# https://img.onvshen.com:85/gallery/25366/24816/001.jpg
# 24816/001.jpg
img_hz = image_two_url.split("/")[-1]
# jpg
file_hz = img_hz.split('.')[1]
# https://img.onvshen.com:85/gallery/25366
img_mod_url = image_two_url.replace(img_hz, '')
3.多线程读取图片链接
定义readPageByThread 方法
将前面的
- 最大图片数 item_size
- 文件存放目录 path
- 模板url img_mod_url
- 文件后缀 file_hz
全部作为参数传进来
# 多线程读取,每个图片下载都是一个线程
def readPageByThread(self, item_size, path, img_mod_url, file_hz):
"""
:param item_size: 最大图片数
:param path: 文件存放目录
:param img_mod_url: 模板url
:param file_hz: 文件后缀
:return:
"""
循环 item_size,使用zfill方法左侧补零
# 循环打开图片链接
for item in range(1, item_size):
# 左侧补零 1->001,2->002,……,114->114
page = str(item + 1).zfill(3)
new_page_url = img_mod_url + page + '.' + file_hz
new_path = path + '/' + page + '.' + file_hz
print(new_path, '---', new_page_url)
使用自定义的多线程方法,将本次线程收集起来,参数传进 readPagetoTxt 方法中
t = MyThread(self.readPagetoTxt, (new_page_url, new_path, self.sleep_time), self.readPagetoTxt.__name__)
threads.append(t)
开启线程,并join阻塞
for t in threads:
t.start()
for t in threads:
t.join()
print('all end', ctime())
4.读取图片内容并写入
这是本次图片抓取的重点了,在晚上搜索了很多内容,找到以下方法
urllib.request.urlretrieve
亲测,对于破解盗链没有任何作用
那么,真正的破盗链怎么搞呢?搜到了一个哥们的文章
其中有一段代码是这样的
Headers:map[string]string{
"Referer":"http://www.zngirls.com",
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"}})
这heads不只设置了User-Agent,还有Referer,艾?这是啥?我试试
将Referer设置为咱们的index_page_url(http://www.nvshens.com),果然可以了。为什么呢?
原来Referer表示一个来源,代表是从哪个网站请求web服务器的,我们将Referer设置为http://www.nvshens.com,代表的其实是从它自身网站请求访问的。
具体请参考这个哥们的文章什么是HTTP Referer?
当然,这也主要是这个网站的开发人员只用了Referer来作为防盗链的判断,如果不是Referer而是换成别的,那就又要重新破解了。
好了,写我们的代码吧,为head添加个Referer的属性,这Soup_tool类中
_HEAD2 = {
# Referer 抓取哪个网站的图片,添加此头部,可以破解盗链
"Referer": "",
'Accept-language': 'zh-CN,zh;q=0.9'
,
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
}
@staticmethod
def open_url(query_url, referer=''):
Soup._HEAD2['Referer'] = referer
req = request.Request(quote(query_url, safe='/:?='), headers=Soup._HEAD2)
webpage = request.urlopen(req)
html = webpage.read()
return html
@staticmethod
def write_img(query_url, file_name, referer):
content = Soup.open_url(query_url, referer)
with open(file_name, 'wb') as f:
f.write(content)
回到我们的Capture类:
# 使用Request添加头部的方法,读取图片链接再写入,最重要的是加上Referer
Soup.write_img(page_url, path, referer=self.index_page_url)
后记
还有v0.2、v0.3版本
这是v0.2的分析截图
分析思路是一样的,就不再细说了,自己看源码
看下下载后呈现的效果
最后放出代码链接
参考文献:
python3爬取女神图片,破解盗链问题的更多相关文章
- python3爬取1024图片
这两年python特别火,火到博客园现在也是隔三差五的出现一些python的文章.各种开源软件.各种爬虫算法纷纷开路,作为互联网行业的IT狗自然看的我也是心痒痒,于是趁着这个雾霾横行的周末瞅了两眼,作 ...
- python3爬取百度图片(2018年11月3日有效)
最终目的:能通过输入关键字进行搜索,爬取相应的图片存储到本地或者数据库 首先打开百度图片的网站,搜索任意一个关键字,比如说:水果,得到如下的界面 分析: 1.百度图片搜索结果的页面源代码不包含需要提取 ...
- 1、使用Python3爬取美女图片-网站中的每日更新一栏
此代码是根据网络上其他人的代码优化而成的, 环境准备: pip install lxml pip install bs4 pip install urllib #!/usr/bin/env pytho ...
- python3爬取网页图片路径并写入文件
import reimport urllib.request # 获取网页文件def getHtml(url): response = urllib.request.urlopen('https:// ...
- 2、使用Python3爬取美女图片-网站中的妹子自拍一栏
代码还有待优化,不过目的已经达到了 1.先执行如下代码: #!/usr/bin/env python #-*- coding: utf-8 -*- import urllib import reque ...
- Python3 爬取微信好友基本信息,并进行数据清洗
Python3 爬取微信好友基本信息,并进行数据清洗 1,登录获取好友基础信息: 好友的获取方法为get_friends,将会返回完整的好友列表. 其中每个好友为一个字典 列表的第一项为本人的账号信息 ...
- Python:爬取网站图片并保存至本地
Python:爬取网页图片并保存至本地 python3爬取网页中的图片到本地的过程如下: 1.爬取网页 2.获取图片地址 3.爬取图片内容并保存到本地 实例:爬取百度贴吧首页图片. 代码如下: imp ...
- php如何防止图片盗用/盗链的两种方法(转)
图片防盗链有什么用? 防止其它网站盗用你的图片,浪费你宝贵的流量.本文章向大家介绍php防止图片盗用/盗链的两种方法 Apache图片重定向方法 设置images目录不充许http访问 Apache服 ...
- php如何防止图片盗用/盗链的两种方法
如今的互联网,采集网站非常多,很多网站都喜欢盗链/盗用别人网站的图片,这样不仅侵犯网权,还导致被盗链的网站消耗大量的流量,给服务器造成比较大的压力,本文章向大家介绍php如何防止图片盗用/盗链的两种方 ...
随机推荐
- Spring中配置数据源常用的形式
不管采用何种持久化技术,都需要定义数据源.Spring中提供了4种不同形式的数据源配置方式: spring自带的数据源(DriverManagerDataSource),DBCP数据源,C3P0数据源 ...
- drbd(三):drbd的状态说明
本文目录:1.drbd配置文件2.状态 2.1 连接状态(connect state,cs)和复制状态 2.2 角色状态(roles,ro) 2.3 磁盘状态(disk state,ds) 2.4 I ...
- The sum of numbers form 0 to n.(20.9.2017)
#include <stdio.h> int main() { int a,b,sum; printf("输入一个数字: "); scanf("%d" ...
- OVS常用命令
添加brideg: sudo ovs-vsctl add-br br0 删除brideg: sudo ovs-vsctl del-br br0 显示bridge: sudo ovs-vsctl sho ...
- Session的过期时间如何计算?
在生成session的时候,会设置一个session过期时间.session的过期时间并不是从生成session对象开始计算,超过过期时间,session就失效了. 而是每当一个浏览器请求,sessi ...
- JUnit单元测试遇到的问题及解决思路
JUnit是Java单元测试框架,我们在对开发的系统进行单元测试的时候,也遇到了如何测试多个测试用例的问题. 背景:我们的所有测试用例都保存在Excel文件中,该文件包含测试用例和预期输出.我们希望 ...
- mongodb 定时备份
通过centos 脚步来执行备份操作,使用crontab实现定时功能,并删除指定天数前的备份 具体操作: 1.创建Mongodb数据库备份目录 mkdir -p /home/backup/mongod ...
- php的借用其他网站的页面覆盖Logo的技巧
php的借用其他网站的页面覆盖Logo的技巧, <body> <div id="red_f"></div> <div class=&quo ...
- python-map的用法
map()函数 map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回. 1.当seq只 ...
- Docker学习笔记 - Docker容器的日志
docker logs [-f] [-t] [--tail] 容器名 -f -t --tail="all" 无参数:返回所有日志 -f 一直跟踪变化并返回 -t 带时间戳返 ...