3.win10 下 python3 爬虫美女图片逐步优化(多线程版本)

本贴最后更新于 1749 天前,其中的信息可能已经时过境迁
# coding: utf-8
import re
import os
import time
import threading
from multiprocessing import Pool, cpu_count
import requests
from bs4 import BeautifulSoup


HEADERS = {
    'X-Requested-With': 'XMLHttpRequest',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 '
                  '(KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
    'Referer': 'http://www.mzitu.com'
}
save_path='D:\data\crawl\meizitujk\\'
base_url = 'http://m.772586.com'

lock = threading.Lock()     # 全局资源锁

def urls_crawler_index(url):
    """
    爬虫入口,主要爬取操作
    """
    try:
        html = requests.get(url, headers=HEADERS, timeout=50)
        html.encoding = 'utf-8'
        soup = BeautifulSoup(html.text, "lxml", from_encoding='utf-8')
        tags =soup.find('ul',class_='tag').find_all('li')
        allIndexList = []
        allIndexList.append(base_url+'/meinv/')
        allIndexList.append(base_url+'/mxmn/')
        for tag in tags:
            print tag.find('a')['href']
            allIndexList.append(base_url+tag.find('a')['href'])
        print "========"
        for index_detail_url in allIndexList:
            urls_crawler_index_list(index_detail_url)

    except Exception as e:
        print(e)


def urls_crawler_index_list(index_url):
    """
    爬虫入口,主要爬取操作
    """
    try:
        html = requests.get(index_url, headers=HEADERS, timeout=10)
        html.encoding = 'utf-8'
        soup = BeautifulSoup(html.text, "lxml", from_encoding='utf-8')

        max_page_txt = soup.find('div',class_='page').find('a',class_='allpage').text
        max_page=max_page_txt[max_page_txt.rfind('/')+1:]
        max_page=int(max_page)
        print(max_page)



        for xxx_page in xrange(max_page):
            if 0==xxx_page:
                craw_content_page_url=index_url+'index.html'
            else:
                craw_content_page_url = index_url + 'index_' + str(xxx_page+1) + '.html'

            html_content_page = requests.get(craw_content_page_url, headers=HEADERS, timeout=10)
            html_content_page.encoding = 'utf-8'
            soup_content_page = BeautifulSoup(html_content_page.text, "lxml", from_encoding='utf-8')
            index_page_details =soup_content_page.find('div',id='list').find('ul').find_all('li')
            detail_urls=[]
            for page_url_li in index_page_details:
                detail_crawl_url = base_url + page_url_li.find('a')['href']
                print("detail_crawl_url:" + detail_crawl_url)
                detail_urls.append(detail_crawl_url)
            try:
                pool.map(urls_crawler_page, detail_urls)
            except Exception:
                time.sleep(30)
                pool.map(urls_crawler_page, detail_urls)
    except Exception as e:
        print(e)

def urls_crawler_page(url):
    """
    爬虫入口,主要爬取操作
    """
    try:
        response = requests.get(url, headers=HEADERS, timeout=50)
        response.encoding = 'utf-8'
        r=response.text
        folder_name = BeautifulSoup(r, 'lxml').find(
            'div', class_="contimglist").find('img')['alt'].replace("?", " ")
        print(folder_name)
        with lock:
            # 套图里图片张数
            max_count = BeautifulSoup(r, 'lxml').find(
                'div', class_='page').find_all(
                'span')[0].next_sibling[1:]
            page_urls = []
            for i in range(1, int(max_count) + 1):
                if i==1:
                    page_urls.append(url[0:url.rfind('.html')] +'.html')
                else:
                    page_urls.append(url[0:url.rfind('.html')] +'_'+str(i)+'.html')
            url_detail_crawler(page_urls,folder_name)
    except Exception as e:
        print(e)



def url_detail_crawler(page_urls,folder_name):
    img_urls = []
    for i,page_url in enumerate(page_urls):
        time.sleep(0.25)
        result = requests.get(page_url, headers=HEADERS, timeout=10).text
        img_url = BeautifulSoup(result, 'lxml').find(
            'div', class_="contimglist").find('a').find('img')['src']
        img_urls.append(img_url)

    for cnt, url in enumerate(img_urls):
        save_pic(url, cnt,folder_name)

def save_pic(pic_src, pic_cnt,folder_name):
    """
    保存图片到本地
    """
    try:
        time.sleep(0.10)
        base_path = save_path + folder_name
        if not os.path.isdir(base_path):
            os.mkdir(base_path)
        img = requests.get(pic_src, headers=HEADERS, timeout=10)
        img_name = base_path+"\\"+"pic_cnt_{}.jpg".format(pic_cnt + 1)
        with open(img_name, 'ab') as f:
            f.write(img.content)
            print(img_name)
    except Exception as e:
        print(e)


if __name__ == "__main__":
    # urls = ['http://m.772586.com/qingchun/17454.html']
    # pool = Pool(processes=cpu_count())
    # try:
    #     pool.map(urls_crawler_page, urls)
    # except Exception:
    #     time.sleep(30)
    #     pool.map(urls_crawler_page, urls)
    #测试
    #
    # urls_crawler(url)
    # page_urls=['http://m.772586.com/qingchun/17454_2.html']
    # urls_crawler(page_urls)
    #从首页开始
    pool = Pool(processes=10)
    urls = 'http://m.772586.com/'
    urls_crawler_index(urls)

  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    163 引用 • 473 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • abitmean

    有点意思就行了

    29 关注
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    123 引用 • 168 回帖
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 383 关注
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    20 引用 • 245 回帖 • 234 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 560 关注
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 604 关注
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    83 引用 • 165 回帖 • 13 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3169 引用 • 8208 回帖
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    103 引用 • 126 回帖 • 442 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    229 引用 • 1450 回帖
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 233 关注
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    6888 引用 • 31055 回帖 • 230 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 618 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖 • 1 关注
  • 自由行
    2 关注
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖
  • danl
    89 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    332 引用 • 619 回帖
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 446 关注
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 31 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 53 关注
  • Sillot

    Insights(注意当前设置 master 为默认分支)

    汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix),致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点。其中汐洛绞架(Sillot-Gibbet)基于自思源笔记(siyuan-note),前身是思源笔记汐洛版(更早是思源笔记汐洛分支),是智慧新录乄终端(多端融合,移动端优先)。

    主仓库地址:Hi-Windom/Sillot

    安卓端仓库:Hi-Windom/Sillot-android

    注意事项:

    1. ⚠️ 汐洛仍在早期开发阶段,尚不稳定
    2. ⚠️ 汐洛并非面向普通用户设计,使用前请了解风险
    28 引用 • 25 回帖 • 56 关注
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    51 引用 • 37 回帖 • 3 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    19 引用 • 23 回帖 • 699 关注
  • 创业

    你比 99% 的人都优秀么?

    83 引用 • 1398 回帖