重点:

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. idea中properties配置文件 注释显示中文乱码问题

  2. Lightning Web Components 安装试用(一)

    Lightning Web Components 简称(lwc) 是一个快速企业级的web 组件化解决方案,同时官方文档很全,我们可以完整的 学习lwc 项目结构 使用npx 官方提供了一个creat ...

  3. virtualenvwrapper 方便的virtualenv 包装

      virtualenvwrapper 是一个方便的virtualenv 包装我们可以用来方便的管理python 的开发环境,同时 也支持对于项目的管理 安装 pip 安装 pip install v ...

  4. CSPS_109

    T1 状压+位运算解决 T2 打完暴力后感到了迷茫.. 不过看这张表里1的数目占了一半之多,应该合法情况挺多的 拿出了从未用过的srand(time(0)); 结果撞上正解了(笑)(rp--) 现在$ ...

  5. 【luoguP2371】 [国家集训队]墨墨的等式

    题目链接 考虑将所有的\(a_1x_1+a_2x_2+--+a_nx_n=B\)对\(a_1\)取模,那么所有可达到的B就分为了\(0\)~\(a_1-1\)类 如果对\(a_1\)取模为\(k\)的 ...

  6. ICEM-圆角正方体

    原视频下载地址:https://pan.baidu.com/s/1c2cNgJm 密码: rci8

  7. ICEM-缺口圆柱

    原视频下载地址:https://pan.baidu.com/s/1bpahxd9 密码: bpp7

  8. scrapy+splash 爬取京东动态商品

    作业来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/3159 splash是容器安装的,从docker官网上下载windows下的 ...

  9. session机制,浏览器禁用cookie后,怎么使用session

    sessionid是存储在cookie中的,解决方案如下: Session URL重写,保证在客户端禁用或不支持COOKIE时,仍然可以使用Session session机制.session机制是一种 ...

  10. 【定制开发】经纪人报备软件 全民经纪人系统 房产中介微信小程序分享家恒房通

    信真科技2019年最先扛鼎之作 - 全民经纪人软件系统 1.含有最基础的经纪人注册.客户报备系统功能: 2.可支持定制开发,针对房企售楼部.中介门店: 3.与微信端绑定使用,方便快捷,快速分享: 4. ...