c#抓取网页数据(第一次用C#写数据抓取,遇到各种问题怎么办?)
优采云 发布时间: 2022-03-02 17:12c#抓取网页数据(第一次用C#写数据抓取,遇到各种问题怎么办?)
第一次用C#写数据采集,遇到各种问题。开始写模拟登录的时候,发现有验证码。我必须突破验证码才能得到它。好吧,那我去找破解验证码的代码。我尝试了很多代码,发现它们并不通用。后来,我明白了其中的原理。首先去除噪点、干扰线等,然后将颜色验证码转换成黑白,同时进行字体切割。,如果字体是粘的,对于我们初学者(外行),那就放弃吧。裁剪后,每个像素都编码,白0,黑1,好像是这样的,不是太懂,再看一遍,拿字体库模型里的字做对比。如果达到百分比或更多,它会识别验证码是什么,并一一进行比较。最后形成一个完整的验证码。无法完成验证码破解,所以放弃破解,另寻方法。
网上说验证码可能会保存在cookie中。嗯,抱着试试的态度去吧,模拟浏览器发送数据,请求验证码,FF调试,发现cookie中有验证码。就这样,验证码到此结束,我们重新登录。
要登录,首先跟踪目标页面的逻辑,看看它是如何传递参数成功登录的。我只是先发送一个请求对用户名和密码进行加密,然后将加密后的发送到后台进行登录。这没什么好说的。这期间遇到的问题是发送请求,半天不成功。原因是当时发送了一个ajax请求,需要设置调用哪个方法。网站 一般直接要求后台,而不是发出ajax请求,所以这里又是一团糟。
关键代码:
request.Headers.Add("X-AjaxPro-Method", "方法名");
登录成功后,就到了抓取页面的时间了。首先获取抓取页面的html,然后分析它如何提交数据,如何返回,传递了什么参数等等。爬取页面没有问题,然后是模拟查询数据,那个网站写的,隐藏字段控件很多,所以发送请求的时候参数很多,不知道它是干什么用的,反正我觉得只查询订单号是有用的。模拟发送很长时间后,报500错误。这是因为模拟参数有问题,服务器无法读取。我已经完成了所有设置。我发现它没有任何问题。2天后,它卡在这里。没有办法。之后,无意中发现提交的数据和页面隐藏字段的数据有点不一样。输入特殊字符。转码后想了想之前写的代码传输参数,发现传输数据的时候,都需要通过UrlEncode转码,然后传输。虽然隐藏字段的值是控件自动生成的,但是传输应该还是需要转码的,想到这里,二话不说就开始转码参数了
HttpUtility.UrlEncode(string);
居然成功了,太烧脑了,虽然对于一些老手来说,这些可能不知道,但第一次接触还是很难写。
对了,还有一个问题,就是读取html后获取字符串html中的参数的问题,当然在页面上很容易获取,但是现在都是一堆字符串,这真的很难,所以我找到了一个非常好用的dll,支持xpath,和xmlDocument一样的用法,
部分代码:
HtmlDocument htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml(html.Replace("\r", "").Replace("\n", ""));
HtmlNodeCollection collection = htmlDocument.DocumentNode.SelectSingleNode("/html/body/div").ChildNodes;
foreach (HtmlNode htmlNode in collection)
{
var tempId = htmlNode.Attributes["id"].Value;
}
红色部分是xpath规则,
也可以根据属性获取对应的节点:
htmlDocument.DocumentNode.SelectSingleNode("/html/body/div[2]/input[@id='__EVENTVALIDATION']");
这是:HtmlAgilityPack 下载地址:点击打开链接
最好阅读此 网站 评论。里面有很多人的问题,说不定能帮上忙。
好了,写了这么多,接下来我整理一下代码发上来,然后开始循环爬取数据。