iOS开发 为app配置代理


由于对某款app的租房信息的筛选条件不满意,所以爬取了它的api以便能够根据自己的需求进行筛选。根据自己的初级爬虫经验,为了防止app封禁我的ip,所以准备通过代理服务器去访问。

过程是相当纠结啊,尝试的太多,这里就只放结论了。

提前了解:

  1. http方式的代理只能访问http网站。
  2. https方式的代理只能访问https网站。
    注:上面的“只能”指的是访问失败或者能访问但隐藏不了ip。
    ps:有时代理稳定性也很重要,不行就换换吧。

验证方式:

  1. http代理:http://www.whatismyip.com.tw
  2. https代理:https://ip.cn
    直接浏览器访问就能看到你本机公网ip。设置代理后再访问,如果能看到你设置的代理ip,则表示成功。
    另外给两个免费代理获取网站:
    http://www.xicidaili.com/ : 不要访问太频繁,笔者已经被block了 !_!
    https://proxy.mimvp.com/: 免费的在页面最下方

上代码(Swift):

笔者使用的URLSession,初始化前配置URLSessionConfiguration对象的connectionProxyDictionary即可。

class HTTPProxyPool: NSObject, URLSessionDelegate {

    /// 设置HTTP代理
    ///
    /// - Returns: 使用了代理的session
    func tempForSetProxy() -> URLSession? {

        let host = "218.72.108.124"
        let port = 18118

        let proxyDict: [String: Any] = [
            // 激活http代理
            String(kCFNetworkProxiesHTTPEnable) : true,
            // 端口号,注意是 Int 类型
            String(kCFNetworkProxiesHTTPPort) : port,
            // 代理ip,注意是 String 类型
            String(kCFNetworkProxiesHTTPProxy) : host
        ]
        // 使用默认config
        let config = URLSessionConfiguration.default
        // 设置代理字典
        config.connectionProxyDictionary = proxyDict
        
        let session = URLSession(configuration: config)
        // 配置请求
        let url = URL(string: "http://www.whatismyip.com.tw")
        var req = URLRequest(url: url!)
        // 创建并执行网络请求任务
        let task = session.dataTask(with: req) { (data, res, err) in
            if let data = data {
                // 如果你的返回值是谋道的广告(至少我是),请往后看。
                // 此时你需要换ip ······
                print(String(data: data, encoding: .utf8))
            }
        }
        task.resume()

        return session
    }

}

特别提醒:host类型为String, 而port类型为Int.

  • 上面的代码展示的是http代理的设置。针对http代理,proxyDict也可替换成下面这个:
{
    // 激活http代理
    "HTTPEnable" : true,
    // 代理ip
    "HTTPProxy" : host,
    // 端口号
    "HTTPPort" : port
}

ps:使用http时,需要添加ATS白名单


  • 使用https代理
    1. 首先确定你使用的代理是https方式的
    2. 访问的url也是https。这里就是将url换成https://ip.cn
    3. 替换proxyDict为以下内容:
{
    // 激活https代理
    "HTTPSEnable" : true,
    // 代理ip
    "HTTPSProxy" : host,
    // 端口号
    "HTTPSPort" : port
}

注:两种代理方式貌似不能同时使用。不确定是因为我测试时上一秒代理还好好的,下一秒就挂了。


题外话1:关于返回值是其他html

        一般服务器对于爬虫是不欢迎的。真正的用户操作再快都需要一定的时间,而爬虫访问时间很短,因此相当规模的爬虫对服务器造成的负担就更大。所以服务器会对爬虫做检测,如果被抓到则可能被封掉ip或像本例一样返回其他网站。
        针对检测,我们的做法就是要伪装成真正的用户。以笔者目前的理解有两点:
        1. 修改请求头。通过Charles抓包可以看到一次请求的头部信息,对照修改
        2. 设定访问延时。手速再快你也快不过自动运行的程序吧。
参考链接:
https://blog.csdn.net/c406495762/article/details/60137956
ps: 一个不错的爬虫学习系列

题外话2:记录一个看起来挺重要的问题(未能验证)

过程中遇到最多的就是1200错误码:无法与服务器建立安全连接。网上大多数意见是服务器SSL版本不够,因为iOS最低要求使用TLSv1.2的版本。对于更低一点的,就需要特别指定版本。( 由于我这里是代理字典https key用错了,才导致的1200。所以只能先在这mark一下 )
以下是网上给出的解决方法:

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>your.https.server</key>
            <dict>
                <key>NSExceptionRequiresForwardSecrecy</key>
                <false/>
                <key>NSExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSExceptionMinimumTLSVersion</key>
                <string>TLSv1.0</string>
            </dict>
        </dict>
    </dict>

这是一个测试TLS的控制台命令:
nscurl --ats-diagnostics --verbose https://xxxxxxxxx
这里能自动测试哪种key能通过,随便找个https的网站试一下吧。

  • 最后,这个问题困扰了我一天多。在网上各种找,尝试种种方案,一直报1200的错误。然后,然后我就打开苹果开发者官网搜了下proxy。我只想说What the F···。一般来说官方文档是了解一门技术的最好方式,为什么我才想起呢?
  • 再遇到这种牛角尖问题:
  • 借助官方文档!!!
  • 借助官方文档!!!
  • 借助官方文档!!!

附上connectionProxyDictionary keys 参见Table 3-7
https://developer.apple.com/library/content/documentation/Networking/Conceptual/SystemConfigFrameworks/SC_UnderstandSchema/SC_UnderstandSchema.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,252评论 6 516
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,886评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,814评论 0 361
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,869评论 1 299
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,888评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,475评论 1 312
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,010评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,924评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,469评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,552评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,680评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,362评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,037评论 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,519评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,621评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,099评论 3 378
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,691评论 2 361

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,312评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,713评论 18 139
  • 分享
    溢_469f阅读 266评论 0 0
  • 没有人与生俱来就是会快乐的,也没有人能永远无忧。活在天堂还是地狱,其实都在我们的一念之间。热闹会散场,孤独会悄悄侵...
    静华2016阅读 1,112评论 14 15
  • 前言 相信不少喜欢对内存进行优化的开发者都注意到了,使用AFNetworking会造成内存泄漏,当然造成内存泄漏的...
    雨天多久就阅读 1,044评论 2 5