社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
嗯,最近由于需要写一个爬虫小程序,所以学了一点爬虫。
可是只是按照教程学好没劲啊,于是就想着能不能做点小项目,爬取个美女图片呢。
对于新手来说,还是找一个html网站比较好
我们在这个例程使用的网站根目录是 www.tu11.com
本例程使用的python是3.6版本的
#coidng:utf-8
import requests
from PIL import Image
from bs4 import BeautifulSoup
import os
import time
先给大家看一下我爬取的结果
这真的是一个对新手非常友好的网站,先给大家看一下他页面的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也有可能有重复,可以写一个函数来判断是不是重复。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!