使用URLSession获取网页内容返回403

问题描述 投票:0回答:1

我试图通过 UrlSession 获取网页的内容,但响应状态代码为 403,并检查正文,它似乎对机器人有保护。

奇怪的是,当我通过

curl
获取页面时,它会正确返回页面内容。

我使用

curl
选项检查了
--verbose
命令,并且通过请求发送了 3 个标头。我将它们添加到
URLRequest
中,但仍然收到 403 响应。
curl
GET
请求和
URLSession
请求有什么区别? 如何通过 URLSession 模拟curl请求或浏览器请求?

 var urlRequest = URLRequest(url: url)
 urlRequest.httpMethod = "GET"
 urlRequest.setValue("websiteurl.com",forHTTPHeaderField: "Host")
 urlRequest.setValue("curl/8.4.0",forHTTPHeaderField: "User-Agent")
 urlRequest.setValue("*/*",forHTTPHeaderField: "Accept")
        
 let (data, response) = try await URLSession.shared.data(for: urlRequest)
 print((response as? HTTPURLResponse).statusCode)
 // prints out 403
swift curl nsurlsession urlsession
1个回答
0
投票

在单元测试中尝试过这个并且工作正常:

func testExample() throws {
    let exp = expectation(description: "...")
    var request = URLRequest(url: URL(string: "https://dibamovie14.top")!)
    let task = URLSession.shared.dataTaskPublisher(for: request).sink {
        print($0)
        exp.fulfill()
    } receiveValue: { data, response in
        print(response)
    }
    
    waitForExpectations(timeout: 4) { error in
        guard let error = error else { return }
        print(error.localizedDescription)
    }
}

call 正在使用 dataTaskPublisher,但您应该能够将更改应用于您的方法。使用 URLSession 时,用户代理应该默认设置,并且不需要“Host”

附录: 如果需要,您可以设置用户代理,但不应设置“主机”:

主机 - 标头字段 自 HTTP/1.1 起强制执行。[17]如果请求是直接在 HTTP/2 中生成的,则不应使用它。[18]

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.