Python老司机手把手带你写爬虫,整站下载妹子图,一次爽个够!

时间:2022-07-23
本文章向大家介绍Python老司机手把手带你写爬虫,整站下载妹子图,一次爽个够!,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

今天就来带大家写一个简单而又完整的爬虫,我们来抓取整站的图片的,并且保存到电脑上!

准备工作

工具:Python3.6、pycharm

库:requests、re、time、random、os

目标网站:妹子图(具体url大家自己去代码里看。。。)

在写代码之前

在我们开始写代码之前,要先对网站进行分析,重点有这个几个地方:

1、先判断网页是否静态网页,这个关系我们采用的爬虫手段!

简单的说,网页中的内容,在网页源代码中都可以找到,那么就可以断定,这个网站是静态的了;如果没有找到,就需要去开发者工具中查找,看看是抓包呢还是分析js结构或者其他的方式。

2、看看网页的结构,大致清楚抓取目标数据,需要几层循环,每次循环的方式,以及是否保证没有遗漏!

3、根据网页源代码来决定采用的匹配方式

一般来说,正则表达式是处理字符串最快的方式,但是在爬虫中它的效率并不是很高,因为它需要遍历整个html来匹配相关内容,如果网页源代码比较规整的话,建议采用bs4或者xpath等等解析网页结构的方式比较好!

当然,今天我们是基础向的爬虫,就用正则表达式了,毕竟正则是必须掌握的内容!

那么,具体怎么写爬虫代码呢~?简单的举例给大家说下:

如果是手工操作的话,大概是这个流程

打开主页==>选择一个分类==>选择一个图集==>依次选择图片==>右键保存==>重复以上保存其他图片

那么这个过程放到代码中呢,它的结构大概是这样:

访问主页url==>找到并循环所有分类==>创建分类文件夹==>访问分类url==>找到页码构建循环分类所有页==>循环页面所有图集==>创建图集文件夹==>找到图集内所有图片url==>保存到对应文件夹

好了,思路也有了,那就废话不多说了,我们来写代码吧~!

完整代码和运行效果

在请求中加入了时间模块的暂停功能,不加入的话可能会被网页拒绝访问!

在最后请求图片地址的时候,需要加入UA来告诉服务器你是浏览器而不是脚本,这个是最常用的反爬手段了

#author:云飞
#QQ群542110741
import requests
import time
import random
import re
import os

def new_title(title):
    rstr = r"[/\:*?"<>|]"  # '/  : * ? " < > |'
    new_title = re.sub(rstr, "_", title)  # 替换为下划线
    return new_title

url = 'http://www.meizitu.com/'
html = requests.get(url)
html.encoding = 'gb2312'
infos = re.findall(r'a href="(http://www.meizitu.com/.*?html)"  target="_blank" title="(.*?)" ',html.text)
i = 1
for sor_url,sor in infos:
    sor = new_title(sor)
    path = 'E://python/mn/meizitu/%s/'%sor#路径
    if os.path.exists(path):#判断路径及文件夹是否存在,不存在即创建
        pass
    else:
        os.mkdir(path)
    time.sleep(random.random())
    sor_html = requests.get(sor_url)
    sor_html.encoding = 'gb2312'
    atlas = set(re.findall(r"<li><a href='(.*?html)'>d+</a></li>",sor_html.text))
    atlas_lis = []
    atlas_lis.append(sor_url)
    atlas_lis += [url+'a/'+x for x in list(atlas)]
    for atla in atlas_lis:
        atla_html = requests.get(atla).text
        at_url_lis = re.findall(r'h3 class="tit"><a href="(http://www.meizitu.com/.*?html)"  targe',atla_html)
        for at_url in at_url_lis:
            at_html = requests.get(at_url)
            at_html.encoding = "gb2312"
            atlas_title = ''.join(re.findall(r'<title>(.*?)</title>',at_html.text))
            atlas_title = new_title(atlas_title)
            img_path = 'E://python/mn/meizitu/%s/%s/'%(sor,atlas_title)
            if os.path.exists(img_path):#判断路径及文件夹是否存在,不存在即创建
                pass
            else:
                os.mkdir(img_path)
            img_urls = re.findall(r'src="(http://mm.chinasareview.com/.*?jpg)" /><br />',at_html.text)
            k = 1
            for img_url in img_urls:
                header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:57.0) Gecko/20100101 Firefox/57.0'}
                data = requests.get(img_url,headers=header).content#获取图片的二进制格式
                with open('%s%s'%(img_path,img_url.split('/')[-1]),'wb') as f:
                    f.write(data)
                print("【正在下载】 {%s}的第%d张图片,一共下载了%d张图片"%(atlas_title,k,i))
                i += 1
                k += 1

下载一段时间后的效果

------------------- End -------------------

欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持

万水千山总是情,点个【在看】行不行

*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

/今日留言主题/

随便说一两句吧~~