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