爬虫实战【5】送福利!Python获取妹子图上的内容
【插入图片,妹子图首页】

哈,只敢放到这个地步了。
今天给直男们送点福利,通过今天的代码,可以把你的硬盘装的满满的~
下面就开始咯!
第一步:如何获取一张图片
假如我们知道某张图片的url,如何获取到这张图片呢?
先看一下最简单的方法:
【插入图片,单页url】

我们获取到图片的内容,通过二进制流写入到文件中,并保存起来。
这次偷懒啦,将所有图片都保存在当前目录下。
import requests
url='http://i.meizitu.net/2017/11/24a02.jpg'
pic=requests.get(url).content
pic_name=url.split(r'/')[-1]
with open(pic_name,'wb') as f:
f.write(pic)
竟然出错了,得到的图片竟然是这样的:
【插入图片,反爬虫-防盗链】

看来现在各种网站都开始反爬虫了,我们尝试一下加入一些伪装信息。
估计是很多骚动青年都拿妹子图来练习爬虫了。。。
经过探索,加入referer头信息,才能继续下载,这个referer对应的内容是该图片的母地址,也就是存放这个图片的网页的地址。
可以啦,我们得到图片了,代码如下,做了一些修改,不直接打开图片地址了,而是打开单页图片所在的网页的地址。
import requests
import re
pic_parent='http://www.mzitu.com/109942/2'
def save_one_pic(pic_parent):
pic_path=pic_parent.split(r'/')[-2]
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0'}
headers['Referer'] = pic_parent#新增属性,否则得不到图片
html=requests.get(pic_parent,headers=headers).text
pattern=re.compile(r'<img src="(h.*?)" alt')
pic_url=re.findall(pattern,html)[0]#匹配单页图片地址
pic = requests.get(pic_url, headers=headers).content
pic_name =pic_path+'_'+pic_url.split(r'/')[-1]
with open(pic_name, 'wb') as f:
f.write(pic)
if __name__=='__main__':
save_one_pic(pic_parent)
第二步:获取某模特的所有图片url并保存
第一步,我们学会了保存一页图片。
但是每个模特一般都会有几十张照片的,如果一次获取该模特的所有照片的?
【插入图片,模特多页】

其实很方便,跟之前的项目一样,只要把url做一点修改就好了
http://www.mzitu.com/110107/3
最后一位更改一下就行啦。
当然,我们首先要获取到该模特图片的总数量,还是用正则匹配出来。
代码如下:
def get_one_volume_pic(pic_volume_url):
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0'}
html = requests.get(pic_volume_url, headers=headers).text
pattern=re.compile(r"(.*)<span>(\d+?)</span></a><a href='(.*?)'><span>下一页")
max_no=int(re.findall(pattern,html)[0][-2])#对list进行操作,可以百度一下用法
first_name=pic_volume_url.split('/')[-1]
#print(first_name)
#print(max_no)
print('--开始保存:',first_name)
p=Pool()
p.map(save_one_pic,[pic_volume_url+'/'+str(i) for i in range(1,max_no+1)])
# for i in range(max_no+1):
# url=pic_volume_url+str(i)
# save_one_pic(url)
print('--',first_name,',保存完成')
第三步:获取某一页面上所有模特的照片
【插入图片,首页多页】

http://www.mzitu.com/page/2/
每一页中都有很多模特的图片集合,我们要获得这一页中每一位模特的url入口,才能使用第二步的方法来下载图片。
【插入图片,模特url入口】

#保存基本页面上的第pageNo页
def get_one_volume_all_pic(page_No):
url=base_url+str(page_No)
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0'}
html = requests.get(url, headers=headers).text
pattern=re.compile(r'<li><a href="(.*?)" target')
url_list=re.findall(pattern,html)
#print(url_list)
print('开始保存第',page_No,'页!')
for url in url_list:
get_one_volume_pic(url)
第四步:获取主页中最大的页码数
由于图片数量巨大,我们尽量不要一次完全下载。
要想下载指定数量的页面,需要获取页面数量。
这个方法跟第二步中的方法差不多,请参考。
base_url='http://www.mzitu.com/page/'#需要加页码
def get_max_page(base_url):
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0'}
html = requests.get(base_url+'1', headers=headers).text
#print(html)
pattern=re.compile(r"<a class='page-numbers'(.*?)</span>(\d+?)<span class=(.*?)></span></a>")
max_no=re.findall(pattern,html)[-1][-2]
#print(max_no)
return max_no
全部代码
终于完成了,代码虽然不多,不断的在出错,调试,还是很费时间的。
目前所有的图片都保存在当前文件夹下面,后面要改进一下,每个volume都单独建一个文件夹 ,这样就好看一些了。
import requests
import re
from multiprocessing import Pool
base_url='http://www.mzitu.com/page/'#需要加页码
def save_one_pic(pic_parent):
pic_path=pic_parent.split(r'/')[-2]
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0'}
html=requests.get(pic_parent,headers=headers).text
pattern=re.compile(r'<img src="(h.*?)" alt')
pic_url=re.findall(pattern,html)[0]
headers['Referer'] = pic_parent # 新增属性,否则得不到图片
pic = requests.get(pic_url, headers=headers).content
pic_name =pic_path+'_'+pic_url.split(r'/')[-1]
with open(pic_name, 'wb') as f:
f.write(pic)
print('------保存成功:',pic_name)
def get_one_volume_pic(pic_volume_url):
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0'}
html = requests.get(pic_volume_url, headers=headers).text
pattern=re.compile(r"(.*)<span>(\d+?)</span></a><a href='(.*?)'><span>下一页")
max_no=int(re.findall(pattern,html)[0][-2])
first_name=pic_volume_url.split('/')[-1]
#print(first_name)
#print(max_no)
print('--开始保存:',first_name)
p=Pool()
p.map(save_one_pic,[pic_volume_url+'/'+str(i) for i in range(1,max_no+1)])
# for i in range(max_no+1):
# url=pic_volume_url+str(i)
# save_one_pic(url)
print('--',first_name,',保存完成')
#保存基本页面上的第pageNo页
def get_one_volume_all_pic(page_No):
url=base_url+str(page_No)
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0'}
html = requests.get(url, headers=headers).text
pattern=re.compile(r'<li><a href="(.*?)" target')
url_list=re.findall(pattern,html)
#print(url_list)
print('开始保存第',page_No,'页!')
for url in url_list:
get_one_volume_pic(url)
def get_max_page(base_url):
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0'}
html = requests.get(base_url+'1', headers=headers).text
#print(html)
pattern=re.compile(r"<a class='page-numbers'(.*?)</span>(\d+?)<span class=(.*?)></span></a>")
max_no=re.findall(pattern,html)[-1][-2]
#print(max_no)
return max_no
if __name__=='__main__':
max_no=get_max_page(base_url)
print('目前妹子图一共有{0}页!'.format(max_no))
No=int(input('请输入您想下载多少页的内容:'))
for i in range(1,No+1):
get_one_volume_all_pic(i)
看看结果哈!
【插入图片,结果】

内容比价劲爆,就不开预览了,直男们下载好python,试一试把,把你的硬盘装满~~~

爬虫实战【5】送福利!Python获取妹子图上的内容的更多相关文章
- 爬虫实战【4】Python获取猫眼电影最受期待榜的50部电影
前面几天介绍的都是博客园的内容,今天我们切换一下,了解一下大家都感兴趣的信息,比如最近有啥电影是万众期待的? 猫眼电影是了解这些信息的好地方,在猫眼电影中有5个榜单,其中最受期待榜就是我们今天要爬取的 ...
- 爬虫实战【11】Python获取豆瓣热门电影信息
之前我们从猫眼获取过电影信息,而且利用分析ajax技术,获取过今日头条的街拍图片. 今天我们在豆瓣上获取一些热门电影的信息. 页面分析 首先,我们先来看一下豆瓣里面选电影的页面,我们默认选择热门电影, ...
- Python3爬虫系列:理论+实验+爬取妹子图实战
Github: https://github.com/wangy8961/python3-concurrency-pics-02 ,欢迎star 爬虫系列: (1) 理论 Python3爬虫系列01 ...
- 第14.15节 爬虫实战1:使用Python和selenium实现csdn博文点赞
写在前面:本文仅供参考学习,请勿用作它途,禁止转载! 在开始学爬虫时,学习了csdn博客专家(id:明天依旧可好 | 柯尊柏)<实战项目二:实现CSDN自动点赞>的文章,文章介绍了通过Py ...
- python获取内存地址上存储的值
在python中,可以通过id()这个方法来获取对象的内存地址. 但是反过来,怎么获取内存地址上存储的值? 先看一段代码: from ctypes import string_at from sys ...
- python爬虫实战(一)——实时获取代理ip
在爬虫学习的过程中,维护一个自己的代理池是非常重要的. 详情看代码: 1.运行环境 python3.x,需求库:bs4,requests 2.实时抓取西刺-国内高匿代理中前3页的代理ip(可根据需求自 ...
- 爬虫实战--基于requests和beautifulsoup的妹子网图片爬取(福利哦!)
#coding=utf-8 import requests from bs4 import BeautifulSoup import os all_url = 'http://www.mzitu.co ...
- Python:爬虫之利用Python获取指定网址上的所有图片—Jaosn niu
# coding=gbk import urllib.request import re import os import urllib def getHtml(url): #指定网址获取函数 pag ...
- python获取动态网站上面的动态加载的数据(初级)
我们在处理一些网站数据的时候,有时候我们需要的数据很多都是动态加载的,而不都是静态的,以下以一个实例来介绍简单的获取动态数据,首先申明本人小白,还在学习python中,这个方法还是比较笨拙的,但是对于 ...
随机推荐
- C#开发微信公众平台-就这么简单(转载)
写在前面 服务号和订阅号 URL配置 创建菜单 查询.删除菜单 接受消息 发送消息(图文.菜单事件响应) 示例Demo下载 后记 最近公司在做微信开发,其实就是接口开发,网上找了很多资料,当然园友也写 ...
- 悟道—位IT高管20年的职场心经(读书笔记三)
悟道--一位IT高管20年的职场心经 第三章 世事洞明皆学问 职场就是你的大半个世界 是你一辈子也读不完的一大本书 想明确一个道理. 看明确一件事儿, 你就向成功迈进了一步. 1.1 "四 ...
- 【Java】Java_01初步
1.编程语言的发展史和发展主线 计算机语言如果你将它当做一个产品,就像我们平时用的电视机.剃须刀.电脑.手机等, 他的发展也是有规律的. 任何一个产品的发展规律都是:向着人更加容易使用.功能越来越强大 ...
- 每日一个机器学习算法——LR(逻辑回归)
本系列文章用于汇集知识点,查漏补缺,面试找工作之用.数学公式较多,解释较少. 1.假设 2.sigmoid函数: 3.假设的含义: 4.性质: 5.找一个凸损失函数 6.可由最大似然估计推导出 单个样 ...
- 【c语言】不用大与小与号,求两数最大值
// 不用大与小与号,求两数最大值 #include <stdio.h> int max(int a, int b) { int c = a - b; int d = 1 << ...
- 小程序排错(redis导致)
小程序突然出问题,题库加载不了,程序正常,测试环境同样环境,同样代码都正常,但是线上数据秒过期,怀疑redis过期时间设置有问题,但是检查配置没问题,写入数据带过期时间也正常. redis设置key: ...
- Hive 正则匹配函数
正则匹配字符解释: ^ 表示开头 $ 表示结尾 . 表示任意字符 * 表示任意多个 regexp_extract函数 语法: regexp_extract(string subject, st ...
- 关于http和rpc的区别(segmentfault上的回答)
问题最近用了谷歌的grpc,所以对rpc和http有一点疑惑,感觉这两个东西功能上是一样的,rpc某个服务监听某一个方法,客户端调用这个方法,返回相应的数据,和http监听某个方法的路由 返回相应的数 ...
- nginx日志配置指令详解
这篇文章主要介绍了nginx日志配置指令详解,nginx有一个非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志,需要的朋友可以参考下日志对于统计排错来说非常有利的.本文总结了nginx日 ...
- linux系统之free命令详解
total used free shared buffers cached Mem: -/+ buffers/cache: Swap: 上面是free命令的执行结果,下面我来详细说说其中的含义: Me ...