吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 27760|回复: 143
收起左侧

[Python 转载] 用Python爬虫爬取美女写真

    [复制链接]
头像被屏蔽
OOP 发表于 2018-2-16 23:52
提示: 该帖被管理员或版主屏蔽

本帖被以下淘专辑推荐:

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

Yunen 发表于 2018-2-18 02:06
本帖最后由 Yunen 于 2018-2-18 19:39 编辑

代码不是很规范哦~
既然发出来了,就要考虑普及性
首先我们的python默认是没有requests和beautifulsoup库的,应在发布时充分考虑,可改urllib.request和正则表达式
要使用global 变量名 来调用全局变量
第二,headers 变量重复 可先创建一个基本headers字典 后在独自添加“host" : "www.xx.com" 和 referer
最后,使用失败,网站结构貌似发生了变化 beautifulsoup 失效

我重写了个爬虫,不用安装任何第三方库的,这个是爬整站的
这是单线程的,嫌慢的同学可以改写成多线程,利用queue+threading重写threading类的run方法,可以简单写个多线程
[Python] 纯文本查看 复制代码
#!/usr/bin/env python3
# -*- encode: utf-8 -*-
import urllib.request
import re
import os
import time

#正则列表
img_url_partern = '<div class="content" id="content"><a ><img src="(.*?)" alt='
max_page_partern = '</i><a href="/mm/\w+/\w+">(.*?)</a><em'
img_name_partern = '<h2>(.*?)</h2>'
#为urllib.request.urlretrieve挂载referer头,绕过防盗链
opener=urllib.request.build_opener()
opener.addheaders=[("Referer","http://www.mmjpg.com/mm/1013/5")]
urllib.request.install_opener(opener)

def down_img(url_1):
    html_data = urllib.request.urlopen(url_1).read().decode()
    #取每组照片数
    max_page = re.compile(max_page_partern).findall(html_data)
    #读取每组照片名
    img_name = re.compile(img_name_partern).findall(html_data)
    print('当前采集的Url:' + url_1 + '共有' + max_page[0] + '张照片')
    for c in range(1,int(max_page[0]) + 1):
        url_2 = url_1 + '/' + str(c)
        #读取每张照片详情页
        html_data_2 = urllib.request.urlopen(url_2).read().decode()
        #提取照片地址
        img_url = re.compile(img_url_partern).findall(html_data_2)
        #检查目录
        if not os.path.exists("%s" % img_name[0]):
            os.mkdir("%s" % img_name[0])
        save_name = "%s" % img_name[0] + '\\' + str(c) + '.jpg'
        #初始化错误次数
        err_num = 0
        try:
            urllib.request.urlretrieve(img_url[0],filename=save_name)
        except:
            while err_num < 6:
                #休息1秒
                time.sleep(1)
                try:
                    urllib.request.urlretrieve(img_url[0],filename=save_name)
                    break
                except:
                    err_num += 1

def main():
    basic_url = r'http://www.mmjpg.com/mm/'
    #网站目前有最多1263组图片,for循环全部遍历
    for x in range(1,1264):
        url = basic_url + str(x)
        try:
            down_img(url)
        except:
            print('[-]The Url:' + url + ' Was No Found!')

if __name__ == '__main__':
    main()

免费评分

参与人数 5吾爱币 +3 热心值 +5 收起 理由
慕冬 + 1 用心讨论,共获提升!
lisa1824 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
小字_小瓶子 + 1 + 1 厉害厉害
perrychan + 1 + 1 我很赞同!
Jaydenchan + 1 鼓励转贴优秀软件安全工具和文档!

查看全部评分

teble 发表于 2018-3-4 22:35
Yunen 发表于 2018-2-18 02:06
代码不是很规范哦~
既然发出来了,就要考虑普及性
首先我们的python默认是没有requests和beautifulsoup ...

使用正则会出现无法使用正则匹配出网址,原因是<a >标签中漏了内容,所以借用你的代码改进了一下,同时开启了多线程进行爬图下载操作,本人初学python 如有不妥,请指正
[Python] 纯文本查看 复制代码
import urllib.request
import re
import os
import time
import threading

img_url_partern = '<div class="content" id="content"><a href="[a-zA-z]+://[^\s]*"><img src="(.*?)" alt'
max_page_partern = '</i><a href="/mm/\w+/\w+">(.*?)</a><em'
img_name_partern = '<h2>(.*?)</h2>'
flag = 0
headers = {
    'Connection':'keep-alive',
    'Host':'http://www.mmjpg.com',
    'Referer':'http://www.mmjpg.com/mm/1017/4',
    'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36'
}


def getsize(file):
    size = os.path.getsize(file)
    size = size/float(1024)
    return round(size,0)


def down_img(url_1):
    html_data = urllib.request.urlopen(url_1).read().decode()
    max_page = re.compile(max_page_partern).findall(html_data)
    img_name = re.compile(img_name_partern).findall(html_data)
    print('当前采集的Url:' + url_1 + '共有' + max_page[0] + '张照片')
    for c in range(1, int(max_page[0]) + 1):
        url_2 = url_1 + '/' + str(c)
        html_data_2 = urllib.request.urlopen(url_2).read().decode()
        img_url = re.compile(img_url_partern).findall(html_data_2)
        if not os.path.exists("%s" % img_name[0]):
            os.mkdir("%s" % img_name[0])
        save_name = "%s" % img_name[0] + '\\' + str(c) + '.jpg'
        # print(img_url)
        for err_num in range(1,11):
            try:
                urllib.request.urlretrieve(url=img_url[0], filename=save_name)
            except:
                time.sleep(0.5)
                continue
            if getsize(save_name)<10:
                os.remove(save_name)
                continue
            else:
                break


def down_mul(basic_url):
    global flag
    while flag < 1264:
        flag += 1
        url = basic_url + str(flag)
        try:
            down_img(url)
        except:
            print('[-]The Url:' + url + ' Was No Found!')
        print('The No.'+str(flag)+' is OK')


def main():
    basic_url = 'http://www.mmjpg.com/mm/'
    for i in range(1,21):
        t = threading.Thread(target = down_mul,args = (basic_url,))
        t.start()
        print('['+str(i)+']Runing Star')


if __name__ == '__main__':
    opener = urllib.request.build_opener()
    header_list = []
    for key, value in headers.items():
        header_list.append((key, value))
    opener.addheaders = header_list
    urllib.request.install_opener(opener)
    main()

免费评分

参与人数 2吾爱币 +2 热心值 +1 收起 理由
Hakon + 1 + 1 6, 6er, 6est!
878079954 + 1 一个比一个6

查看全部评分

不老松 发表于 2018-2-17 00:11
感觉很不错,但是因为是小白,看不懂哦,还是谢谢分享!!!
简短的J 发表于 2018-2-17 00:19
哈哈 很好很喜欢!我之前在论坛下了个男人装破解版也挺好用的
nishuona 发表于 2018-2-17 01:52 来自手机
看上去挺厉害的,但是不怎么看这东西
孤狼微博 发表于 2018-2-17 01:55 来自手机
谢谢分享做个记号电脑查看
丶cold 发表于 2018-2-17 02:52
厉害不会
ftmovie 发表于 2018-2-17 08:25 来自手机
谢谢分享
Sukkk 发表于 2018-2-17 08:45
谢谢,授人以鱼不如授人以渔。谢谢你的方法
双眼皮的微笑 发表于 2018-2-17 08:59
看来我要学习这个语言了。
葫芦炒鸡蛋 发表于 2018-2-17 09:13
Python爬虫其实很简单的,关键看网站的反爬措施怎么样了。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

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

GMT+8, 2024-4-24 08:36

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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