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
然后就报错了…
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非全局代理问题
下面开始感恩前室友小讲堂:
代理通常分两步:
- 把线路搞起来 e.g. shadowsocks或vpn
- 让程序流量走这个线路
代理可分为全局代理和非全局代理。
全局代理是全部程序的流量都走代理,譬如通常的vpn。
而shadowsocks是非全局的,默认是连上之后本地开一个服务端口 譬如1080,然后通常把浏览器流量设置到走这个端口。ss本质是一个socks5服务,需要监听一个本地端口,这个就是ss服务跑起来以后在你机器上面的服务端口(其他程序譬如浏览器会把流量发到这个端口,由ss发到境外服务器)(我目前用的shadowsocks软件是shadowsocksx2,端口是写死了的1080)
解决方案有两个:
- 用一个全局的翻墙方案 譬如vpn 这样这个python脚本的流量默认翻墙了
- 仍然是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. 总结
- 学习编程时要尝试解决实际问题
- 有轮子的时候就用轮子,避免重复劳动(虽然现在我也写不出…)
- 开源项目的readme要认真写,instaLooter的小哥readme和代码写的都很干净
最后晒一张成果 instagram@will_yinan