1.爬虫选择

由于我是java开发人员,所以首先选择的是java爬虫。但是java做爬虫不太友好。之前我是用的nutch2.2.1,爬取的newsbrak和vmate,但是这个工具比较老。最近需要爬取instagram的图片的视频,首先排除了nutch因为需要登录和ajax动态加载数据。然后尝试了下webmagic,但是账号被提示封禁。在尝试了许多网上的方法后,找到了解决方案。大部分实现方案都是python,还有的使用js实现。但是都没有被模块化,使用不方便。还有的项目比较老,现在运行报错。

2.java实现

链接 https://b.julym.com/study/720.html

package httprequest;
import java.io.UnsupportedEncodingException;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONArray;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class instagram {
public static void main(String[] args) throws Exception {
// TODO 自动生成的方法存根
String str;//保存每次请求接口返回的数据
int i,j,k = 0;//i,j用于循环体记录,k用来给图片做文件名
String variables;//保存位置标识参数的变量
JSONObject json = null;//json对象 解析json字符串
variables = "%7B%22id%22%3A%2214847010%22%2C%22first%22%3A0%2C%22after%22%3A%22QVFEUEtZMnhHQmhicHNmVVN0ejVzU1dIamtOWWVSb0kyVmx0bmlzdjVWcEx3bmhMLWtoZTF0bkNDWm91WGRxbEhnZlh3M3E1bXJXM0ladWVxdVRnQ3AxYg%3D%3D%22%7D";
//第一次请求的after参数
String json1 = "{\"id\":\"14847010\",\"first\":12,\"after\":\"";//有斜杠是因为json字符串里有"号,而java使用"包裹字符串,所以需要使用\斜杠把"转义为原来的字符含义
String json2 = "\"}";//json1和json2用于给after参数拼接json字符串
String url = "https://www.instagram.com/graphql/query/?query_hash=d496eb541e5c789274548bf473cc553e&variables=";//设置请求的url
HttpRequest http = new HttpRequest();//实例化一个http类
for (j=0;j<47;j++) {//开始循环47次,因为总共560张图,每次返回12张,需要循环560/12=46.66≈47次
str = http.sendGet(url+variables);//发起Get请求,将variables拼接至url后
json = new JSONObject(str);//json解析返回的结果
JSONObject json3 = json.getJSONObject("data");
json3 = json3.getJSONObject("user");
json3 = json3.getJSONObject("edge_owner_to_timeline_media");
json3 = json3.getJSONObject("page_info");
//一步一步解析出end_cursor(也就是after参数的值),用作下一次请求的参数
variables = java.net.URLEncoder.encode(json1 + json3.getString("end_cursor")+json2,"UTF-8");//java.net.URLEncoder.encode为拼接好的variables参数进行url编码
json3 = json.getJSONObject("data");
json3 = json3.getJSONObject("user");
json3 = json3.getJSONObject("edge_owner_to_timeline_media");
JSONArray edges = json3.getJSONArray("edges");
//解析出包含图片url的json数组并复制给edges
for(i=0;i<edges.length();i++) {//开始循环 edges.length()为取这个数组的成员数量,文章里说了每次只返回12张图片链接,但保险起见还是循环成员总数量的次数
JSONObject tempobj = (JSONObject) edges.get(i);//取到图片的json对象复制给临时Json类 tmpobj
JSONObject tempobj1 = tempobj.getJSONObject("node");//因为图片在node对象,所以去出node对象并复制给临时json对象 tempobj1
JSONArray temparr = tempobj1.getJSONArray("display_resources");//取出包含图片url的数组,一般有三个成员,因为图片有三种大小
tempobj = (JSONObject) temparr.get(2);//直接去第三个,因为是最清晰的
System.out.println(tempobj.getString("src"));//控制台输出一下url链接
k=k+1;//记录一下是第几张图片,好给图片命名
GetUrlPic(tempobj.getString("src"),"images\\"+k+".jpg");//调用geturlpic方法 将图片保存至当前工作目录下的images文件夹(事先创建好)
}
}
//System.out.println();
}
public static void GetUrlPic(String url,String filename) throws Exception {
URL url1 = new URL(url);
//打开链接
HttpURLConnection conn = (HttpURLConnection)url1.openConnection();
//设置请求方式为"GET"
conn.setRequestMethod("GET");
//超时响应时间为5秒
conn.setConnectTimeout(5 * 1000);
//通过输入流获取图片数据
InputStream inStream = conn.getInputStream();
//得到图片的二进制数据,以二进制封装得到数据,具有通用性
byte[] data = readInputStream(inStream);
//new一个文件对象用来保存图片,默认保存当前工程根目录
File imageFile = new File(filename);
//创建输出流
FileOutputStream outStream = new FileOutputStream(imageFile);
//写入数据
outStream.write(data);
//关闭输出流
outStream.close();
}
public static byte[] readInputStream(InputStream inStream) throws Exception{
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
//创建一个Buffer字符串
byte[] buffer = new byte[1024];
//每次读取的字符串长度,如果为-1,代表全部读取完毕
int len = 0;
//使用一个输入流从buffer里把数据读取出来
while( (len=inStream.read(buffer)) != -1 ){
//用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
outStream.write(buffer, 0, len);
}
//关闭输入流
inStream.close();
//把outStream里的数据写入内存
return outStream.toByteArray();
}
}

这个是唯一能运行的java代码,但是有部分错误。需要的参数有点多,和我预期的有点大。但是思路正确,模拟请求调用,这个基本是主流实现方案。

https://github.com/postaddictme/instagram-java-scraper

这个是模块化的,但是我搭建环境后,运行失败,估计还是代码太老了,没有更新

3.python实现

python在写爬虫方面确实有很大优势。

感谢 https://github.com/arc298/instagram-scraper

这个最终采用的方案。cmd可以运行,需要设置外网。搭建好python环境后,运行直接成功。python环境的搭建可以下个软件,直接安装,然后就是3.7了。Linux大部分自带的都是2.7,需要升级,很麻烦。

To install instagram-scraper:

$ pip install instagram-scraper

To update instagram-scraper:

$ pip install instagram-scraper --upgrade

Alternatively, you can clone the project and run the following command to install: Make sure you cd into the instagram-scraper-master folder before performing the command below.

$ python setup.py install

Usage

To scrape a user's media:

$ instagram-scraper <username> -u <your username> -p <your password> 

后面再根据自己的业务需求和java结合。

登录后,直接输入博主名称,即可下载博主所有图片的视频。

4.设置外网 注意:

感谢文章 https://blog.csdn.net/baidu_39372836/article/details/96373719

1、设置cmd代理

终端输入:
set http_proxy=http://127.0.0.1:1080
set https_proxy=http://127.0.0.1:1080

终端输入:
set http_proxy=http://127.0.0.1:1080
set https_proxy=http://127.0.0.1:1080

坑点

不要输入ping www.google.com ping的协议不是https,也不是https,是ICMP协议。

终端输入:
curl -vv http://www.google.com
查看响应数据即可,有则说明成功

instagram 访问都是翻墙,需要使用代理网上的说法都是 set ,然后我就ping,一直以为设置错误。写文章能不能写全点,全是一半!!!

instagram 爬虫 2021,下载可用相关推荐

  1. 爬虫cookie过期_python instagram 爬虫

    叶湘伦:[文字篇]如何系统地自学 Python?​zhuanlan.zhihu.com 直接介绍一下具体的步骤以及注意点: instagram 爬虫注意点 instagram 的首页数据是 服务端渲染 ...

  2. XHR如何爬虫_python instagram 爬虫

    叶湘伦:[文字篇]如何系统地自学 Python?​zhuanlan.zhihu.com 直接介绍一下具体的步骤以及注意点: instagram 爬虫注意点 instagram 的首页数据是 服务端渲染 ...

  3. python爬虫下载-python爬虫之下载文件的方式总结以及程序实例

    python爬虫之下载文件的方式以及下载实例 目录 第一种方法:urlretrieve方法下载 第二种方法:request download 第三种方法:视频文件.大型文件下载 实战演示 第一种方法: ...

  4. jsoup 获取html中body内容_python爬虫之下载盗墓笔记(bs4解析HTML)

    前言: 最近一个作业用到爬虫,我爬取的网站是拉勾网,返回的是json格式,我就用字典的形式获取数据了 这次顺便把bs4解析返回的HTML格式也熟悉一下 爬了一个简单的网站:http://www.sep ...

  5. python 下载文件-python爬虫之下载文件的方式总结以及程序实例

    python爬虫之下载文件的方式以及下载实例 目录 第一种方法:urlretrieve方法下载 第二种方法:request download 第三种方法:视频文件.大型文件下载 实战演示 第一种方法: ...

  6. python爬虫批量下载“简谱”

    python讨论qq群:996113038 导语: 上次发过一篇关于"python打造电子琴"的文章,从阅读量来看,我们公众号的粉丝里面还是有很多对音乐感兴趣的朋友的.于是,今天我 ...

  7. 使用Java编写爬虫,下载百度图片

    因为最近需要很多图片素材做机器训练,所以写一个爬虫来下载百度图片里的一些图片,用作机器学习. 先看看效果图: 实现思路: 根据百度图片的Ajax请求,用Chrome获取到URL,然后通过改变URL参数 ...

  8. node.js 实现简单爬虫批量下载喜马拉雅音频

    前提:最近一直在看node,平时碎觉喜欢听盗墓笔记啥的有声小说,然后突然就就想试着写个爬虫自己下载下来,虽然有点多此一举,但是就当学习练练手了,在这里记录一下! 没有express基础的,请先行了解 ...

  9. python爬虫app步骤_Python爬虫之App爬虫视频下载的实现

    这篇文章我们来讲一下在网站建设中,Python爬虫之App爬虫视频下载的实现.本文对大家进行网站开发设计工作或者学习都有一定帮助,下面让我们进入正文. 前言 随着手app的发展逐渐强大,我们手机应用每 ...

  10. 爬虫2021广东省普通专升本各院校专业招生计划汇总表

    爬虫:2021广东省普通专升本各院校专业招生计划汇总表 代码如下: #!/usr/bin/env python # coding: utf-8import requests import json i ...

最新文章

  1. 清除Console口和Telnet密码教程
  2. Ant Design入门之开始使用
  3. 音视频技术开发周刊 75期
  4. java连接摄像头_Java实现 海康摄像头抓拍图像(示例代码)
  5. matlab根据url链接下载*.tar文件并解压
  6. Java技术:收集16 条 yyds 的代码规范,值得一读!
  7. JavaScript 获取当前时间戳的三种方式
  8. 第八章 文件资源共享
  9. magento 物流问题
  10. 两根硬铜线并线接插座_两根硬铜线正确接法
  11. 红警安装中出现的问题 win10,黑屏和无法联机对战(缺少ipx协议)的问题。
  12. js操作像素实现图片编辑
  13. HIT 软件构造 lab3实验报告
  14. 星星泪用计算机怎么弹,星星泪简谱
  15. 对大数据量Excel文件自动排版、转换成PDF用于印刷出版
  16. Unity代码调用网络摄像头WebCamTexture
  17. Boomer压测环境搭建(Windows)
  18. 【转】SCI论文写法攻略
  19. 基于小波变换的脉搏信号滤波matlab仿真
  20. plsql tables 里面不显示表格

热门文章

  1. MFC使用多线程_beginthread函数控制进度条和文本控件
  2. 杭电ACM2000题
  3. 嵌入式成长轨迹36 【Zigbee项目】【单片机基础】【单片机SD卡】
  4. 切比雪夫多项式(Chebyshev Polynomials)
  5. matlab 拟合excel中的数据,Matlab分析拟合Excel中的数据(1)---数据的导入
  6. 计算机网络 以太网 和令牌环网
  7. smart原则_OKR 文化:用 SMART 原则量化目标
  8. 计算机应用项目教案,计算机应用基础2项目二--电子教案.doc
  9. 腾达路由器linux开发,Tenda无线路由器远程命令执行后门漏洞
  10. 使用SQLParameter解决SQL注入问题