python爬虫福利学习

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 ,'页完成')

最后爬取截图:在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值