python系列之爬虫:
同志们,上车了哈,,还没上车的快点,即将锁死车门!!!
此篇爬虫为,爬取各种妹子图
目标爬取网站
1.里面各种妹子,自己去看,这个网站是学习比较好的网站 ,因为里面有一些防爬机制,推荐下
本次环境:python3x
使用到的第三方模块:os模块,bs4模块,requests模块
大致思路讲解:首先,爬取总共有多少页,然后每一层一个for循环,找出所有的url,以及图片的链接,然后写入文件中,保存就完事了,
maxpage是我自己写的一个获取所有图片层数的类,可以简化代码,但是为了大家看的直观,就没有调用这个类了
源码里面都标注了,很清楚,大家自己用点心看吧,实在不懂就问。
源码如下:
from bs4 import BeautifulSoup
from learn.page_max import MaxPage
import requests
import random
import os
#请求头:用来破解链接,不添加无法正常请求
headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
# 此请求头Referer破解盗图链接,此请求头一定要,之前我没写,发现下载下来的图片都是盗图提升图。。。
Picreferer = {
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
'Referer': 'https://www.mzitu.com/'
}
res = requests.get('https://www.mzitu.com/',headers= headers)
res.encoding='utf-8'
#设置图片保存地址:
path = 'D:/mzt/'
#获取人物最大页数
soup = BeautifulSoup(res.text,'html.parser')
page=soup.select('.page-numbers')
# print(page)
max_page = page[-2].text
# print(max_page)
# max_page = MaxPage().max(url,headers)
#获取每一mz的类型链接
print(soup.select('#menu-nav a')[1:]) #这里可以自己添加指定哪一类
dic={}
for i in soup.select('#menu-nav a')[1:]:
#标题链接整合到列表中
dic[i.text]= i['href']
# print(dic)
a=random.sample(dic.keys(),1)#获取字典中的一个key,是列表形式,所以需要提取其中的key,1表示获取的个数的参数值
# print(type(a)) 查看获取的a的类型
b=a[0]
# print(dic[b])
# 选择随机获取类型的mz链接,并获取到这类妹子最大的页数
same_url = dic[b]
# same_url= 'https://www.mzitu.com/mm/'
res2= requests.get(same_url,headers = headers)
soup = BeautifulSoup(res2.text,'html.parser')
page2 = soup.find_all('a',class_='page-numbers')
print(page2)
max_page2 = page2[-2].text
# max_page2 = MaxPage().max(dic[b],headers)
print(max_page2)
for n in range(1,int(max_page2)+1):
#拼接当前类层所有url
url =same_url + str(n)
# print(url)
# 对每一层的url发起请求
tier_html=requests.get(url,headers=headers)
#获取该层级下妹子标题,作为文件名称
soup = BeautifulSoup(tier_html.text,'html.parser')
all_a = soup.find('ul',id='pins').find_all('a', target='_blank')
# print(all_a)
#遍历标题
for a in all_a:
# print(a)
title = a.text
if title != '':
print('准备爬取:'+title)
#windows不能创建带?的目录,添加逻辑判断
if (os.path.exists(path + title.strip().replace('?',''))):
print('目录已经存在')
flag = 1
else :
os.makedirs(path+title.strip().replace('?',''))
flag = 0
#切换到上一步创建的目录
os.chdir(path+title.strip().replace('?',''))
# 提取第一层每一个MM的url,并发起请求
href = a['href']
res3 = requests.get(href,headers= headers)
soup = BeautifulSoup(res3.text,'html.parser')
#提取第二层最大页数
page2_max = 0
# print(soup.select('.pagenavi'))
for i in soup.select('.pagenavi'):
page2_max=i.select('a')[-2].text
if (flag == 1 and len(os.listdir(path+title.strip().replace('?', '')))>= int(page2_max)):
print('已经保存完毕,跳过')
continue
#遍历第二层每张图的url,并保存图片
for num in range(1,int(page2_max)+1):
#拼接每张图片所在地址
url2 = href+'/'+str(num)
html = requests.get(url=url2,headers= headers)
pic = BeautifulSoup(html.text,'html.parser')
picture = pic.select('img')[0]
print(picture['src'])
html_pic = requests.get(picture['src'],headers= Picreferer)#访问图片
#提取图片名字
picture_name = picture['src'].split('/')[-1]
f = open(picture_name,'wb')
f.write(html_pic.content)
f.close()
print('完成')
print('第', n ,'页完成')
最后爬取截图: