c#抓取网页数据(第一次用C#写数据抓取,遇到各种问题怎么办?)

优采云 发布时间: 2022-02-19 22:22

  c#抓取网页数据(第一次用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 下载地址:点击打开链接

  最好阅读此 网站 评论。里面有很多人的问题,说不定能帮上忙。

  好了,写了这么多,接下来我整理一下代码发上来,然后开始循环爬取数据。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线