吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4781|回复: 32
收起左侧

[Python 转载] 爬取妹子图(支持多类别选择)

  [复制链接]
--瑀燊 发表于 2020-8-17 13:15
支持6大分类索引,交互更友好

文件存储在D盘pics文件夹下

因文件大约6M,上传不了,Exe文件在Github:https://github.com/XingJinming-real/Web_Spider_beauties(如果可以点个星哦)

我就不放图了,大家懂就好
批注 2020-08-17 130725.png 批注 2020-08-17 131229.png
[Python] 纯文本查看 复制代码
import random
import time
import re
import requests
import os
from bs4 import BeautifulSoup
def getmainname(head):# 得到6大分类
    url='https://www.mm131.net/'
    r=requests.get(url,headers=head)
    namels=[];urlls=[];namelist=[]
    try:
        r.raise_for_status()
    except:
        print('r.code!=200')
    r.encoding=r.apparent_encoding
    soup=BeautifulSoup(r.text,'html.parser')
    mainname=soup.find_all('li')
    mainname=mainname[1:7]#mainname为标签列表
    mainurl=soup.find_all('a')
    mainurl=mainurl[9:15]#mainurl为主名字的标签列表
    for i in range(len(mainurl)):
        namels.append(mainname[i].string)
        urlls.append(mainurl[i].get('href'))
        time.sleep(0.1)
    for i in range(len(mainurl)):
        namelist.append([namels[i],urlls[i]])
    return namelist# 返回六大分类名字返回名字和相应的地址,为一个2维列表
def entername(namelist,head):#输入要查找的分类名字
    subnamelist=[];subnamels=[];suburlls=[]
    n=eval(input('请输入要查找的对象数字0——5之间'))
    print('已选择{}'.format(namelist[n][0]))
    time.sleep(0.3)
    r=requests.get(namelist[n][1],headers=head)
    r.raise_for_status()
    r.encoding=r.apparent_encoding
    soup=BeautifulSoup(r.text,'html.parser')
    subnamelt=soup.find_all('img')
    subnamelt=subnamelt[:20]#subnamels标签列表
    suburllt=soup.find_all('a')
    suburllt=suburllt[17:38]#suburlls为标签列表
    for i in range(len(subnamelt)):
        subnamels.append(subnamelt[i].get('alt'))
        suburlls.append(suburllt[i].get('href'))
    for i in range(len(subnamels)):
        subnamelist.append([subnamels[i],suburlls[i]])
    subnamelist=subnamelist[0:20]
    getpics(subnamelist)
    return subnamelist#返回该分类下所有套图的名字和地址为一个2维列表
def getpics(subnamelist):#对该套图进行处理
    global namelist,head
    x=1;y=1
    if not os.path.exists('D:\\pics\\'):
        os.mkdir('D:\\pics\\')
    for i in range(len(subnamelist)):#这里为对每一个套图进行遍历
        print('此分类下共有{}个套图'.format(len(subnamelist)))
        print('\t正在抓取第{}个套图:{}'.format(i+1,subnamelist[i][0]))
        ifall=eval(input('是否全部抓取:是请输入1'))
        if not os.path.exists('D:\\pics\\'+subnamelist[i][0]):
            os.mkdir('D:\\pics\\'+subnamelist[i][0])#这里为创建对应套图名称的文件夹
        urllist,url=getdetails(subnamelist[i][1],ifall)#urllist为对应套图中每张图片的地址
        name='D:\\pics\\'+subnamelist[i][0]+'\\'
        for j in range(len(urllist)):#以地址为索引
            print('\t正在抓取第{}张'.format(j+1))
            time.sleep(0.2)
            write(urllist[j],name,j,url)# 对于套图中的单个图片分别写入
            if j==len(urllist)-1:
                print('此套图抓取完毕')
    print('已抓取全部')
    pass
def write(urlls,name,j,url):#对套图中的单个图片写入
    f=open(name+str(j)+'.jpg','wb')
    r=requests.get(urlls,headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',
    'Referer':url
    })
    r.raise_for_status()
    f.write(r.content)
    f.close()
    pass
def getdetails(url,ifall):#得到套图中每张图片的地址返回一个列表
    urllist=[]
    code=re.search(r'\d{4}',url).group(0)
    url2='https://img1.mmmw.net/pic/'+code+'.html'
    num=getnum(url)
    string='\t此套图共有{}张'
    print(string.format(num))
    if not ifall==1:
        n=eval(input('要获得多少张'))#https://img1.mmmw.net/pic/5513/1.jpg  
    else:
        n=eval(num)
    for j in range(1,n+1):                      #https://img1.mmmw.net/pic/5520/0.jpg
        urlj=url2.strip('.html')+'/'+str(j)+'.jpg'#https://www.mm131.net/xinggan/5520/1.jpg
        urlj=urlj.replace('ps','https')
        urllist.append(urlj)
    return urllist,url
def main(head,namelist):
    subnamelist=entername(namelist,head)
    return namelist
def getnum(url):
    r=requests.get(url,headers=head)
    try:
        r.raise_for_status()
        r.encoding=r.apparent_encoding
        soup=BeautifulSoup(r.text
                           ,'html.parser')
        num=soup.find('span').string
        num=num.replace('页','')
        num=num.replace('共','')
    except:
        print('getnum error')
    return num
head = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
    }
namelist=getmainname(head)
main(head,namelist)

免费评分

参与人数 4吾爱币 +4 热心值 +4 收起 理由
aishangoumeige + 1 + 1 热心回复!
矢岛舞美 + 1 + 1 谢谢@Thanks!
h357746 + 1 + 1 我很赞同!
孤独色的夜 + 1 + 1 爱了爱了。

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| --瑀燊 发表于 2020-8-19 14:13
[Python] 纯文本查看 复制代码
import threading
import random
import time
import re
import requests
import os
from bs4 import BeautifulSoup

def getmainname(head):# 得到6大分类
    url='https://www.mm131.net/'
    r=requests.get(url,headers=head)
    namels=[];urlls=[];namelist=[]
    try:
        r.raise_for_status()
    except:
        print('r.code!=200')
    
    r.encoding=r.apparent_encoding
    soup=BeautifulSoup(r.text,'html.parser')
    mainname=soup.find_all('li')
    mainname=mainname[1:7]#mainname为标签列表
    mainurl=soup.find_all('a')
    mainurl=mainurl[9:15]#mainurl为主名字的标签列表
    for i in range(len(mainurl)):
        namels.append(mainname[i].string)
        urlls.append(mainurl[i].get('href'))
    for i in range(len(mainurl)):
        namelist.append([namels[i],urlls[i]])
    return namelist# 返回六大分类名字返回名字和相应的地址,为一个2维列表
def get_page_num(page_url):
    r=requests.get(page_url,headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'})
    r.raise_for_status()
    r.encoding=r.apparent_encoding
    soup=BeautifulSoup(r.text,'html.parser')
    tag=soup.find_all('a','page-en')[-1]
    num_temp=re.search(r'\d+.html',tag.get('href')).group(0)
    num=eval(num_temp.strip('.html'))
    return num
        
def entername(namelist,head):#输入要查找的分类名字
    subnamelist=[];subnamels=[];suburlls=[]
    for i in range(6):
        print('{}--{}'.format(i,namelist[i][0]))
    n=eval(input('请输入要查找的对象数字0——5之间(按CTRL+C可强制退出程序):'))
    print('已选择{}'.format(namelist[n][0]))
    dict_page={'性感美女':'6','清纯美眉':'1','美女校花':'2','性感车模':'3','旗袍美女':'4','明星写真':'5'}
    page_num=get_page_num(namelist[n][1])
    print('该分类下共有{}个套图'.format(page_num*20-20))
    duplicate_namelist=namelist[n][1]
    for i in range(1,page_num*20-20):
        namelist[n][1]=duplicate_namelist
        if i==1:
            pass
        else:
            namelist[n][1]=namelist[n][1]+'list_'+dict_page[namelist[n][0]]+'_'+str(i)+'.html'
        print(namelist[n][1])
        r=requests.get(namelist[n][1],headers=head)
        r.raise_for_status()
        r.encoding=r.apparent_encoding
        soup=BeautifulSoup(r.text,'html.parser')
        
        subnamelt=soup.find_all('img')
        subnamelt=subnamelt[:20]#subnamels标签列表
        suburllt=soup.find_all('a')
        suburllt=suburllt[17:38]#suburlls为标签列表
        for i in range(len(subnamelt)):
            subnamels.append(subnamelt[i].get('alt'))
            suburlls.append(suburllt[i].get('href'))
        for i in range(len(subnamels)):
            subnamelist.append([subnamels[i],suburlls[i]])
        subnamelist=subnamelist[i-1:20*i]
        getpics(subnamelist)
    print('此分类已全部获取')

def getpics(subnamelist):#对该套图进行处理
    global namelist,head
    x=1;y=1
    if not os.path.exists('D:\\pics\\'):
        os.mkdir('D:\\pics\\')
    
    ifall=eval(input('是否全部抓取:是请输入1:'))
    subnamelist_duplicate=subnamelist
    for i in range(len(subnamelist)):#这里为对每一个套图进行遍历
        print('\t正在抓取第{}个套图:{}'.format(i+1,subnamelist[i][0]))
        if not os.path.exists('D:\\pics\\'+subnamelist[i][0]):
            os.mkdir('D:\\pics\\'+subnamelist[i][0])#这里为创建对应套图名称的文件夹
        try:
            urllist,url=getdetails(subnamelist[i][1],ifall)#urllist为对应套图中每张图片的地址
            name='D:\\pics\\'+subnamelist[i][0]+'\\'
            for j in range(len(urllist)):#以地址为索引
                print('\t正在抓取第{}张'.format(j+1))
                threading.Thread(target=write,args=(urllist[j],name,j,url)).start()     #引入多线程,加快速度
                if j==len(urllist)-1:
                    print('此套图抓取完毕')
        except:
            pass
def write(urlls,name,j,url):#对套图中的单个图片写入
    f=open(name+str(j)+'.jpg','wb')
    r=requests.get(urlls,headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',
    'Referer':url
    })
    r.raise_for_status()
    f.write(r.content)
    f.close()
    pass
def getdetails(url,ifall):#得到套图中每张图片的地址返回一个列表
    urllist=[]
    code=re.search(r'\d{3,4}',url).group(0)
    url2='https://img1.mmmw.net/pic/'+code+'.html'
    num=getnum(url)

    string='\t此套图共有{}张'
    print(string.format(num))
    if not ifall==1:
        n=eval(input('要获得多少张'))#[img]https://img1.mmmw.net/pic/5513/1.jpg[/img]  
    else:
        n=eval(num)
    for j in range(1,n+1):                      #[img]https://img1.mmmw.net/pic/5520/0.jpg[/img]
        urlj=url2.strip('.html')+'/'+str(j)+'.jpg'#[img]https://www.mm131.net/xinggan/5520/1.jpg[/img]
        urlj=urlj.replace('ps','https')
        urllist.append(urlj)
    return urllist,url
def main(head,namelist):
    entername(namelist,head)
def getnum(url):
    r=requests.get(url,headers=head)
    

    r.raise_for_status()
    r.encoding=r.apparent_encoding
    soup=BeautifulSoup(r.text
                       ,'html.parser')
    num=soup.find('span').string
    num=num.replace('页','')
    num=num.replace('共','')
    
    return num
head = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
    }
namelist=getmainname(head)
main(head,namelist)


    
 楼主| --瑀燊 发表于 2020-8-17 19:55

添加了多线程爬取,爬取更快,并支持一键爬取当前分类下的所有套图(感谢@aishangoumeige 提醒)

[Python] 纯文本查看 复制代码
import threading
import random
import time
import re
import requests
import os
from bs4 import BeautifulSoup

def getmainname(head):# 得到6大分类
    url='https://www.mm131.net/'
    r=requests.get(url,headers=head)
    namels=[];urlls=[];namelist=[]
    try:
        r.raise_for_status()
    except:
        print('r.code!=200')
    
    r.encoding=r.apparent_encoding
    soup=BeautifulSoup(r.text,'html.parser')
    mainname=soup.find_all('li')
    mainname=mainname[1:7]#mainname为标签列表
    mainurl=soup.find_all('a')
    mainurl=mainurl[9:15]#mainurl为主名字的标签列表
    for i in range(len(mainurl)):
        namels.append(mainname[i].string)
        urlls.append(mainurl[i].get('href'))
    for i in range(len(mainurl)):
        namelist.append([namels[i],urlls[i]])
    return namelist# 返回六大分类名字返回名字和相应的地址,为一个2维列表
def entername(namelist,head):#输入要查找的分类名字
    subnamelist=[];subnamels=[];suburlls=[]
    for i in range(6):
        print('{}--{}'.format(i,namelist[i][0]))
    n=eval(input('请输入要查找的对象数字0——5之间(按CTRL+C可强制退出程序):'))
    print('已选择{}'.format(namelist[n][0]))
    r=requests.get(namelist[n][1],headers=head)
    r.raise_for_status()
    r.encoding=r.apparent_encoding
    soup=BeautifulSoup(r.text,'html.parser')
    subnamelt=soup.find_all('img')
    subnamelt=subnamelt[:20]#subnamels标签列表
    suburllt=soup.find_all('a')
    suburllt=suburllt[17:38]#suburlls为标签列表
    for i in range(len(subnamelt)):
        subnamels.append(subnamelt[i].get('alt'))
        suburlls.append(suburllt[i].get('href'))
    for i in range(len(subnamels)):
        subnamelist.append([subnamels[i],suburlls[i]])
    subnamelist=subnamelist[0:20]
    getpics(subnamelist)
    return subnamelist#返回该分类下所有套图的名字和地址为一个2维列表
def getpics(subnamelist):#对该套图进行处理
    global namelist,head
    x=1;y=1
    if not os.path.exists('D:\\pics\\'):
        os.mkdir('D:\\pics\\')
    print('此分类下共有{}个套图'.format(len(subnamelist)))
    ifall=eval(input('是否全部抓取:是请输入1:'))
    for i in range(len(subnamelist)):#这里为对每一个套图进行遍历
        print('\t正在抓取第{}个套图:{}'.format(i+1,subnamelist[i][0]))
        if not os.path.exists('D:\\pics\\'+subnamelist[i][0]):
            os.mkdir('D:\\pics\\'+subnamelist[i][0])#这里为创建对应套图名称的文件夹
        urllist,url=getdetails(subnamelist[i][1],ifall)#urllist为对应套图中每张图片的地址
        name='D:\\pics\\'+subnamelist[i][0]+'\\'
        for j in range(len(urllist)):#以地址为索引
            print('\t正在抓取第{}张'.format(j+1))
            threading.Thread(target=write,args=(urllist[j],name,j,url)).start()     #引入多线程,加快速度
            if j==len(urllist)-1:
                print('此套图抓取完毕')
    print('已抓取全部')
    pass
def write(urlls,name,j,url):#对套图中的单个图片写入
    f=open(name+str(j)+'.jpg','wb')
    r=requests.get(urlls,headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',
    'Referer':url
    })
    r.raise_for_status()
    f.write(r.content)
    f.close()
    pass
def getdetails(url,ifall):#得到套图中每张图片的地址返回一个列表
    urllist=[]
    code=re.search(r'\d{4}',url).group(0)
    url2='https://img1.mmmw.net/pic/'+code+'.html'
    num=getnum(url)
    string='\t此套图共有{}张'
    print(string.format(num))
    if not ifall==1:
        n=eval(input('要获得多少张'))#https://img1.mmmw.net/pic/5513/1.jpg  
    else:
        n=eval(num)
    for j in range(1,n+1):                      #https://img1.mmmw.net/pic/5520/0.jpg
        urlj=url2.strip('.html')+'/'+str(j)+'.jpg'#https://www.mm131.net/xinggan/5520/1.jpg
        urlj=urlj.replace('ps','https')
        urllist.append(urlj)
    return urllist,url
def main(head,namelist):
    subnamelist=entername(namelist,head)
    return namelist
def getnum(url):
    r=requests.get(url,headers=head)

    r.raise_for_status()
    r.encoding=r.apparent_encoding
    soup=BeautifulSoup(r.text
                       ,'html.parser')
    num=soup.find('span').string
    num=num.replace('页','')
    num=num.replace('共','')
    
    return num
head = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
    }
namelist=getmainname(head)
while True:
    main(head,namelist)
    key_loop=eval(input('是否继续?是请按1:'))
    if not key_loop:
        print('程序结束')
        break


    
明魂 发表于 2020-8-17 13:26
mumu27 发表于 2020-8-17 13:35
嘿嘿嘿,这个我喜欢
一倾风雨一流年 发表于 2020-8-17 13:37
干的漂亮 谢谢分享
酒神chao 发表于 2020-8-17 13:37
感谢分享
layuai 发表于 2020-8-17 13:49
可以直接爬妹子吗
gtmacker 发表于 2020-8-17 13:50
layuai 发表于 2020-8-17 13:49
可以直接爬妹子吗

可以,只要你手速快。妹子就感觉不到
honghai0119 发表于 2020-8-17 13:55
爬取特定网址的吧
aishangoumeige 发表于 2020-8-17 13:56
可以改成循环自动抓取么,每抓一次都要输入一次,挺闹心的
kaile2598 发表于 2020-8-17 13:59
最近这类工具较多啊 支持一个
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 01:39

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表