python爬取Instagram上偶像的帖子(包括图片和视频)
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)
经过多次的调试,发现的几个问题
- 数据表插入不了表情符号
- 字符串的长度要设计为
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上偶像的帖子(包括图片和视频)相关推荐
- python爬取电影评分_用Python爬取猫眼上的top100评分电影
代码如下: # 注意encoding = 'utf-8'和ensure_ascii = False,不写的话不能输出汉字 import requests from requests.exception ...
- python爬取微博话题下面的帖子并存入excel文件
此次写的是python爬取微博话题下面的帖子,示例代码以爬取#转发这个杨超越# https://s.weibo.com/weibo/%23%E8%BD%AC%E5%8F%91%E8%BF%99%E4% ...
- Python爬虫利用18行代码爬取虎牙上百张小姐姐图片
Python爬虫利用18行代码爬取虎牙上百张小姐姐图片 下面开始上代码 需要用到的库 import request #页面请求 import time #用于时间延迟 import re #正则表达式 ...
- python爬取文献代码_使用python爬取MedSci上的影响因子排名靠前的文献
使用python爬取medsci上的期刊信息,通过设定条件,然后获取相应的期刊的的影响因子排名,期刊名称,英文全称和影响因子.主要过程如下: 首先,通过分析网站http://www.medsci.cn ...
- 1-3 用Python爬取微博上电影主题的热度(主题的阅读数和讨论数)
1-3 用Python爬取微博上电影主题的热度(主题的阅读数和讨论数) 1 weiboHeat.py 2 #-*- coding:utf-8 -*- 3 ''' 4 该脚本可以从wap版的微博网站上爬 ...
- python爬取csdn上的包含整人关键词的阅读量并且存入表格里。完整代码
请注意,爬取他人网站的数据可能违反网站的条款和条件.在进行爬虫操作之前,请确保获得网站的授权. 下面是一个使用 Python 爬取 CSDN 上所有包含 "整人" 关键词文章的阅读 ...
- 用python爬取3dm上的单机游戏评测信息
用python爬取3dm上的单机游戏评测信息 参考结果 #爬取3dm上单机游戏评测榜,50页的相关信息import requests from lxml import etree headers={& ...
- steam夏日促销用Python爬取排行榜上的游戏打折信息
不知不觉,一年一度如火如荼的 steam 夏日促销悄然开始了.每年通过大大小小的促销,我的游戏库里已经堆积满还未下载过的游戏.但所谓"买到就是赚到,G胖一定大亏"的想法日渐流行,指 ...
- steam夏日促销悄然开始,用Python爬取排行榜上的游戏打折信息
前言 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例的人,却不知道如何去学习更加高深的知识. 那么针对这三类人,我给大 ...
最新文章
- [Android学习笔记]查看源代码
- Android 中查看内存的使用情况集经常使用adb命令
- 对html5的了解,HTML5——对HTML5的认识
- 一文贯通python文件读取
- mongoose设置unique不生效问题解决
- 深入了解SpringCloud Hystrix
- 如何解决IE地址栏前小图标不显示问题
- 数学/sgu 130 Circle
- LDAP命令介绍---dsreplication--initialize
- PyTorch | torch.full()使用方法 | torch.full()如何使用? torch.full()例子说明 | 通过torch.full创建全相同的张量
- 利用jsonp、iframe和location.hash解决跨域问题
- linux 简单命令
- 盈建科弹性板6计算_盈建科(300935):国内建筑结构设计软件行业的领先企业...
- 编写时间的php,PHP如何实现简单日历类编写 PHP实现简单日历类编写代码
- 10 个用于网络管理员进行高级扫描的端口扫描工具
- 客户端到服务器端的通信过程及 原理图很好
- 一套完整的投资体系:判断好生意、发现好公司、找到好价格
- mysql中sum和count的区别
- 能够实时显示CPU温度的软件
- 计算机培训感想幼儿园,幼儿园指南培训心得感想
热门文章
- C语言中的sscanf()函数使用详解
- 充电11分钟续航400公里!Nature刊发华人教授锂电新研究:只用加一层薄镍箔
- 4g网络什么时候淘汰_5G即将全面普及,4G手机还能用多久才会被淘汰?这个时间要谨记!...
- 苹果6尺寸多大_苹果新品发布,新 iMac 来了!性能翻倍,价格不变
- 想知道有哪些热门、常用API,这一篇就够了
- 位运算卷积(FWT)
- 利用selenium保存静态网页
- Simulink Test自动化(二)-自动创建TestFile,TestSuite及TestCase
- LiteOS内核教程05 | 互斥锁(共享资源保护)
- 软件测试在IT行业里真的是最底层嘛?