爬虫实战——Instagram图片爬取(一)

Instagram是著名的图片分享网站,我们尝试爬取某一特定标签下的所有图片,并通过MongoDB储存。

我们爬取的标签为#월정리맛집(https://www.instagram.com/explore/tags/%EC%9B%94%EC%A0%95%EB%A6%AC%EB%A7%9B%EC%A7%91/)

首先分析一下问题:整个页面成网格结构,平铺所有的帖子,相信我们很容易就可以得到页面上的内容。而落实到具体的帖子上面,我们发现有的帖子含有多张图片,那么能否获得帖子中的全部图片也成为了一个待解决的问题


我们首先进入控制台观察一下,很快发现所有的帖子都在叫"?__a=1"的json包中,那问题就可以很愉快的解决了


我们打开第一个帖子观察,轻松就找到了他的图片url


可是也发现了问题,每个帖子中只保有封面图片的url,可是对于同一帖子的其他图片就无法获得了,看来问题还是没那么容易解决的。

那我们点开某个多图的帖子来看看有没有办法获得全部的图片的url



发现在这个包中就有帖子中所有图片的url了!

现在来看如何获得不同帖子的这个包
分析一下它的url

https://www.instagram.com/graphql/query/?query_hash=477b65a610463740ccdb83135b2014db&variables=%7B%22shortcode%22%3A%22B1Iu3-VlXJt%22%2C%22child_comment_count%22%3A3%2C%22fetch_comment_count%22%3A40%2C%22parent_comment_count%22%3A24%2C%22has_threaded_comments%22%3Atrue%7D

发现了其中有一个"shortcode"的字段,我们再回到"?__a=1"中,发现所有的帖子都含有这么一个"shortcode"的值


我们尝试地构造一个url

https://www.instagram.com/graphql/query/?query_hash=477b65a610463740ccdb83135b2014db&shortcode=B1Iu3-VlXJt

成功获得了该帖子的json包!


那么现在的思路就很清晰了,首先从"?__a=1"中获得所有帖子的"shortcode",然后再构造url分别获得各个帖子中所有图片的url

爬虫将使用Requests库,并用Json库解析

构造headers

headers = {
    "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36",
    "x-ig-app-id": "936619743392459"
}

获取json对象

res = requests.get(url, headers=headers).text
ins_data = json.loads(res)

获取shortcode,并以之为"_id"储存在MongoDB中

for i in range(0, len(ins_data['graphql']['hashtag']['edge_hashtag_to_media']['edges'])):
    code_dict = {'_id': str(ins_data['graphql']['hashtag']['edge_hashtag_to_media']['edges'][i]['node']['shortcode']), 'tag_name': '월정리맛집'}
    save_to_Mongo(code_dict)

获取全部shortcode的完整代码

import requests
import json
import pymongo


def save_to_Mongo(result):
    try:
        if db[MONGO_TABLE].insert(result):
            print('存储到MongoDB成功', result)
    except Exception:
        print('存储到MongoDb失败', result)


MONGO_URl = 'localhost:27017'
MONGO_DB = 'ins'
client = pymongo.MongoClient(MONGO_URl)
db = client[MONGO_DB]
MONGO_TABLE = 'shortcode'

url = 'https://www.instagram.com/explore/tags/%EC%9B%94%EC%A0%95%EB%A6%AC%EB%A7%9B%EC%A7%91/?__a=1'
headers = {
    "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36",
    "x-ig-app-id": "936619743392459"
}

res = requests.get(url, headers=headers).text
ins_data = json.loads(res)

for i in range(0, len(ins_data['graphql']['hashtag']['edge_hashtag_to_media']['edges'])):
    code_dict = {'_id': str(ins_data['graphql']['hashtag']['edge_hashtag_to_media']['edges'][i]['node']['shortcode']), 'tag_name': '월정리맛집'}
    save_to_Mongo(code_dict)

可以看到MongoDB成功储存了所有的shortcode


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。