1 思路介绍
- 我们的目的是爬取每一位小姐姐的所有图片,并将不同种类的图片存放在不同目录下,因此需要创建主目录,以及下面的分目录
- 顺序为:先爬取第一个小姐姐的所有图片,再爬取下一个小姐姐的图片,第一页24位小姐姐爬完后,翻到第二页继续
1、查看网站页面的地址:
通过翻页可以找到规律
2、分析网页代码,可发现图片所在的标签
并且可以看到图片地址和名称
3、点击第二张图片,查看该人物不同图片的地址,找出规律,以用为实现翻页
以此类推。
2 完整代码
import requests
import re
from bs4 import BeautifulSoup
import time
import os
# 获取网站
def getHTMLText(url):
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
html = r.text
return html
# 创建目录
def creatFilesName(fileName,img_1_name):
files_name = '清纯小姐姐'
if not os.path.exists(files_name):
os.mkdir(files_name)
for name in img_1_name:
file_name = files_name + '/' + name
if not os.path.exists(file_name):
os.mkdir(file_name)
fileName.append(file_name)
def getFirstFile(html, img_1_name, img_1_html):
soup_1 = BeautifulSoup(html, "html.parser")
plt_1 = soup_1.find_all('div', class_="item_t")
# 获取图片的名称和文件地址
Re_1_html = re.findall('href="(.*?)"', str(plt_1))
Re_1_name = re.findall('alt="(.*?)"', str(plt_1))
for name in Re_1_name:
img_1_name.append(name)
# 过滤列表中的"###"
for i in range(len(Re_1_html)):
if Re_1_html[i] != "###":
img_1_html.append(Re_1_html[i])
def getimgsHTML(html, imgs):
soup_2 = BeautifulSoup(html, "html.parser")
plt_2 = soup_2.find('p', align='center')
Re_img = re.findall('src="(.*?)"', str(plt_2))
imgs.append(Re_img[0])
# 获取每张图片,储存在空列表imgs中
def getImgs(html, imgs, url_0, j):
getimgsHTML(html, imgs)
for i in range(20):
try:
url_2 = 'https://www.mmonly.cc/mmtp/qcmn/322' + url_0[j] + '_' + str(i) + '.html'
html_2 = getHTMLText(url_2)
except:
continue
getimgsHTML(html_2, imgs)
# 爬取图片,休眠为5秒
def getImgPhoto(fileName, imgs, j):
for i in range(len(imgs)):
time.sleep(5)
img = imgs[i]
print(img)
r = requests.get(img)
with open(fileName[j] + '/' + str(i) + '.jpg', 'wb') as f:
f.write(r.content)
# 实现函数
def main():
for n in range(1, 4):
if n == 1:
url_0 = ['211', '266', '197', '208', '196', '219', '209', '216', '217', '270', '241', '245', '268', '269',
'272', '282', '291', '293', '295', '296', '242', '233', '232', '240']
elif n == 2:
url_0 = ['240', '244', '221', '222', '228', '198', '586', '588', '967', '995', '001', '141', '144', '954',
'462', '268', '278', '983', '987', '458', '979', '990', '991', '000']
else:
url_0 = ['999', '002', '138', '009', '996', '992', '997', '006', '014', '026', '036', '037', '826', '589',
'976']
img_1_name = []
img_1_html = []
fileName = []
url_1 = 'https://www.mmonly.cc/mmtp/qcmn/list_16_' + str(n) + '.html'
html = getHTMLText(url_1)
getFirstFile(html, img_1_name, img_1_html)
creatFilesName(fileName, img_1_name)
for j in range(len(img_1_name)):
print(img_1_name[j])
imgs = []
html = getHTMLText(img_1_html[j])
getImgs(html, imgs, url_0, j)
getImgPhoto(fileName, imgs, j)
main()
效果
2 代码介绍
2.1 获取网站
使用requests库,例:
url = 'https://www.mmonly.cc/mmtp/qcmn/list_16_1.html'
r = requests.get(url)
r.encoding = r.apparent_encoding
html = r.text
不过多介绍。
2.3 创建目录
- 由于要创建子目录,因此用循环将每一位小姐姐的图片名称作为子目录名,用os.path.exists()判断该目录是否存在。
- 最后一行将图片路径储存在fileName空列表中,为下面爬取提供路径
- 注意,不能将fileName放在if语句中,否则第二次运行时该列表为空。
files_name = '清纯小姐姐'
if not os.path.exists(files_name):
os.mkdir(files_name)
for name in img_1_name:
file_name = files_name + '/' + name
if not os.path.exists(file_name):
os.mkdir(file_name)
fileName.append(file_name)
2.4 找到首图的名称和地址
soup_1 = BeautifulSoup(html, "html.parser")
plt_1 = soup_1.find_all('div', class_="item_t")
Re_1_html = re.findall('href="(.*?)"', str(plt_1))
Re_1_name = re.findall('alt="(.*?)"', str(plt_1))
- 用BeautifulSoup找到图片所在的标签,用re找到标签中我们需要的字符串。
- beautifulSoup返回为列表类型,而re库需要传入字符串类型,因此使用str(plt_1)将列表转化为字符串。
2.5 实现同一个人的翻页
for i in range(20):
try:
url_2 = 'https://www.mmonly.cc/mmtp/qcmn/322' + url_0[j] + '_' + str(i) + '.html'
html_2 = getHTMLText(url_2)
except:
continue
使用循环实现同一个小姐姐不同图片的翻页,由于同一类的图片个数不同,在10张左右,因此循环的范围为0~19,并用try except 判断是否请求成功,如果不成功,继续下一次循环,保证程序正常运行。
2.6 实现每一位小姐姐图片的连接
通过观察发现每一位小姐姐的首个图片所在的地址有三位数字不同,由于没有规律,只能创建一个空列表url_0储存这三位数字。
if n == 1:
url_0 = ['211', '266', '197', '208', '196', '219', '209', '216', '217', '270', '241', '245', '268', '269','272', '282', '291', '293', '295', '296', '242', '233', '232', '240']
elif n == 2:
url_0 = ['240', '244', '221', '222', '228', '198', '586', '588', '967', '995', '001', '141', '144', '954','462', '268', '278', '983', '987', '458', '979', '990', '991', '000']
else:
url_0 = ['999', '002', '138', '009', '996', '992','997','006','014', '026', '036', '037', '826', '589', '976']
由于我发现第三页后面的部分图片所在的地址与前面的有四位数不同,因此这里只展示前面的两页和第三页部分图片。如果有兴趣,可以自行尝试。
2.7 爬取图片
for i in range(len(imgs)):
time.sleep(5)
img = imgs[i]
print(img)
r = requests.get(img)
with open(fileName[j] + '/' + str(i) + '.jpg', 'wb') as f:
f.write(r.content)
- imgs中储存了图片的链接(.jpg),以它的长度为循环范围,每一位小姐姐的图片名称为序列号从0开始。
- 这里设置每爬取一张图片的休眠时间为5秒,可以自行调节
4 注意
该网站的限制较大,如果频繁访问,会被认为是恶意攻击,远程主机会强制断开连接。
遇到此种情况,可换用手机热点连接或换其他的网络。
如果大佬们有更好的方法,欢迎评论留言。