用python爬取全网妹子图片【附源码笔记】
这是晚上没事无聊写的python爬虫小程序,专门爬取妹子图的,养眼用的,嘻嘻!身为程序狗只会这个了!
废话不多说,代码附上,仅供参考学习!
"""
功能:爬取妹子图全网妹子图片,可以选择爬取年份,自动分类保存
作者:68喜科技
"""
import requests
from lxml import etree
# import re
import os
# from time import sleep class Meizitu(object):
"""爬取妹子图中的图片"""
def __init__(self, year):
self.url = "http://www.mzitu.com/all/"
self.headers = {"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36"}
self.year = year # 获取页面
def get_page(self, url, headers):
response = requests.get(url, headers=headers)
return response.content.decode() # 提取列表页中的urls
def get_detail_urls_list(self, page_content, year):
html_content = etree.HTML(page_content)
year_list = html_content.xpath("//div[@class='year']/text()")
index = 2019 - year
# 提取某一年的相关主题的urls
xpath_var = "//div[@class='year'][{}]/following-sibling::*[1]//p[@class='url']/a/@href".format(index)
if index <= len(year_list):
urls_list = html_content.xpath(xpath_var)
# print(urls_list)
else:
urls_list = None
return urls_list # 构造保存路径并创建目录
def save_path(self, detail_html_content, first_img_url, img_name):
# 构造保存路径
path_prefix1 = detail_html_content.xpath("//div[@class='currentpath']/a/text()")[1]
# print(path_prefix1)
path_prefix2 = first_img_url[20:29]
# print(path_prefix2)
save_path = "./妹子图/" + path_prefix1 + path_prefix2 + img_name + "/" # 如果目录不存在,则创建目录
if not os.path.exists(save_path):
os.makedirs(save_path) return save_path # 请求和保存图片
def save_img(self, img_url, img_headers, img_save_path):
# 请求图片
img_content = requests.get(img_url, headers=img_headers).content
# 保存图片
with open(img_save_path, "wb") as f:
f.write(img_content) # 构造图片请求地址
def img_url(self, first_img_url, img_index):
if img_index < 10:
img_url = first_img_url[:32] + "0" + str(img_index) + ".jpg"
else:
img_url = first_img_url[:32] + str(img_index) + ".jpg"
# print(img_url)
return img_url # 构造图片的请求头
def img_headers(self, url, img_index):
if img_index == 1 :
refer_url = url
else:
refer_url = url + "/" + str(img_index)
# print(refer_url) img_headers = {
# "Accept":"image/webp,image/apng,image/*,*/*;q=0.8",
# "Accept-Encoding":"gzip, deflate",
# "Accept-Language":"zh-CN,zh;q=0.9",
# "Connection":"keep-alive",
"Host":"i.meizitu.net",
"Referer":refer_url,
"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36"
}
# print(img_headers,end="\n\n")
return img_headers # 构造每个主题的图片请求地址 并保存
def get_img_urls(self, url, detail_html_content, first_img_url, img_name, save_path):
# 每个主题中的图片总数
img_total_num = int(detail_html_content.xpath("//div[@class='pagenavi']/a/span/text()")[4]) # 构造图片地址 http://i.meizitu.net/2018/02/18c01.jpg
for img_index in range(1, img_total_num + 1):
img_url = self.img_url(first_img_url, img_index)
img_headers = self.img_headers(url, img_index)
# 构造图片具体保存路径
img_save_path = save_path + img_name + str(img_index) + ".jpg"
# sleep(10)
# 请求和保存图片
self.save_img(img_url, img_headers, img_save_path) # 获取图片
def get_image(self, detail_urls_list):
for url in detail_urls_list:
detail_page = self.get_page(url, headers=self.headers)
detail_html_content = etree.HTML(detail_page)
# 第一页图片地址
first_img_url = detail_html_content.xpath("//div[@class='main-image']/p/a/img/@src")[0]
# print(first_img_url)
# 获取图片保存的名字
img_name = detail_html_content.xpath("//h2[@class='main-title']/text()")[0]
# print(img_name) # 构建保存路径并创建目录
save_path = self.save_path(detail_html_content, first_img_url, img_name) # 构建图片请求地址并下载
self.get_img_urls(url, detail_html_content, first_img_url, img_name, save_path) # 启动爬虫
def run_spider(self):
# 获取妹子图中的列表页内容
page_content = self.get_page(self.url, self.headers)
# 获取详情页的地址列表
detail_urls_list = self.get_detail_urls_list(page_content, self.year)
# 获取图片
self.get_image(detail_urls_list) if __name__ == "__main__":
year = int(input("请输入您要爬取的年份:"))
meizitu = Meizitu(year)
meizitu.run_spider()
用python爬取全网妹子图片【附源码笔记】的更多相关文章
- Python爬取全站妹子图片,差点硬盘走火了!
在这严寒的冬日,为了点燃我们的热情,今天小编可是给大家带来了偷偷收藏了很久的好东西.大家要注意点哈,我第一次使用的时候,大意导致差点坏了大事哈! 1.所需库安装 2.网站分析 首先打开妹子图的官网(m ...
- selenium实战:窗口化爬取*宝数据(附源码链接)
完整代码&火狐浏览器驱动下载链接:https://pan.baidu.com/s/1pc8HnHNY8BvZLvNOdHwHBw 提取码:4c08 双十一刚过,想着某宝的信息看起来有些少很难做 ...
- Python爬取养眼图片
1.准备 各位绅士们,你可能会觉得疫情在家无聊,那么现在我们的Python语言可以满足你们的需求.项目需要的工具(1)Python3(2)requests库requests库可以通过代码pip ins ...
- python 爬取知乎图片
先上完整代码 import requests import time import datetime import os import json import uuid from pyquery im ...
- 使用python爬取P站图片
刚开学时有一段时间周末没事,于是经常在P站的特辑里收图,但是P站加载图片的速度比较感人,觉得自己身为计算机专业,怎么可以做一张张图慢慢下这么low的事,而且这样效率的确也太低了,于是就想写个程序来帮我 ...
- python爬取基础网页图片
python基础爬虫总结 1.爬取信息原理 与浏览器客户端类似,向网站的服务器发送一个请求,该请求一般是url,也就是网址.之后服务器响应一个html页面给客户端,当然也有其他数据类型的信息,这些就是 ...
- Python3爬取美女妹子图片转载
# -*- coding: utf-8 -*- """ Created on Sun Dec 30 15:38:25 2018 @author: 球球 "&qu ...
- Python爬虫一爬取B站小视频源码
如果要爬取多页的话 在最下方循环中 填写好循环的次数就可以了 项目源码 from fake_useragent import UserAgent import requests import time ...
- Python:游戏:扫雷(附源码)
这次我们基于 pygame 来做一个扫雷,上次有园友问我代码的 python 版本,我说明一下,我所有的代码都是基于 python 3.6 的. 先看截图,仿照 XP 上的扫雷做的,感觉 XP 上的样 ...
随机推荐
- springboot打war包部署到tomcat
1:build.gradle plugins { id 'org.springframework.boot' version '2.1.5.RELEASE' id 'java' } apply plu ...
- 在使用FPGA来控制DDR3/DDR2 IP 的时候两个错误的解决办法
对于熟悉Intel FPGA的老(gong)司(cheng)机(shi)来说,外部存储器的控制早已是轻车熟路,但是对于新手,DDR3/DDR2 的IP使用也许并没有那么简单,不过没关系,骏龙的培训网站 ...
- 华为路由器+三层交换,路由器配置DHCP,交换机中继DHCP
LSW14:undo terminal monitorsystem-viewsysname SW1vlan batch 10 20 30 40 66interface Ethernet0/0/1por ...
- 用vue实现列表分页和按钮操作
为中华之崛起而读书 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...
- Get Docker Engine - Community for Ubuntu
Get Docker Engine - Community for Ubuntu Uninstall old versions$ sudo apt-get remove docker docker-e ...
- Fineui 解决OnClientClick中无论是返回true或false,都依然执行后台代码的问题
有时写js代码验证数据,需要在OnClientClick中执行,如果符合条件执行后台代码,不符合则不触发后台代码.刚开始的时候无论返回true或false都会执行后台代码(asp.net写法),看了h ...
- Kafka序列化和反序列化与示例
1. 卡夫卡序列化和反序列化 今天,在这篇Kafka SerDe文章中,我们将学习使用Kafka创建自定义序列化器和反序列化器的概念.此外,我们将了解序列化在Kafka中的工作原理以及为什么需要序列 ...
- 关于st表
#include<cstdio> #include<iostream> #include<cmath> #include<cctype> #includ ...
- 【LeetCode】 #9:回文数 C语言
目录 题目 思路 初步想法 进一步想法 最后想法 总结 最近打算练习写代码的能力,所以从简单题开始做. 大部分还是用C语言来解决. @(解法) 题目 判断一个整数是否是回文数.回文数是指正序(从左向右 ...
- Select与Epoll的区别
相同点: 都是IO多路转接,都是一个线程能同一时间等待一堆描述符 不同点: 1.select接口使用不方便,每次调用完select都需要重新设置fd_set,因为输入输出未分离,返回的fd_set ...