“少女是造物者的馈赠✨ “

正文索引 [隐藏]

前言

昨天在群里看到群友转发的一条博文,我只能说,哇,真漂亮。

请抱着正确的眼光观赏这些摄影成功,别拿老色批的眼光来看嗷!

然后...然后我就想爬下来这些图片...

正文

然后今天早上上课的时候就写好了,回到宿舍爬取完毕了,总共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重定向至图片地址。暗地观察

(例如下面这张图片,其实它是一张随机图片,不信你刷新看看~ 不过为了更好的阅读,我限制了下面图片的高度,你可以在新标签页打开 放大看baiyan

对了,之前也做过相关的图片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()