本文主要介绍如何爬取某图片网单个栏目的多张图片并下载保存到本地文件夹中
首先说一下我们这次实战的目标是什么:
https://www.meitulu.com/item/16559.html
我们的目标是爬取这个链接里面的一个性感可爱的小姐姐的图片然后下载下来,怎么样大家是不是有点兴奋,废话不多说,咱们直接开始吧
首先,打开上面的链接,我们先看看页面的结构:
我们要拿到每张大图的地址,还有每个分页的地址
这是图片的地址
这是分页的地址
所以,我们可以通过
img_tags=soup.find("div",class_="content").find("center").find_all("img")
获取到图片标签,在获取其src属性来获取图片的链接
通过
page_tags=soup.find("div",attrs={"id":"pages"}).find_all("a")
获取分页的a标签,在获取其href属性来获取分页的链接,每个分页大概有3,4张图片,一个小姐姐就差不多有三四十张图片
接下来我们要写一个类来实现图片的抓取和存储
# coding=utf-8
import requests
from bs4 import BeautifulSoup
from urllib.parse import urlparse
import os,time,random
url="https://www.meitulu.com/item/16559.html"
class dl_plmm:
def __init__(self,url):
self.url=url
urlinfo=urlparse(url)
#self.baseurl用来存储域名,即:https://www.meitulu.com
self.baseurl=urlinfo.scheme+"://"+urlinfo.netloc
print(self.baseurl)
#生成一个集合用来去重,该集合用于存储分页链接
self.page_links=set()
#打开页面并获取内容
def openurl(self,url):
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36",
"Referer":"https://www.meitulu.com/t/aiyouwu/"
}
#请求页面,并且请求头包含了浏览器信息和Referer,如果没有Referer,是无法请求到图片的
res=requests.get(url,headers=headers)
if res.status_code == 200:
#返回页面的内容
return res.content
else:
print(res.text)
#获取所有列表页链接
def store_page_links(self):
content=self.openurl(self.url)
soup=BeautifulSoup(content,"html.parser")
page_tags=soup.find("div",attrs={"id":"pages"}).find_all("a")
for page_tag in page_tags:
self.page_links.add(page_tag['href'])
#访问所有列表页并下载图片
def dl_imgs(self,page_link):
page_content=self.openurl(self.baseurl+page_link) #列表页的链接是不含域名的,这里将它拼接为完整url
soup=BeautifulSoup(page_content,"html.parser")
img_tags=soup.find("div",class_="content").find("center").find_all("img")
if len(self.page_links)==0:
return
for img_tag in img_tags:
img_src=img_tag["src"]
print("下载图片:%s" % (img_src))
img_content=self.openurl(img_src)
#print(img_content)
#定义文件名,文件名用时间戳和随机数字命名,以避免文件名有重复
fn=str(int(time.time()))+str(random.randint(100,999))+".jpg"
with open(fn,"wb") as f:
f.write(img_content)
#开始运行
def run(self):
#获取所有page的url
self.store_page_links()
#如果不存在imgs文件夹,就创建一个imgs文件夹
if not os.path.isdir("imgs"):
os.mkdir("imgs")
#切换当前目录为imgs
os.chdir("imgs")
#下载图片
for page_link in self.page_links:
self.dl_imgs(page_link)
spider=dl_plmm(url)
spider.run()
整个过程就是先在初始url的页面获取所有分页的地址,并且存到变量page_links中,然后遍历请求page_links中的所有分页,从每个分页中获取图片的地址,最后请求这些图片地址然后下载图片。openurl方法既可以请求分页,又可以请求图片,返回的是请求到的内容。
在爬取的过程中,爬图片的时候被提示403 Forbidden,后台发现是对方做了一点小小的防御,为了防止其他网站盗用他们的图片,该网站做了Referer的验证,如果对图片发出请求的地址不是https://www.meitulu.com/t/aiyouwu/的话就禁止访问。所以后来我在请求的header头中加入了"Referer":"https://www.meitulu.com/t/aiyouwu/"就解决了这个问题。
header头如何获取,可以F12,查看浏览器中的请求头信息来获取
最后,我们看看爬取的成果:
大家放心,都是正常的写真图片,都穿着衣服的,不过这是技术博客,不是写真网站,我还是打上了马赛克,如果大家想看,就动手自己实现这个脚本吧!