重点:

1. 用def函数

2. 使用 os.path.dirname("路径保存") , 实现每组图片保存在独立的文件夹中

方法1:

import requests
from lxml import etree
import os
import time start = time.time() def mz_spider(base_url, headers_one):
res = requests.get(url=base_url, headers=headers_one) # 请求链接
base_html = etree.HTML(res.text) # 解析html img_src = base_html.xpath('//div[@class="postlist"]/ul/li/a/@href')
for img_url in img_src:
# print(img_url)
img_parse(img_url) def img_parse(img_url):
headers = {
"User-Agent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; SE 2.X MetaSr 1.0)",
'Referer': "https://www.mzitu.com/"
}
res_sec = requests.get(url=img_url, headers=headers)
html_sec = etree.HTML(res_sec.text) try:
# 由于会出现 list index out of range,所以用try进行,获取标题
title = html_sec.xpath('//div[@class="content"]/h2/text()')[0]
# print(title)
# 获取图片总页数
page_num = html_sec.xpath('//div[@class="pagenavi"]/a/span/text()')[-2]
# print("这组图一共有:{} 页".format(page_num))
# 拼接图片详情页地址
for num in range(1, int(page_num) + 1):
# 拼接每个图片url
img_per_url = img_url + "/" + str(num)
download_img(img_per_url, title)
except Exception as e:
print(e)
else:
pass # 下载图片
def download_img(img_per_url, title):
res_per = requests.get(url=img_per_url, headers=headers_one)
html_per = etree.HTML(res_per.text) # 提取每个图片的url
img_down_url = html_per.xpath('//div[@class="main-image"]/p/a/img/@src')[0] # 解析图片url 把 html3 每个图片再解析拿到 content
res_down = requests.get(img_down_url, headers=headers_one)
# 把图片文件装入内容
data = res_down.content
# 下载文件,设置保存文件和路径
# 获取文件所在的路径,注意的是路径是 D:/图片/mz
path = os.path.dirname("D:\图片\mz\\0.py")
img_name = img_down_url.split('/')[-1]
# 设置文件夹名称
folder_name = title.replace(' ', '')
# 保存的地址是 C:\py_code\new_code\mz\"title"
root_dir = path + "\\" + folder_name # 新建文档的文件夹
if not os.path.exists(root_dir):
os.makedirs(root_dir) # 设置保存文件的绝对地址
with open(root_dir + "\\" + img_name, "wb") as f:
f.write(data)
# 强行把缓冲区中的内容放到磁盘中
f.flush()
f.close()
print(img_name + "__文件下载成功: " + title) if __name__ == "__main__":
headers_one = {
"User-Agent": 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0)',
'Referer': "https://www.mzitu.com/"
} for i in range(1, 10):
base_url = 'https://www.mzitu.com/page/{}/'.format(str(i))
time.sleep(0.5)
mz_spider(base_url, headers_one) print("全部下载完成,耗时 %d s" % (start - time.time()))

  

方法2:

import requests
from lxml import etree
import time
import os start = time.time()
headers_one = {
"User-Agent": 'Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13',
'Referer': "https://www.mzitu.com/"
} headers_two = {
"User-Agent": 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36',
'Referer': "https://www.mzitu.com/"
} headers_three = {
"User-Agent": 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
'Referer': "https://www.mzitu.com/"
} # 构建所有要抓取的页面链接
for i in range(1, 3):
base_url = 'https://www.mzitu.com/page/{}/'.format(str(i))
print(" ———— 现在抓取第{}页 ".format(i) + base_url) base_response = requests.get(url=base_url, headers=headers_one) # 请求链接
print(base_response)
base_html = etree.HTML(base_response.text) # 解析html # 第一层主页面,获取每组图片的链接和详细信息
# 获取每组图片的主链接
img_urls = base_html.xpath('//div[@class="postlist"]/ul/li/a/@href') for img_url in img_urls:
print("抓取第{}页, 这组图片的 img_url: ".format(i) + img_url)
# 第二层,每组图片的详细页面
res_two = requests.get(url=img_url, headers=headers_two)
html_sec = etree.HTML(res_two.text) try:
# 由于会出现 list index out of range,所以用try进行
# 获取标题
title = html_sec.xpath('//div[@class="content"]/h2/text()')[0]
# 获取图片总页数
page_num = html_sec.xpath('//div[@class="pagenavi"]/a/span/text()')[-2]
print("这组图一共有:{} 页".format(page_num))
page = int(page_num) + 1 # 拼接图片详情页地址
for num in range(1, page):
# 拼接每个图片url
img_per_url = img_url + "/" + str(num)
# print("组图中的第{}张图的URL ".format(num) + img_per_url)
# 解析每个图片所在的网页,获取每个图片的URL
res_three = requests.get(url=img_per_url, headers=headers_three)
html_url = etree.HTML(res_three.text)
# 提取每个图片的url
img_down_url = html_url.xpath('//div[@class="main-image"]/p/a/img/@src')[0]
# print("图片下载的 img_down_url: " + img_down_url) # 第三层,解析图片url 把 html3 每个图片再解析拿到 content
res_four = requests.get(img_down_url, headers=headers_three)
# 把图片文件
data = res_four.content # 下载文件,设置保存文件和路径
# 获取文件所在的路径,注意的是路径是 C:/py_code/new_code/mz
path = os.path.dirname("C:/py_code/new_code/mz/0.py")
# 获取图片名称
img_name = img_down_url.split('/')[-1]
# 设置文件夹名称
folder = title.replace(' ', '')
# 保存的地址是 C:/py_code/new_code/mz/"title"
root_dir = path + "/" + folder # 新建文档的文件夹
if not os.path.exists(root_dir):
os.makedirs(root_dir)
else:
# 如果存在就不做更改
pass
# 设置保存文件的绝对地址
with open(root_dir + "/" + img_name, "wb") as f:
f.write(data)
# 强行把缓冲区中的内容放到磁盘中
f.flush()
f.close()
print(img_name + "__文件下载成功: " + title)
time.sleep(0.5) except Exception as e:
print(e)
continue
else:
pass print("完了,程序耗时是:%f s" % (start-time.time()))

  

python实战项目 — 爬取 妹子图网,保存图片到本地的更多相关文章

  1. python实战项目 — 爬取 校花网图片

    重点: 1.  指定路径创建文件夹,判断是否存在 2. 保存图片文件 # 获得校花网的地址,图片的链接 import re import requests import time import os ...

  2. python实战项目 — 爬取中国票房网年度电影信息并保存在csv

    import pandas as pd import requests from bs4 import BeautifulSoup import time def spider(url, header ...

  3. 小白学 Python 爬虫(16):urllib 实战之爬取妹子图

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  4. Python 爬虫入门(二)——爬取妹子图

    Python 爬虫入门 听说你写代码没动力?本文就给你动力,爬取妹子图.如果这也没动力那就没救了. GitHub 地址: https://github.com/injetlee/Python/blob ...

  5. Python 爬虫入门之爬取妹子图

    Python 爬虫入门之爬取妹子图 来源:李英杰  链接: https://segmentfault.com/a/1190000015798452 听说你写代码没动力?本文就给你动力,爬取妹子图.如果 ...

  6. 利用Python网络爬虫爬取学校官网十条标题

    利用Python网络爬虫爬取学校官网十条标题 案例代码: # __author : "J" # date : 2018-03-06 # 导入需要用到的库文件 import urll ...

  7. Python 2.7_First_try_爬取阳光电影网_20161206

    之前看过用Scrapy 框架建立项目爬取 网页解析时候用的Xpath进行解析的网页元素 这次尝试用select方法匹配元素 1.入口爬取页面 http://www.ygdy8.com/index.ht ...

  8. python爬虫项目-爬取雪球网金融数据(关注、持续更新)

    (一)python金融数据爬虫项目 爬取目标:雪球网(起始url:https://xueqiu.com/hq#exchange=CN&firstName=1&secondName=1_ ...

  9. Python爬虫项目--爬取自如网房源信息

    本次爬取自如网房源信息所用到的知识点: 1. requests get请求 2. lxml解析html 3. Xpath 4. MongoDB存储 正文 1.分析目标站点 1. url: http:/ ...

随机推荐

  1. oracle 游标使用详解

    -- 声明游标:CURSOR cursor_name IS select_statement--For 循环游标--(1)定义游标--(2)定义游标变量--(3)使用for循环来使用这个游标decla ...

  2. 数据库 Hash Join的定义,原理,算法,成本,模式和位图

    Hash Join只能用于相等连接,且只能在CBO优化器模式下.相对于nested loop join,hash join更适合处理大型结果集       Hash Join的执行计划第1个是hash ...

  3. Using HAProxy as an API Gateway, Part 1 [Introduction]

    转自:https://www.haproxy.com/blog/using-haproxy-as-an-api-gateway-part-1/ An API gateway handles load ...

  4. dinoql 试用

    dinoql 前面有过介绍,详细的参考文档即可,这篇主要是简单使用 注意目前dinoql 直接通过node 运行会有window 的问题,有好几种解决方法,后边会说明 环境准备 项目初始化 yarn ...

  5. Configure JSON.NET to ignore DataContract/DataMember attributes

    https://stackoverflow.com/questions/11055225/configure-json-net-to-ignore-datacontract-datamember-at ...

  6. 25-ESP8266 SDK开发基础入门篇--控制WIFI连接路由器

    https://www.cnblogs.com/yangfengwu/p/11324411.html 说个事情,现在SDK的版本已经出到3.0了,但是我还是使用2.0 如果只是为了学习研究   选择3 ...

  7. [USACO06FEB] Stall Reservations 贪心

    [USACO06FEB] Stall Reservations 贪心 \(n\)头牛,每头牛占用时间区间\([l_i,r_i]\),一个牛棚每个时间点只能被一头牛占用,问最少新建多少个牛棚,并且每头牛 ...

  8. JVM内存的划分

    JVM内存的划分有五片: 1.   寄存器: 2.   本地方法区: 3.   方法区: 4.   栈内存: 5.   堆内存.

  9. python selenium chrome 实现自动化登录

    1.环境安装 selenium的开发文档网址(英语好的可以直接看这个,写的很详细):http://selenium-python.readthedocs.io/ 因为实现的时候使用的是谷歌浏览器,在运 ...

  10. 初探Android逆向:通过游戏APP破解引发的安全思考

    如今移动互联网已经完全融入到我们的生活中,各类APP也是层出不穷,因此对于安卓APP安全的研究也尤为重要.本文通过对一款安卓APP的破解实例,来引出对于APP安全的探讨.(本人纯小白,初次接触安卓逆向 ...