将抓取gelbeseiten.de数据的Curl语句转换为C#代码的技术咨询
问题分析与解决方案
你遇到的核心问题是没有将curl命令中的--data-raw表单数据转换到C#代码中,同时对HttpWebRequest的一些基础配置也有误(比如默认请求方法是GET,而你需要的是POST请求)。下面是修正后的完整代码,以及关键细节的说明:
修正后的C#代码
using System; using System.IO; using System.Net; class Program { static void Main() { var url = "https://www.gelbeseiten.de/AjaxSuche"; var boundary = "----WebKitFormBoundary2Ht3afv9RtrlWwk9"; // 创建请求并设置基础属性 var httpRequest = (HttpWebRequest)WebRequest.Create(url); httpRequest.Method = "POST"; // 必须设置为POST,curl默认是POST当有--data参数时 httpRequest.ContentType = $"multipart/form-data; boundary={boundary}"; httpRequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36"; httpRequest.Accept = "*/*"; httpRequest.Referer = "https://www.gelbeseiten.de/"; httpRequest.Headers.Add("pragma", "no-cache"); httpRequest.Headers.Add("cache-control", "no-cache"); httpRequest.Headers.Add("sec-ch-ua", "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"98\", \"Google Chrome\";v=\"98\""); httpRequest.Headers.Add("sec-ch-ua-mobile", "?0"); httpRequest.Headers.Add("sec-ch-ua-platform", "\"Windows\""); httpRequest.Headers.Add("origin", "https://www.gelbeseiten.de"); httpRequest.Headers.Add("sec-fetch-site", "same-origin"); httpRequest.Headers.Add("sec-fetch-mode", "cors"); httpRequest.Headers.Add("sec-fetch-dest", "empty"); httpRequest.Headers.Add("accept-language", "de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7"); httpRequest.Headers.Add("cookie", "leverate=eyJjcmVhdGVkIjoxNjQ1MjU1NDE1Mjg5LCJsYXN0QWN0aW9uIjoxNjQ1MjU1NDE1Mjg5LCJyZWZlcnJlciI6IiJ9; leverate_session=1; _wwau=id=2429049831619900000&c=1&ti=1645255415&v=1; _wwas=1645255415; _wwao=; __cmpconsentx15760=CPUoXFgPUoXFgAfbgBDECDCgAAAAAAAAAAigAAAOxgCAA4AYIA3MB2IAAA; __cmpcpcx15760=__1__; __cmpcpc=__1__; __cmpiabli=__56_945_883_772_; __cmpcvcx15760=__s23_c7888_c24201_s24_c7853_c7957_c23722_U__; __cmpcvc=__s23_c7888_c24201_s24_c7853_c7957_c23722_U__; utag_main=v_id:017f10dd56000001b500915ce0d105073003206b00bd0$_sn:1$_ss:0$_st:1645257226251$ses_id:1645255415298%3Bexp-session$_pn:1%3Bexp-session; _wwav=ti=1645255415&pc=2&ec=60&le=1645255445&v=1"); // 构建multipart表单数据,严格遵循格式要求 var formData = $"--{boundary}\r\n" + "Content-Disposition: form-data; name=\"umkreis\"\r\n\r\n" + "-1\r\n" + $"--{boundary}\r\n" + "Content-Disposition: form-data; name=\"WAS\"\r\n\r\n" + "EDV\r\n" + $"--{boundary}\r\n" + "Content-Disposition: form-data; name=\"WO\"\r\n\r\n" + "Nürnberg\r\n" + $"--{boundary}\r\n" + "Content-Disposition: form-data; name=\"position\"\r\n\r\n" + "51\r\n" + $"--{boundary}\r\n" + "Content-Disposition: form-data; name=\"anzahl\"\r\n\r\n" + "10\r\n" + $"--{boundary}\r\n" + "Content-Disposition: form-data; name=\"sortierung\"\r\n\r\n" + "relevanz\r\n" + $"--{boundary}--\r\n"; // 将表单数据写入请求流 using (var streamWriter = new StreamWriter(httpRequest.GetRequestStream())) { streamWriter.Write(formData); } // 获取响应并处理,添加错误捕获便于排查问题 try { var httpResponse = (HttpWebResponse)httpRequest.GetResponse(); using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { var result = streamReader.ReadToEnd(); Console.WriteLine("响应内容:"); Console.WriteLine(result); } Console.WriteLine($"状态码:{httpResponse.StatusCode}"); httpResponse.Close(); } catch (WebException ex) { if (ex.Response != null) { using (var errorResponse = (HttpWebResponse)ex.Response) using (var reader = new StreamReader(errorResponse.GetResponseStream())) { Console.WriteLine("错误响应:"); Console.WriteLine(reader.ReadToEnd()); Console.WriteLine($"错误状态码:{errorResponse.StatusCode}"); } } } } }
关键修正点说明
- 请求方法设置:必须显式将
Method设为POST,HttpWebRequest默认是GET,而curl在使用--data参数时会自动切换为POST请求。 - ContentType设置:不能通过
Headers添加,要直接赋值给httpRequest.ContentType属性,这是.NET类库的规范要求,避免潜在的格式错误。 - 表单数据构建:严格按照multipart/form-data的格式拼接内容,每个字段之间用boundary分隔,最后以
--{boundary}--结束,注意换行符必须使用\r\n才能符合HTTP协议规范。 - 头信息优化:像
UserAgent、Accept、Referer这类有对应属性的请求头,优先使用属性赋值而非Headers.Add,更符合.NET的API设计逻辑。 - 错误处理:添加了
WebException捕获逻辑,方便排查请求失败时的具体错误响应内容,帮助定位问题。
内容的提问来源于stack exchange,提问作者fass33443423
相关产品推荐
相关产品推荐

