<技术贴>当图虫遇到爬虫...

首先,图虫网是一个很棒的图片网站,这里的爬虫只是为了研究技术,请读者朋友们,不要大量采集网站信息,爬取的图片,请取得版权后再使用...

图虫网

根据”分类名称”,获取json数据

image.png
image.png
image.png

根据json数据,获取图集url与title

image.png
image.png
image.png
image.png
image.png

爬虫架构:

爬虫多线程实现

运行界面:

运行

最终效果

效果

会在同级目录下生成一个images的文件夹,里面有按照原主题命名的图片...

图片目录

最后放出源码(仅限交流,请不要用来大量采集网站信息):

import requests
import json
import re
import time
import os
from multiprocessing import Process, Queue
import time
from time import sleep
import threading
import sys

class TuChong(object):
    def __init__(self):

        self.headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36'}
        self.target_image_num = 0
        self.title_name = None
        self.q_json = Queue()
        self.q_album = Queue()
        self.q_image = Queue()

        pass

    # 负责获取响应
    def get_response_content(self, url):
        try:
            response = requests.get(url, headers = self.headers)
            return response.content
        except:
            pass

    def get_json_data(self):

        title =["风光","人像","城市","旅行","纪实","街拍","人文","美女","建筑","静物","夜景","自然","少女","儿童","秋天","光影","花卉","私房","色彩","抓拍","黑白","小清新","情绪","日系","后期","写真","微距","创意","情感","复古","手机","佳能","尼康","胶片","索尼","50mm","35mm","广角","富士","iphone","宾得","85mm","北京","上海","广州",
"深圳","南京","成都","武汉","厦门","杭州","重庆","西藏","西安","四川","大连","新疆","长沙","苏州","日本","中国","浙江","川西","香港","云南","青岛"]

        for i in range(len(title)):
            if i%5 == 0:
                print()
            print("{""代号", i,"-->",title[i],"}",end="")

        print("")
        print("=="*10)      

        title_code =  int(input("请输入代号:"))
        self.title_name = title[title_code]
        self.target_image_num = int(input("请输入图片数量:"))
        print("开始下载-->%s主题"%(self.title_name))
        # 获取json数据
        for m in range(1, 3):
            tc_get_json = "https://tuchong.com/rest/tags/%s/posts?page=%s&count=20"%(self.title_name,m)
            # print("->", tc_get_json)
            tc_json = self.get_response_content(tc_get_json)
            self.q_json.put(tc_json)


    def get_album_url(self):
        while True:
            try:
                str_data = self.q_json.get().decode()
                # print("--->json分界限<---")
                # print("-->", str_data)
            except Exception as e:
                # print("-->获取json数据失败",e)
                sleep(0.1)
                continue

            page_list_jsons = json.loads(str_data)["postList"]

            for page_list_json in page_list_jsons:

                temp = {}
                # 获取图集主题
                try:
                    temp["title"] = page_list_json["title"]
                    # print("-->获得图集名称-->",temp["title"])
                    # 获取图集url
                    temp["url"] = page_list_json["url"]
                except Exception as e:
                    # print("获取图集信息出错",e)
                    pass
                # 过滤帖子类型的图集
                if re.match(r"https://tuchong.com/(\d)*?/(\d)*?/", temp["url"]):
                    # 将url与标题,信息加入队列
                    self.q_album.put(temp)
                    # 记录图集的url
                    with open("./目录.json", "a") as f:
                        str_data = json.dumps(temp, ensure_ascii=False) + ',\n'
                        f.write(str_data)


    # 根据图集获取单张图片url地址
    def get_image_url(self):

        while True:
            sleep(0.1)

            # 获取图集url和标题
            try:
                album = self.q_album.get()
            except Exception as e:
                print("正在获取图集首页...")
                continue
            album_url = album["url"]
            album_title = album["title"]
            # 获取图集首页响应内容
            response_content = self.get_response_content(album_url)
            # 获取图集图片集合信息
            image_info_list = re.findall(r'\"img_id\"\:\d+\,\"user_id\"\:\d+', response_content.decode())

            for image_info in image_info_list:
                img_id = image_info.split(",")[0].split(":")[1]
                user_id = image_info.split(",")[1].split(":")[1]
                image_url = "https://photo.tuchong.com/%s/f/%s.jpg"%(user_id, img_id)
                # 将图片url信息和所在的图集标题加入队列
                temp = dict()
                temp["image_url"] = image_url
                temp["album_title"] = album_title

                self.q_image.put(temp)
                # print("-->put",temp)


    def save_image(self):
        while True:
            
            sleep(0.1)

            try:
                # 获取图片信息
                image_temp = self.q_image.get()
            except Exception as e:
                # print("准备下载图片")
                continue
            image_url = image_temp["image_url"]
            album_title = image_temp["album_title"]
            old_name = re.match(r".*?f\/(.*)",image_url).group(1)
            # print("旧的名字为", old_name)
            new_image_name = album_title +"_"+old_name
            # print(new_image_name)

            # 建立文件夹
            try:
                os.makedirs("./images/%s"%(self.title_name))
            except Exception as e:
                pass

            # 写入图片
            file_path = "./images/%s/%s"%(self.title_name, new_image_name)

            
            if self.target_image_num <= 0:
                print("下载完毕")
                # os._exit()
                sys.exit()
            try:
                print("正在下载第%d张图片.."%(self.target_image_num))
                self.target_image_num -= 1
                print("-->", file_path, image_url)
                image_data = self.get_response_content(image_url)
                with open(file_path, "wb+") as f:

                    f.write(image_data)

            except:

                # print("网络故障,图片下载变慢")
                pass

def main():
    tuchong = TuChong()
    tuchong.get_json_data()

    t1 = threading.Thread(target=tuchong.get_album_url)
    t1.start()

    t2 = threading.Thread(target=tuchong.get_image_url)
    t2.start()

    try:

        t3 = threading.Thread(target=tuchong.save_image)
        t3.start()

        t4 = threading.Thread(target=tuchong.save_image)
        t4.start()

    except:
        print("主程序退出")
        sys.exit()

if __name__ == '__main__':
    main()

本文永久更新地址(欢迎来读留言,写评论):

https://www.v2fy.com/p/2020-12-27-tuchong-1609053931000

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容