python爬取Instagram上偶像的帖子(包括图片和视频)

声明:仅供技术交流,请勿用于非法用途,如有其它非法用途造成损失,和本博客无关

目录

  • python爬取Instagram上偶像的帖子(包括图片和视频)
    • 本次爬虫使用的是:`requests`
      • 一、配置环境
      • 二、分析网页
      • 三、数据库设计
      • 四、完整代码
      • 五、数据展示
  • 写在最后

爬取的网站:Instagram上JayChou周杰伦的所有帖子 点击跳转

本次爬虫使用的是:requests

一、配置环境

  • python3.7
  • pycharm
  • requests
  • win10
  • pymysql

二、分析网页

打开之后发现它是AJAX动态加载的,并且加载完了前面的,再往后加载的话,前面加载完的会消失掉的。

F12打开开发者工具查看XHR,可以找到对应的请求AJAX的网站,发现其规律主要是after参数的不断更改来获取对应的数据,但是同时发现这个参数是随机改变的,完全没有规律,那么在哪能找到下一页数据的这个参数呢,答案就是在返回的json数据里面啦(然鹅我分析了很久怎么生成这个参数的,最后才恍然大悟竟然就在返回的数据里面)

但是又有一个问题来了,就是一开始的after参数去哪里找呢,答案就是在一开始请求的网页的源代码上哈哈,在杰伦主页查看源代码即可找到
可能又有小朋友会问,源代码这么多这么复杂怎么提取这个字符串呢,答案就是正则匹配啦敢敢单单

s=requests.session()
s.headers={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'}
r=s.get('https://www.instagram.com/jaychou/')
qvf=re.findall('"has_next_page":true,"end_cursor":"(.*?)"},"edges"',r.text)[0]

那么获取到这个一开始的关键参数,后面就是编写在json数据中提取想要的信息的代码了,先构造请求的url为:

qvf='{"id":"5951385086","first":12,"after":"%s"}'%qvf
link='https://www.instagram.com/graphql/query/?query_hash=2c5d4d8b70cad329c4a6ebe3abb6eedd&variables='+urllib.request.quote(qvf)

我提取的信息有:

  • 每条帖子的唯一id
  • 配文
  • 点赞人数
  • 评论数
  • 发布时间
  • 地点
  • 图片、视频

具体细节请看代码注释

三、数据库设计

  • 创建表
import pymysql
conn = pymysql.connect(host='localhost', user='youruser', password='yourpassword', database='yourdatabase')
cursor = conn.cursor()
sql='''
CREATE TABLE IF NOT EXISTS jaychou(
id VARCHAR(255) PRIMARY KEY,
text longtext,
public_time datetime,
location VARCHAR(255),
good_count int,
comment_count int,
imgage_url longtext,
video_url longtext,
video_view_count VARCHAR(255)
)
ENGINE=innodb DEFAULT CHARSET=utf8;'''
cursor.execute(sql)
  • 修改表结构(为了能够插入表情)
sql='ALTER TABLE jaychou CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci'
cursor.execute(sql)

经过多次的调试,发现的几个问题

  1. 数据表插入不了表情符号
  2. 字符串的长度要设计为longtext(稳一点)

四、完整代码

import requests
import re
import time
import random
import pymysql
import os
import jsonconn = pymysql.connect(host='localhost', user='youruser', password='yourpassword', database='yourdatabase')
cursor = conn.cursor()
sql='''
CREATE TABLE IF NOT EXISTS jaychou(
id VARCHAR(255) PRIMARY KEY,
text longtext,
public_time datetime,
location VARCHAR(255),
good_count int,
comment_count int,
imgage_url longtext,
video_url longtext,
video_view_count VARCHAR(255)
)
ENGINE=innodb DEFAULT CHARSET=utf8;'''
cursor.execute(sql)sql='ALTER TABLE jaychou CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci'
cursor.execute(sql)cursor.close()
conn.close()s=requests.session()
s.headers={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'}
r=s.get('https://www.instagram.com/jaychou/')
#拿到第一个after参数
qvf=re.findall('"has_next_page":true,"end_cursor":"(.*?)"},"edges"',r.text)[0]
k=1  #记录循环次数
while True:conn = pymysql.connect(host='localhost', user='youruser', password='yourpassword', database='yourdatabase')cursor = conn.cursor()sql='select * from jaychou'res=cursor.execute(sql)res=cursor.fetchall()temp=[]  #避免重复插入if len(res) != 0:for i in range(len(res)):temp.append(list(res[i])[0])qvf='{"id":"5951385086","first":12,"after":"%s"}'%qvflink='https://www.instagram.com/graphql/query/?query_hash=2c5d4d8b70cad329c4a6ebe3abb6eedd&variables='+urllib.request.quote(qvf)response=s.get(link).json()time.sleep(random.uniform(1,1.5))qvf=response['data']['user']['edge_owner_to_timeline_media']['page_info']['end_cursor']edges=response['data']['user']['edge_owner_to_timeline_media']['edges']print(f'第{k}次,有{len(edges)}个edges')for edge in edges:imgage_url = []  #存图片video_url = []   #存视频video_view_count = []   #存视频播放数id=edge['node']['id']  #唯一标识typename=edge['node']['__typename']text = '无'if edge['node']['edge_media_to_caption']['edges'] != []:text = edge['node']['edge_media_to_caption']['edges'][0]['node']['text']  # 配文public_time=time.strftime('%Y-%m-%d %H:%M:%S',time.gmtime(edge['node']['taken_at_timestamp']))  #发布时间good_count = edge['node']['edge_media_preview_like']['count']  # 点赞人数comment_count = edge['node']['edge_media_to_comment']['count']  # 评论数location='无' if edge['node']['location'] is None else edge['node']['location']['name']  #地点if typename == 'GraphImage':  #说明只有一张图片imgage_url.append(edge['node']['display_url'])  #图片地址elif typename == 'GraphVideo': #说明只有一个视频video_url.append(edge['node']['video_url'])  #视频地址video_view_count.append(str(edge['node']['video_view_count']))  #视频播放数elif typename == 'GraphSidecar':  #说明是组图,或者是组视频,又或者是视频加图片childrens = edge['node']['edge_sidecar_to_children']['edges']for children in childrens:if children['node']['is_video'] is False:imgage_url.append(children['node']['display_url'])else:video_url.append(children['node']['video_url'])video_view_count.append(str(children['node']['video_view_count']))if id not in temp:name=public_time.replace(':','')  #文件名不能含有冒号path=f'./jaychou/{name}/'if not os.path.exists(path):os.makedirs(path)with open(path+'配文.txt','w',encoding='utf-8') as f:f.write(text)for i,each in enumerate(imgage_url):  #下载图片with open(path+f'{i+1}.jpg','wb') as f:res=s.get(each)f.write(res.content)time.sleep(random.uniform(1,1.5))for i,each in enumerate(video_url):   #下载视频with open(path+f'{i+1}.mp4','wb') as f:res=s.get(each)f.write(res.content)time.sleep(random.uniform(1,1.5))sql='insert into jaychou(id,text,public_time,location,good_count,comment_count,imgage_url,video_url,video_view_count) values(%s,%s,%s,%s,%s,%s,%s,%s,%s)'cursor.execute(sql,[id,text,public_time,location,good_count,comment_count,','.join(imgage_url),','.join(video_url),','.join(video_view_count)])conn.commit()k+=1cursor.close()conn.close()if qvf is None:  #没有下一页的时候退出循环break

五、数据展示



写在最后

很明显,我是杰迷。从小学五年级的时候,还记得那是一个阳光明媚中午,放学的时候,每个班排好队一起从课室走出校门的这一段路上,旁边的一个好朋友在唱:“还记得你说家是唯一的城堡……”,然后我就问他什么歌曲,他骄傲的说:“稻香”,于是乎回到家就上网找稻香这首歌,并把下载到MP3上,反复地听,还跟着唱,然后觉得一首还不够,就把杰伦之前的歌都下载到MP3上,循环播放一遍又一遍……后来,买了一台可以看歌词的MP4,那时候,流行抄歌词,我就把歌词抄在课本上,而且那时候还流行非主流签名,在课本上我还写满了周杰伦三个字,各种手写非主流签名。贼溜贼溜呢哈哈。周杰伦周春春,他的歌总是陪伴在我开心、伤心的每个瞬间,现在每逢坐车的时候,打代码的时候,洗澡的时候,我就打开音乐,打开收藏夹,听周杰伦的歌。还有太多太多跟杰伦有关的时候了,可是,还有一个最重要的时刻还没有完成,那就是跟我的另一半一起去看一场周杰伦的演唱会。

python爬取Instagram上偶像的帖子(包括图片和视频)相关推荐

  1. python爬取电影评分_用Python爬取猫眼上的top100评分电影

    代码如下: # 注意encoding = 'utf-8'和ensure_ascii = False,不写的话不能输出汉字 import requests from requests.exception ...

  2. python爬取微博话题下面的帖子并存入excel文件

    此次写的是python爬取微博话题下面的帖子,示例代码以爬取#转发这个杨超越# https://s.weibo.com/weibo/%23%E8%BD%AC%E5%8F%91%E8%BF%99%E4% ...

  3. Python爬虫利用18行代码爬取虎牙上百张小姐姐图片

    Python爬虫利用18行代码爬取虎牙上百张小姐姐图片 下面开始上代码 需要用到的库 import request #页面请求 import time #用于时间延迟 import re #正则表达式 ...

  4. python爬取文献代码_使用python爬取MedSci上的影响因子排名靠前的文献

    使用python爬取medsci上的期刊信息,通过设定条件,然后获取相应的期刊的的影响因子排名,期刊名称,英文全称和影响因子.主要过程如下: 首先,通过分析网站http://www.medsci.cn ...

  5. 1-3 用Python爬取微博上电影主题的热度(主题的阅读数和讨论数)

    1-3 用Python爬取微博上电影主题的热度(主题的阅读数和讨论数) 1 weiboHeat.py 2 #-*- coding:utf-8 -*- 3 ''' 4 该脚本可以从wap版的微博网站上爬 ...

  6. python爬取csdn上的包含整人关键词的阅读量并且存入表格里。完整代码

    请注意,爬取他人网站的数据可能违反网站的条款和条件.在进行爬虫操作之前,请确保获得网站的授权. 下面是一个使用 Python 爬取 CSDN 上所有包含 "整人" 关键词文章的阅读 ...

  7. 用python爬取3dm上的单机游戏评测信息

    用python爬取3dm上的单机游戏评测信息 参考结果 #爬取3dm上单机游戏评测榜,50页的相关信息import requests from lxml import etree headers={& ...

  8. steam夏日促销用Python爬取排行榜上的游戏打折信息

    不知不觉,一年一度如火如荼的 steam 夏日促销悄然开始了.每年通过大大小小的促销,我的游戏库里已经堆积满还未下载过的游戏.但所谓"买到就是赚到,G胖一定大亏"的想法日渐流行,指 ...

  9. steam夏日促销悄然开始,用Python爬取排行榜上的游戏打折信息

    前言 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例的人,却不知道如何去学习更加高深的知识. 那么针对这三类人,我给大 ...

最新文章

  1. [Android学习笔记]查看源代码
  2. Android 中查看内存的使用情况集经常使用adb命令
  3. 对html5的了解,HTML5——对HTML5的认识
  4. 一文贯通python文件读取
  5. mongoose设置unique不生效问题解决
  6. 深入了解SpringCloud Hystrix
  7. 如何解决IE地址栏前小图标不显示问题
  8. 数学/sgu 130 Circle
  9. LDAP命令介绍---dsreplication--initialize
  10. PyTorch | torch.full()使用方法 | torch.full()如何使用? torch.full()例子说明 | 通过torch.full创建全相同的张量
  11. 利用jsonp、iframe和location.hash解决跨域问题
  12. linux 简单命令
  13. 盈建科弹性板6计算_盈建科(300935):国内建筑结构设计软件行业的领先企业...
  14. 编写时间的php,PHP如何实现简单日历类编写 PHP实现简单日历类编写代码
  15. 10 个用于网络管理员进行高级扫描的端口扫描工具
  16. 客户端到服务器端的通信过程及 原理图很好
  17. 一套完整的投资体系:判断好生意、发现好公司、找到好价格
  18. mysql中sum和count的区别
  19. 能够实时显示CPU温度的软件
  20. 计算机培训感想幼儿园,幼儿园指南培训心得感想

热门文章

  1. C语言中的sscanf()函数使用详解
  2. 充电11分钟续航400公里!Nature刊发华人教授锂电新研究:只用加一层薄镍箔
  3. 4g网络什么时候淘汰_5G即将全面普及,4G手机还能用多久才会被淘汰?这个时间要谨记!...
  4. 苹果6尺寸多大_苹果新品发布,新 iMac 来了!性能翻倍,价格不变
  5. 想知道有哪些热门、常用API,这一篇就够了
  6. 位运算卷积(FWT)
  7. 利用selenium保存静态网页
  8. Simulink Test自动化(二)-自动创建TestFile,TestSuite及TestCase
  9. LiteOS内核教程05 | 互斥锁(共享资源保护)
  10. 软件测试在IT行业里真的是最底层嘛?