“少女是造物者的馈赠✨ “
前言
昨天在群里看到群友转发的一条博文,我只能说,哇,真漂亮。
请抱着正确的眼光观赏这些摄影成功,别拿老色批的眼光来看嗷!
然后...然后我就想爬下来这些图片...
正文
然后今天早上上课的时候就写好了,回到宿舍爬取完毕了,总共95,891张图片(后面又看到另外一个博主的也不错,就也爬取了。)
然后爬虫 爬完的时候,突然想到了微博有 超话 和 话题俩功能,看了一下,里面的图片确实多,但是有点懒了。。就没继续写了,有空再补上吧!
博主1:https://weibo.com/u/6926803863
博主2:https://weibo.com/hangzhouyuepai
如果你要把这些图片都下载到本地的话你可以直接下载这个 url.txt 文件,里面有这次爬虫爬下来的所有url,直接用可以支持批量下载的下载工具下载即可(例: 迅雷)
(由于里面有95891个地址,所以你的下载工具添加下载任务的时候可能会卡一阵子... 不争气的说..我卡了有至少五分钟)
url.txt 下载: https://imacro.lanzoui.com/iqo4agw3z4f
先放几张好康的图片康康!(图2和图3已经拿来做手机壁纸了)
API
嗯,没错,我把这95,891都放进数据库了,然后写了下随机图片。(于2020.9.27日新增322544张图,目前总共含有418428张图。)
调用方式还是GET
地址是:https://api.julym.com/xjj/art.php
有一个参数,encode,encode=text时返回图片url, encode=json时返回json,不填写就会302重定向至图片地址。
(例如下面这张图片,其实它是一张随机图片,不信你刷新看看~ 不过为了更好的阅读,我限制了下面图片的高度,你可以在新标签页打开 放大看)
对了,之前也做过相关的图片API,五万多张图片,地址:https://b.julym.com/original/824.html
爬虫Python代码
爬虫是python写的,但是我没有写注释...可能你会看不明白
(如果你需要了解过程的话可以进QQ群或者评论留言)
这个爬虫还是比较完善的吧,不过只能爬取单个用户,如果你需要用来爬取其他博主的话你需要将第11行的weibo_id 改为你要爬的博主的uid(uid就是账号id)。
像这个博主 https://weibo.com/u/6926803863 的Uid就是6926803863,如果博主设置了个性域名的话你就右键查看源代码,这一行就是他的uid。
然后另外要说明的就是第12行的 download = 0,当这里不是1的时候爬虫就不会将图片保存至本地,只会将图片的url链接保存至当前目录的 url.txt 文件。
如果你想将图片保存至本地的话你可以将这一行改为download = 1即可。
第10行的 save_path = 'D:/weibo_images/' 就是你爬取图片的保存目录了。
最后需要说明的就是第70-72行,如果你需要开启多线程爬取的话就把70和71行最前面的 # 符号删除(取消注释) 然后在第72行最前面加个# 即可(注释掉)。
(不过多线程有个bug,太快了的话微博会拒绝你的连接,所以第71行就是执行线程的间隔,单位为秒)
import _thread import os import time from urllib import parse import requests import json import urllib save_path = 'D:/weibo_images/' weibo_id = '6926803863' download = 0 total_count = 0 headers = { 'accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'accept-encoding': 'gzip, deflate, br', 'accept-language': 'zh-CN,zh;q=0.9', 'sec-fetch-dest': 'document', 'sec-fetch-mode': 'navigate', 'sec-fetch-site': 'none', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Mobile Safari/537.36', } def get_ContainerIDAndCount_Fromcookie(id): global headers request = requests.get('https://m.weibo.cn/u/'+id,headers=headers) #request.raw.headers.getlist('Set-Cookie') containerID = parse.unquote(request.cookies['M_WEIBOCN_PARAMS']).split('=')[1].split('&')[0] request = requests.get('https://m.weibo.cn/api/container/getIndex?type=uid&value='+ id +'&containerid=' + containerID, headers=headers) json_temp = json.loads(request.text) containerid = json_temp['data']['tabsInfo']['tabs'][1]['containerid'] request = requests.get("https://m.weibo.cn/api/container/getIndex?containerid=" + containerid,headers=headers) json_temp = json.loads(request.text) count = json_temp['data']['cardlistInfo']['total'] return containerid,count def saveImage(url): global total_count, download total_count += 1 file = 'url.txt' with open(file, 'a+') as f: f.write(url + '\n') try: if (download == 1): urllib.request.urlretrieve(url, save_path + os.path.basename(url)) print("正在下载第:{0}张 \n {1}".format(total_count,url)) except: print("下载失败,重新下载。") if (download == 1): urllib.request.urlretrieve(url, save_path + os.path.basename(url)) print("正在下载第:{0}张 \n {1}".format(total_count,url)) def craw(): global url,containerID,since_id http = requests.get(url, headers=headers) json_data = json.loads(http.text) if('since_id' in json_data['data']['cardlistInfo']): since_id = str(json_data['data']['cardlistInfo']['since_id']) else: print('暂无更多图片,已爬取完毕。') os._exit(0) print("正在分析下载第{0}篇微博图片, 总共需要下载{1}, 还需要下载{2}, SinceId:{3}".format((count + 1) * 10, weibo_count,weibo_count - (count * 10), since_id)) for i in range(0, len(json_data['data']['cards'])): print(http.text) if ('pics' in json_data['data']['cards'][i]['mblog']): for j in range(0, len(json_data['data']['cards'][i]['mblog']['pics'])): print(http.text) print(i, j) src = json_data['data']['cards'][i]['mblog']['pics'][j]['large']['url'] # _thread.start_new_thread(saveImage, (src,)) # time.sleep(0.3) saveImage(src) containerID, weibo_count = get_ContainerIDAndCount_Fromcookie(weibo_id) print(containerID, weibo_count) for count in range(0,weibo_count): if (count == 0): url = "https://m.weibo.cn/api/container/getIndex?containerid=" + containerID else: url = "https://m.weibo.cn/api/container/getIndex?containerid=" + containerID + "&since_id="+ since_id try: craw() except: craw()
原文链接:"少女是造物者的馈赠✨ "
Macro's Blog 版权所有,转载请注明出处。
爬虫从def开始就懵了,看来还需要好好学习,不过图片我先收走咯,表白楼主
这里 https://b.julym.com/original/1042.html
教教我求你了
别装了奥
楼主,新版VPN在哪下呀?群里也木有