文档章节

python实战项目 — 爬取 妹子图网,保存图片到本地

o
 osc_wws45aot
发布于 2019/08/20 15:15
字数 1049
阅读 10
收藏 0

精选30+云产品,助力企业轻松上云!>>>

 

重点:

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()))

  

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
7个Python爬虫实战项目教程

有很多小伙伴在开始学习Python的时候,都特别期待能用Python写一个爬虫脚本,实验楼上有不少python爬虫的课程,这里总结几个实战项目,如果你想学习Python爬虫的话,可以挑选感兴趣的学习哦;...

实验楼
2017/12/05
0
0
python 爬虫爬取煎蛋网妹子图

python 爬虫爬取煎蛋网妹子图 前言 大家好,这里是「brucepk」爬虫 系列教程。此文首发于「brucepk」公众号,欢迎大家去关注。此系列教程以实例项目为材料进行分析,从项目中学习 python 爬虫...

osc_kpp7htz3
2018/07/07
4
0
python入门之爬虫篇 爬取图片,文章,网页

一,首先看看Python是如何简单的爬取网页的 1,准备工作 项目用的BeautifulSoup4和chardet模块属于三方扩展包,如果没有请自行pip安装,我是用pycharm来做的安装,下面简单讲下用pycharm安装...

osc_ea6pnve7
05/24
11
0
python入门之爬虫篇 爬取图片,文章,网页

一,首先看看Python是如何简单的爬取网页的 1,准备工作 项目用的BeautifulSoup4和chardet模块属于三方扩展包,如果没有请自行pip安装,我是用pycharm来做的安装,下面简单讲下用pycharm安装...

weixin_42636275
05/23
0
0
python各类爬虫案例,爬到你手软!

小编整理了一些爬虫的案例,代码都整理出来了~ 先来看看有哪些项目呢: python爬虫小工具(文件下载助手) 爬虫实战(笔趣看小说下载) 爬虫实战(VIP视频下载) 爬虫实战(百度文库文章下载...

糖宝lsh
2019/04/14
814
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux安装redis服务器和部署

Linux安装redis和部署 第一步:下载安装包 wget http://download.redis.io/releases/redis-5.0.5.tar.gz 访问https://redis.io/download 到官网进行下载。这里下载最新的5.0.5版本. 第二步:...

osc_3ytpwpyb
30分钟前
23
0
IF函数,根据条件设定输入内容

if函数通常用于条件判断,根据判断结果执行相应命令。 1.函数解释: IF(logical_test, [value_if_true], [value_if_false]) logical_test 必需。 计算结果为 TRUE 或 FALSE 的任何值或表达式...

osc_sumf8h95
31分钟前
9
0
Pytorch自定义dataloader以及在迭代过程中返回image的name

pytorch官方给的加载数据的方式是已经定义好的dataset以及loader,如何加载自己本地的图片以及label? 形如数据格式为 image1 label1 image2 label2 ... imagen labeln 实验中我采用的数据的...

osc_l8u38961
33分钟前
6
0
灯塔

\[love\ and \ share \] 我怎么感觉变成了好东西推荐呢?算了,本来也差不多 还没写完,想到再更 有好看玩的能不能评论一下,qwq 动漫 大多是些国漫,多在\(b\)站、腾讯视频、盗版小网站能够...

osc_dc6pbw3x
34分钟前
17
0
网易首页 」 网易手机 」 正文 苹果超薄触摸显示技术专利曝光:重新定义轻薄

最近,苹果公司的新屏幕专利技术已经曝光。特别是苹果公司的新型超薄触摸技术,它可以降低显示器的结构水平,消除多余的电路,并使屏幕更薄。该专利表明,这项新技术适用于iPhone,iPad,App...

osc_opzpp18v
35分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部