Python《爬取各种帅哥图片》

今天我们来爬取http://www.shuaia.net/

但是我们今天只爬取图片http://www.shuaia.net/tp/ 下面均是分析过程。
按照之前的套路,我们先拿到所有的图片分类标签。
在这里插入图片描述

点击【更多图片】即可得到所有图片的分类
在这里插入图片描述

点击【动漫图片】的大分类进去
得到一整个页面,一个页面有个20个套图。所以我们先来搞定分页,如下:
在这里插入图片描述

再来对付每一个套图的入口
在这里插入图片描述

继续点击该套图,进去后发现所有的图片都是在一个网页上,嗯,挺方便。
在这里插入图片描述

至此,分析完毕。

好了,我们先下载一张图片试试水。
在这里插入图片描述

代码如下:

import requests

def run10():
    headers = {
        "Referer": "https://www.mm131.net/",
        'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
        'Accept-Language': 'en-US,en;q=0.8',
        'Cache-Control': 'max-age=0',
        'Connection': 'keep-alive'
    }  ###设置请求的头部,伪装成浏览器
    with open("D:/estimages/mn.jpg", "wb") as f :
        f.write(requests.get("http://www.shuaia.net/d/file/kaifamei/202009/16002185322978467.jpg", headers=headers).content)
        f.close

if __name__ == "__main__":   #主程序入口
    run10()    #调用上面的run方法

效果可以。。。。
在这里插入图片描述

完整代码如下:

# coding: utf-8
from concurrent.futures import ThreadPoolExecutor
import time
import os
import requests
from bs4 import BeautifulSoup

rootrurl = 'http://www.shuaia.net'
save_dir = 'D:/estimages/'
no_more_pages = 'END'
max_pages = 10

headers = {
    "Referer": rootrurl,
    'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
    'Accept-Language': 'en-US,en;q=0.8',
    'Cache-Control': 'max-age=0',
    'Connection': 'keep-alive'
}  ###设置请求的头部,伪装成浏览器


def getAllTags(rootrurl):
    taglist = {}
    html = BeautifulSoup(requests.get(rootrurl + '/qm/moresc/', headers=headers).text.encode('iso-8859-1').decode('utf-8'),
                         features="html.parser")
    a_s = html.find('div', {'class': 'g-big-box'}).find_all('a')
    for a in a_s:
        taglist[a.get('href')] = a.string
    return taglist


def saveOneImg(dir, img_url):
    img = requests.get(img_url, headers=headers)  # 请求图片的实际URL
    with open(
            '{}/{}'.format(dir, img.url.split("/")[-1]), 'wb') as jpg:  # 请求图片并写进去到本地文件
        jpg.write(img.content)
        print(img_url)


def saveImgGroup(dir, href):
    new_headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
    }
    html = BeautifulSoup(requests.get(rootrurl + href, headers=new_headers).text.encode('iso-8859-1').decode('utf-8'),
                         features="html.parser")

    # get total pages
    imgs = html.find('div', {'class': 'm_qmview'}).find_all('img')

    # directly get url of imgs
    for img in imgs:
        url = rootrurl + img.get('src')
        saveOneImg(dir, url)


def saveOnePageFunc(dir, imgsPage):
    for imgPage in imgsPage:
        # 按照tag和图片组的内容来创建目录
        new_dir = '{}{}/{}'.format(save_dir, dir, imgPage.get('title'))
        if not os.path.exists(new_dir):
            os.makedirs(new_dir)

        saveImgGroup(new_dir, imgPage.get('href'))
    pass


def tagSpider(tag, dir):

    url = rootrurl + tag + 'index.html'
    print(url)
    while 1:
        # 解析当前页面
        html = BeautifulSoup(requests.get(url, headers=headers).text.encode('iso-8859-1').decode('utf-8'),
                             features="html.parser")

        # 提交一个保存页面的任务
        saveOnePageFunc(dir, html.find('ul', {'class': 'g-gxlist-imgbox'}).find_all('a', {'target': '_blank'}))

        # 找到下一个页面的地址
        next_page = html.find('div', {'class': 'tsp_nav'}).find_all('a')[-2]
        if next_page.get_text() != '下一页':
            break

        url = rootrurl + next_page.get('href')

    print("thread work over. ")


if __name__ == '__main__':

    # 获得所有标签
    taglist = getAllTags(rootrurl)
    print(taglist)

    # 给每个标签配备一个线程
    with ThreadPoolExecutor(max_workers=10) as t:  # 创建一个最大容纳数量为20的线程池
        for tag, dir in taglist.items():
            t.submit(tagSpider, tag, dir)

    # 等待所有线程都完成。
    while 1:
        time.sleep(1)

效果如下:
请添加图片描述

请添加图片描述
请添加图片描述

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值