python爬虫正则表达式爬妹子图

声明:仅为了学习爬虫,请勿用于商业和恶意爬取数据,否则后果自负,作者享有该文章的所有解释权
原创文章:只需要在程序运行时输入一个数字,就会爬取1-该页数的图片,并且爬取小图对应的详情大图(套图),代码复制可用,下面是我爬取的部分数据。
小图太过性感,这里就不截图了

import requests
import re
import os

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
    #referer后面的链接是图片的主页链接,就是你点击某张图是网站判断你是从主页点过来的
    'Referer':'https://www.mzitu.com/'
}
url = "https://www.mzitu.com/page/"
def qsbk(page_nums):
    for i in range(1,page_nums + 1):
        page = str(i)
        # 拼接路由  http://www.qiumeimei.com/page/1
        page_url = url + page + "/"
        # 请求页面数据     注意url=上面修改过的
        response = requests.get(url=page_url,headers=headers)
        # 获取页面数据
        page_text = response.text
        #获取图片路径
        img_list = re.findall("data-original='(.*?)'",page_text,re.S)
        # 到详情页的路径
        big_img_list = re.findall('<li><a href="(.*?\d{6})" target=.*?><img.*?></a>.*?</li>',page_text,re.S)
        # 定义一个目录
        img_path = "./img"
        if not os.path.exists(img_path + page):
            os.makedirs(img_path + page)
        for k,j in enumerate(img_list):
            # print(k,j)  索引和url   每个索引和详情页列表的所有一样
            # 列表页url
            # print(j)    https://i.meizitu.net/thumbs/2019/08/190034_16b34_236.jpg
            filename = j.split("/")[-1]
            response = requests.get(url=j,headers=headers)
            small_img = response.content
            filenames = img_path + page + "/" + filename
            #持久化存储  这个存储的是每个页面的小图
            with open(filenames,"wb") as f:
                f.write(small_img)
                print("正在下载第%s页数据,图片%s下载成功"%(page,filename))
            # 先请求详情页的信息,只为判断总页数
            detail_url = big_img_list[k]
            response = requests.get(url=detail_url,headers=headers)
            img_text = response.text
            # 页数
            nums = re.findall('<div class="pagenavi">.*?<span>(\d{2})</span>.*?</div>', img_text, re.S)
            if nums:
                num = nums
            else:
                nums = re.findall('<div class="pagenavi">.*?<span>(\d{1})</span>.*?</div>', img_text, re.S)
            num = nums
            # 列表取值
            number = int(num[0])
            # 变量每个小图的详情页
            for m in range(2,number):
                #首次访问详情页
                detail_url = big_img_list[k] + "/" + str(m) +"/"
                response = requests.get(url=detail_url,headers=headers)
                detail_text = response.text
                #正在找到图片----------------------------该找详情页的大图了------------------------------
                detail_imgs = re.findall('<div class="main-image">.*?<img src="(.*?)".*?/>.*?</div>', detail_text, re.S)[0]
                detail_name = re.findall('<div class="main-image">.*?<img.*? alt="(.*?)".*?/>.*?</div>', detail_text, re.S)
                # print(detail_imgs)          #['https://i.meizitu.net/2019/06/16d01.jpg']
                # print(detail_name)          #['好身材就要秀出来']
                response = requests.get(url=detail_imgs,headers=headers)
                img_texts = response.content
                img_name = detail_name[0]                           #文件夹名字
                img_name_single = detail_imgs.split("/")[-1]        # 单个文件的名字
                new_path = "./img/{}/".format(img_name)
                if not os.path.exists(new_path):
                    os.makedirs(new_path)
                new_name = new_path + img_name_single
                with open(new_name,"wb") as f:
                    f.write(img_texts)
                    print("%s下载完成"%img_name_single)
            print("%s下载完成"%detail_name)

#下面这种写法只有在本程序中可用,不能import到其他程序中使用
if __name__ == '__main__':
    page_num = int(input("请输入要查询的总页数:"))
    qsbk(page_num)

发布了30 篇原创文章 · 获赞 5 · 访问量 3335

猜你喜欢

转载自blog.csdn.net/Python_DJ/article/details/98779034
今日推荐