使用 HtmlAgilityPack c# 从网页中抓取数据
Scrape data from web page with HtmlAgilityPack c#
我在从网页抓取数据时遇到问题,我得到了解决方案
我的问题是他们更改了现在 https://webportal.thpa.gr/ctreport/container/track 的网页,我认为它没有使用 iFrame,我无法取回任何数据。
谁能告诉我是否可以使用相同的方法从此网页获取数据,还是应该使用不同的方法?
我不知道@coder_b 是如何发现我应该使用 https://portal.thpa.gr/fnet5/track/index.php 作为网页并且我应该使用
var reqUrlContent =
hc.PostAsync(url,
new StringContent($"d=1&containerCode={reference}&go=1", Encoding.UTF8,
"application/x-www-form-urlencoded"))
.Result;
传递变量
编辑:当我查看网页时,有一个包含数字的输入
input type="text" id="report_container_containerno"
name="report_container[containerno]" required="required"
class="form-control" minlength="11" maxlength="11" placeholder="E/K
για αναζήτηση" value="ARKU2215462"
Can I use something to pass with HtmlAgilityPack and then it should be easy to read the result
此外,当我检查 DocumentNode 时,它似乎向我显示了我应该同意的 cookies 页面。
我可以绕过或自动允许 cookie 吗?
试试这个:
public static string Download(string search)
{
var request = (HttpWebRequest)WebRequest.Create("https://webportal.thpa.gr/ctreport/container/track");
var postData = string.Format("report_container%5Bcontainerno%5D={0}&report_container%5Bsearch%5D=", search);
var data = Encoding.ASCII.GetBytes(postData);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
using (var stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
using (var response = (HttpWebResponse)request.GetResponse())
using (var stream = new StreamReader(response.GetResponseStream()))
{
return stream.ReadToEnd();
}
}
用法:
var html = Download("ARKU2215462");
更新
要找到要使用的 post 参数,请在浏览器中按 F12 以显示开发工具,然后选择 select 网络选项卡。现在,用您的 ARKU2215462 填写搜索输入并按下按钮。
即向服务器发出请求以获得响应。在该请求中,您可以检查请求和响应。有很多请求(样式、脚本、iamges...),但您想要 html 页面。在这种情况下,看这个:
这是请求的表单数据。如果你点击“查看源代码”,你会得到编码为“report_container%5Bcontainerno%5D=ARKU2215462&report_container%5Bsearch%5D=”的数据,正如你在代码中所需要的。
我在从网页抓取数据时遇到问题,我得到了解决方案
我的问题是他们更改了现在 https://webportal.thpa.gr/ctreport/container/track 的网页,我认为它没有使用 iFrame,我无法取回任何数据。
谁能告诉我是否可以使用相同的方法从此网页获取数据,还是应该使用不同的方法?
我不知道@coder_b 是如何发现我应该使用 https://portal.thpa.gr/fnet5/track/index.php 作为网页并且我应该使用
var reqUrlContent =
hc.PostAsync(url,
new StringContent($"d=1&containerCode={reference}&go=1", Encoding.UTF8,
"application/x-www-form-urlencoded"))
.Result;
传递变量
编辑:当我查看网页时,有一个包含数字的输入
input type="text" id="report_container_containerno" name="report_container[containerno]" required="required" class="form-control" minlength="11" maxlength="11" placeholder="E/K για αναζήτηση" value="ARKU2215462" Can I use something to pass with HtmlAgilityPack and then it should be easy to read the result
此外,当我检查 DocumentNode 时,它似乎向我显示了我应该同意的 cookies 页面。 我可以绕过或自动允许 cookie 吗?
试试这个:
public static string Download(string search)
{
var request = (HttpWebRequest)WebRequest.Create("https://webportal.thpa.gr/ctreport/container/track");
var postData = string.Format("report_container%5Bcontainerno%5D={0}&report_container%5Bsearch%5D=", search);
var data = Encoding.ASCII.GetBytes(postData);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
using (var stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
using (var response = (HttpWebResponse)request.GetResponse())
using (var stream = new StreamReader(response.GetResponseStream()))
{
return stream.ReadToEnd();
}
}
用法:
var html = Download("ARKU2215462");
更新
要找到要使用的 post 参数,请在浏览器中按 F12 以显示开发工具,然后选择 select 网络选项卡。现在,用您的 ARKU2215462 填写搜索输入并按下按钮。
即向服务器发出请求以获得响应。在该请求中,您可以检查请求和响应。有很多请求(样式、脚本、iamges...),但您想要 html 页面。在这种情况下,看这个:
这是请求的表单数据。如果你点击“查看源代码”,你会得到编码为“report_container%5Bcontainerno%5D=ARKU2215462&report_container%5Bsearch%5D=”的数据,正如你在代码中所需要的。