吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2067|回复: 9
收起左侧

[Python 转载] 爬取一个小图站的记录,初学python还有很多不懂的,尤其是线程方面

  [复制链接]
森岛帆高 发表于 2020-2-11 19:09
本帖最后由 森岛帆高 于 2020-2-11 21:21 编辑

图站的网站是https://www.ivsky.com/index.php
[Python] 纯文本查看 复制代码
from multiprocessing.dummy import Pool as ThreadPool
import requests
from bs4 import BeautifulSoup as bs
import os
import time
import json
import re


# 传入index,获取当前页的index
def getJson(index):
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0"}
    url = 'https://www.ivsky.com/index.php?tn=indexload&page=%s&h=1581405277021' % index
    html = requests.get(url=url, headers=headers)
    try:
        data = json.loads(html.text, strict=False)
        print('正在爬取第'+str(index)+'个JSON返回的数据....')
    except json.decoder.JSONDecodeError:
        return False
    # 判断json是否为空
    if data:
        return data
    else:
        return False


# 获取json数据中的图集url
def getUrls(data):
    urls = []
    for i in data:
        urls.append('https://www.ivsky.com' + i['arcurl'])
    return urls


# 传入url得到网页内容返回BeautifulSoup对象
def sp(url):
    html = requests.get(url)
    soup = bs(html.content, 'html.parser')
    return soup


# 从传入的BeautifulSoup对象获取图片url,返回图片url列表
def imgList(soup):
    imgs = []
    img = soup.select("div .il_img>a>img")
    for a in img:
        imgs.append('https:' + a['src'])
    return imgs


# 下载图片
def downImg(index):
    # 获取json数据
    data = getJson(index)
    # 如果获取失败直接return,这里不知道为啥,如果不返回线程在最后不会终止
    if not data:
        return
    # 获取图集url列表
    urls = getUrls(data)
    # 遍历url列表
    for url in urls:
        # 根据url获取BeautifulSoup对象
        soup = sp(url)
        # 传入BeautifulSoup对象获取图片url列表
        imgBox = imgList(soup)
        # 获取标题
        title = soup.find('h1').text[0:-1]
        # 将标题设置为文件夹名字
        if not os.path.exists('file/%s' % title):
            try:
                os.makedirs('file/%s' % title)
            except FileExistsError:
                pass
        # 遍历图片url列表
        for img in imgBox:
            #处理图片链接,这时获取的图片不是高清,观察链接发现替换一段字母就行了
            img=re.sub('/t/','/pre/',img)
            tu = requests.get(img)
            # 处理图片链接,得到图片名字,写入图片文件
            with open('file/%s/%s' % (title, img.split('/', 8)[8]), mode='wb') as obj:
                obj.write(tu.content)
    # 休息3秒钟
    time.sleep(3)


if __name__ == '__main__':
    # 创建多线程池
    pool = ThreadPool(8)
    pool.map(downImg, range(3500))
    pool.close()
    pool.join()

爬取的图片如下
20200211190307.png

免费评分

参与人数 2吾爱币 +3 热心值 +2 收起 理由
stefaniema + 1 谢谢@Thanks!
苏紫方璇 + 3 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

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

小白鼠chidami 发表于 2020-2-11 19:35
有制作代码的思路不
 楼主| 森岛帆高 发表于 2020-2-11 19:54
小白鼠chidami 发表于 2020-2-11 19:35
有制作代码的思路不

就是获取json数据里面的图片集链接,跳到图片集把每张图片下载就行了
青蛙考拉 发表于 2020-2-11 23:42
hfxfv 发表于 2020-2-12 16:58
很有用  最近也在学
Mir丶翰林 发表于 2020-2-14 00:57
刚开始学 只会抓取第一页的数据然而后面的不知道怎么抓取了
stefaniema 发表于 2020-2-14 15:02
请教楼主,第13行   url = 'https://www.ivsky.com/index.php?tn=indexload&page=%s&h=1581405277021' % index
URL后面为什么要加 % index?
 楼主| 森岛帆高 发表于 2020-2-14 19:05
这样可以替换前面字符串里的%s,和format的意思差不多
 楼主| 森岛帆高 发表于 2020-2-14 19:06
stefaniema 发表于 2020-2-14 15:02
请教楼主,第13行   url = 'https://www.ivsky.com/index.php?tn=indexload&page=%s&h=1581405277021' % in ...


这样可以替换前面字符串里的%s,和format的意思差不多
pinhai 发表于 2020-2-14 19:46
厉害
python线程、协程也把我搞得好晕
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-16 21:54

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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