使用python下载instagram图片(中国大陆)

利用instaLooter和proxychains

0.

本科毕业论文做的是默克尔和奥巴马instagram形象对比分析,当年半点程序背景都没有(拿chrome查看源代码找图片链接到是会的)但instagram似乎挺不支持这个行为,源代码里都找不到图片地址。所以,当初我手动截图(加排序)了两个人官方账号里的所有图片。

所以,稍微学习了一点编程就想把这件事实现了。

1. instaRaider & instaLooter

谷歌搜索了下,发现已经有人造好了轮子instaRaider,而且把怎么造轮子的过程都写清楚了。

How to download photos from Instagram – A Hack

这个项目吸引我的地方是它不需要instagram的api,所以也不需要授权(authentication)。

但这个项目已经停止维护了,instaRaider的作者在readme里推荐了另一个项目instaLooter

当我看到instaLooter的readme里使用方式只有两行代码时我的内心好喜悦啊 ​
$ instaLooter [options] $ instaLooter hashtag [options]

然后就报错了…

requests.exceptions.ConnectionError: HTTPSConnectionPool(host='www.instagram.com', port=443): Max retries exceeded with url: /jarrywan9/ (Caused by NewConnectionError('<requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0x10402a4d0>: Failed to establish a new connection: [Errno 65] No route to host',))

原因是我instagram在国内被封了…而我翻墙走的是shadowsocks

2. 利用proxychains解决shadowsocks非全局代理问题

下面开始感恩前室友小讲堂:

代理通常分两步:

  1. 把线路搞起来 e.g. shadowsocks或vpn
  2. 让程序流量走这个线路

代理可分为全局代理和非全局代理。

全局代理是全部程序的流量都走代理,譬如通常的vpn。

而shadowsocks是非全局的,默认是连上之后本地开一个服务端口 譬如1080,然后通常把浏览器流量设置到走这个端口。ss本质是一个socks5服务,需要监听一个本地端口,这个就是ss服务跑起来以后在你机器上面的服务端口(其他程序譬如浏览器会把流量发到这个端口,由ss发到境外服务器)(我目前用的shadowsocks软件是shadowsocksx2,端口是写死了的1080)

解决方案有两个:

  1. 用一个全局的翻墙方案 譬如vpn 这样这个python脚本的流量默认翻墙了
  2. 仍然是shadowsocks 不过设置程序流量走ss这个服务端口

// 考虑第二个方案的实现成本比让前室友重新设置个vpn给我低一些 所以选择了方案二)

此时,要用到另外一个轮子 proxychains, 设置方法参照了利用proxychains在终端使用socks5代理

# proxychains安装
git clone https://github.com/rofl0r/proxychains-ng.git
cd proxychains-ng
./configure
make && make install
cp ./src/proxychains.conf /etc/proxychians.conf
cd .. && rm -rf proxychains-ng

# 编辑proxychains配置
# 需要学习下vim的操作,配置文件修改需要管理员权限 mac环境下前面加sudo
vim /etc/proxychains.conf

# 将socks4 127.0.0.1 9095改为
socks5  127.0.0.1 1080  //1080改为你自己的端口

# 在需要代理的命令前加上 proxychains4,如:
proxychains4 instaLooter jarrywan9 ./Downloads/jarrywan9

其他需要注意的一些事情:

  • 每个轮子都有Requirements,要确认下是否都安装了
  • proxychains用$ brew install proxychains 也可以安装,我是brew刚好需要更新,但死也更新不了…

4. 总结

  1. 学习编程时要尝试解决实际问题
  2. 有轮子的时候就用轮子,避免重复劳动(虽然现在我也写不出…)
  3. 开源项目的readme要认真写,instaLooter的小哥readme和代码写的都很干净

最后晒一张成果 instagram@will_yinan

will_yinan