instagram 爬虫 2021,下载可用

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,一直以为设置错误。写文章能不能写全点,全是一半!!!

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
如果您下载了本程序,但是该程序无法运行,或者您不会部署,那么您可以选择退款或者寻求我们的帮助(如果找我们帮助的话,是需要追加额外费用的) 爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值