使用python爬虫批量下载美女图片 - Go语言中文社区

使用python爬虫批量下载美女图片


嗯,最近由于需要写一个爬虫小程序,所以学了一点爬虫。

可是只是按照教程学好没劲啊,于是就想着能不能做点小项目,爬取个美女图片呢。

对于新手来说,还是找一个html网站比较好

我们在这个例程使用的网站根目录是   www.tu11.com

本例程使用的python是3.6版本的

#coidng:utf-8
import requests
from PIL import Image
from bs4 import BeautifulSoup
import os
import time

PS:内容来源于网络,如有侵权请联系我删除

先给大家看一下我爬取的结果

 

这真的是一个对新手非常友好的网站,先给大家看一下他页面的url

http://www.tu11.com/BEAUTYLEGtuimo/2018/14221.html

可以很明显的看到,最后的那个有图片的页面全部都是放在2018文件夹里面的

我们使用F12工具,可以很容易找到图片url存放的标签

我们可以看到,图片的src存放在 div-》p-》a-》img的src属性里。

这个页面非常简单,其实align属性为“center”的p只有一个,也就是说我们用这个属性定为p就能找到我们想要的img标签。

我用的是beautifulsoup的find方法,比如

soup.find("p", {"align":"center"})   就是找到那个为p的标签

p标签的子标签就是a标签,a标签的子标签就是img标签,img["src"]就是我们要的图片url

然后通过这个url来下载图片

"""
保存图片函数
@param url 图片的路径
@param filename 图片保存的名字
@param root_path 保存图片的根目录
"""
def get_image(url, filename, root_path):
    img = requests.get(url)
    if(filename[-4:] == "html"):
        filename = filename.replace("html", "jpg")
    img_path = os.path.join(root_path, filename)
    with open(img_path, "wb+") as f:
        for chunk in img.iter_content(1024):
            f.write(chunk)
    print(filename + "保存成功n")

for chunk in img.iter_content(1024) 可以边下载边保存,一次下载指定的字节数

当我们下载好了这个图片的时候就要到下一页去进行下载,

使用F12找到下一页的标签

然后用同样的方式提取出a标签的href属性

我们再来看一下url

http://www.tu11.com/BEAUTYLEGtuimo/2018/14221.html

于是很快我们就发现,href属性就是下一页的文件名,我们需要把url最后的部分替换成href的内容

替换函数为

url.replace(filename_old, filename_new)

这样就能一直访问下去知道最后一页。

到了最后一页的时候,我们需要通过推荐找到别的套图url地址

同样的方法找到标签

网页前端代码写的很清晰,注释很全,所以标签应该不难找

"""
当没有下一页的时候,就在推荐里面找第一个作为下一次的url
@param r response对象
"""
def get_next(r):
    soup = BeautifulSoup(r.text, "html.parser")
    div = soup.find("div", {"class":"spb"})
    href = div.find("a")["href"]
    print(href)
    url = ""
    url = base_url + href
    print(url)
    return url

全部的代码如下:

#coidng:utf-8
import requests
from PIL import Image
from bs4 import BeautifulSoup
import os
import time

"""
保存图片函数
@param url 图片的路径
@param filename 图片保存的名字
@param root_path 保存图片的根目录
"""
def get_image(url, filename, root_path):
    img = requests.get(url)
    if(filename[-4:] == "html"):
        filename = filename.replace("html", "jpg")
    img_path = os.path.join(root_path, filename)
    with open(img_path, "wb+") as f:
        for chunk in img.iter_content(1024):
            f.write(chunk)
    print(filename + "保存成功n")

#网站的根目录
base_url = "http://www.tu11.com"

"""
当没有下一页的时候,就在推荐里面找第一个作为下一次的url
@param r response对象
"""
def get_next(r):
    soup = BeautifulSoup(r.text, "html.parser")
    div = soup.find("div", {"class":"spb"})
    href = div.find("a")["href"]
    print(href)
    url = ""
    url = base_url + href
    print(url)
    return url

#文件夹根目录
path = "亿秀网"
"""
逐页读取图片的url地址
@param initial_url  初始url
@param make_dirs 是否建立新文件夹 False为否
@param folder 存放图片的文件夹
"""
def spider(initial_url, make_dirs = False, folder = None):
    r = requests.get(initial_url)
    r.encoding = "gbk"
    soup = BeautifulSoup(r.text, "html.parser")
    title = "/" + soup.title.string
    p = soup.find("p", {"align":"center"})
    a_s = p.find_all("a")
    folder_dir = path + title
    print("文件夹路径:" + folder_dir)
    if (not os.path.exists(folder_dir) and make_dirs==True):    #如果没有这个文件夹就建一个
        os.makedirs(folder_dir)
        print("成功建立文件夹")
    for a in a_s:
        href = a["href"]
        print(href)
        #读取图片的地址并且保存
        img_src = a.img["src"]
        filename = initial_url.split("/")[-1]
        print(filename)
        if(folder == None):     #如果文件夹名为None就用刚刚建的文件夹
            get_image(img_src, filename, folder_dir)
        else:                   #否则就用传入的文件夹
            get_image(img_src, filename, folder)
        if(href[-4:] == "html" and len(href) < 16):    #如果下一页还有的话
            print("该页面还有下一页,进行迭代操作")
            initial_url = initial_url.replace(filename, href)
            print("下一个url:", initial_url + "n")
            time.sleep(1)
            if(folder == None):  #如果没有传入文件夹就用新建立的文件夹
                return initial_url, folder_dir
            else:                #否则就用传入的文件夹
                return initial_url, folder
        elif(len(href) >= 16 or href[:4]=="java"):                #如果没有下一页了就开始寻找新的url
            print("到这里了n")
            new_url = get_next(r)
            return new_url, None
        time.sleep(1)                 #休眠一秒

"""
开始函数
@param start_url 开始函数
"""
def start(start_url):
    initial_url = start_url
    next_url, folder = spider(initial_url, make_dirs=True, folder=None)
    while(next_url != None):
        if(folder == None):         #新的一组图片,要新建文件夹
            next_url, folder = spider(next_url,make_dirs=True, folder=folder)
        elif(folder != None):
            next_url, folder = spider(next_url,make_dirs=False, folder=folder)
        print("floder=",folder)

if __name__ == "__main__":
    #判断根目录有没有 亿秀网 文件夹
    exist = os.path.exists("亿秀网")
    if not exist:
        os.makesdirs("亿秀网")
    url = "http://www.tu11.com/BEAUTYLEGtuimo/2018/14123.html"
    start(url)

对了,别忘了每下载一张图片都sleep(1)秒,稍微伪装一下。

主函数里的url就是开始url,你可以替换成任意的一个起始url,不过还是推荐用BEAUTYLEG的图片,因为其他的url推荐栏的内容都是一样的,这样就不能一次爬取很多图片了。

不过用BEAUTYLEG也有可能有重复,可以写一个函数来判断是不是重复。

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/haohulala/article/details/85005354
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-01 22:39:01
  • 阅读 ( 1299 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢