使用 Anglesharp 的解析器。
如何解析具有授权的网站?
我正在尝试编写解析器。
如果我正确理解了理论,那么逻辑应该如下:
- 授权;
- 获取饼干;
页面导航
- 发送 cookie;
- 转到第 1 页;
- 发送 cookie;
- 转到第 2 页;
授权书
<form name="login" class="ui large form" action="/login/" method="POST">
<div class="required field ui grid aligned left"><input name="login[login]" value="" type="text" placeholder="Электронная почта" maxlength="64" autocomplete="off"></div>
<div class="required field ui grid aligned left">
<input name="login[password]" value="" type="password" maxlength="32" autocomplete="off" placeholder="Пароль">
</div>
<div class="equal width fields" style="flex-wrap:nowrap;">
<div class="field" style="text-align: left;">
<div class="ui checkbox large step">
<input id="remember" type="checkbox" name="login[remember]" tabindex="0" value="1" class="hidden">
<label for="remember">Запомнить меня</label>
</div>
</div>
<div class="field" style="text-align: right;">
<a href="/forgot/">Забыли пароль?</a>
</div>
</div>
<div class="field">
<button class="fluid positive ui button big">Войти</button>
</div>
<input name="login[type]" type="hidden"><input name="login[init]" type="hidden" value="">
</form>
最低代码
public async void Authorization(string pathPageLogin, string userName, string password)
{
IConfiguration config = Configuration.Default.WithDefaultLoader().WithCookies();
IBrowsingContext browsingContext = BrowsingContext.New(config);
browsingContext.OpenAsync(pathPageLogin).Wait();
(browsingContext.Active.QuerySelector("input[name = 'login[login]']") as IHtmlInputElement).Value = userName;
(browsingContext.Active.QuerySelector("input[name = 'login[password]']") as IHtmlInputElement).Value = password;
(browsingContext.Active.QuerySelector("form") as IHtmlFormElement).SubmitAsync().Wait();
}
public async void Parsing(string url, string pathFileHtml)
{
HttpClient client = new HttpClient();
var response = await client.GetAsync(url); // скачиваем страницу
string source = await response.Content.ReadAsStringAsync(); // Переносим в переменную
#region Сохранить страницу в файл
File.WriteAllText(pathFileHtml, source);
#endregion Сохранить страницу в файл
#region Парсер
// HTML парсер, который доступен из "AngleSharp".
var domParser = new HtmlParser();
// Спарсим асинхронно наш исходный код и получим документ с которым мы можем работать
var document = await domParser.ParseAsync(source);
// *** Парсер ****
// результат
var list = new List<string>();
var items = document.QuerySelectorAll("a").Where(item =>
item.ClassName != null && item.ClassName.Contains("post__title_link"));
foreach (var item in items)
{
list.Add(item.TextContent);
}
#endregion
}
问题。
1.我理解的逻辑正确吗?
2. 如何用最少的一组简单站点的基本方法来编写代码,以便看到逻辑原理?
加法
例如使用:rabota.by/login/
附加
登录 - test9631@yandex.by
密码 - Ym3LDp1FPs
添加
我们分析。
第一步是分析网站并了解其运作方式。我个人会使用Fiddler来捕获请求,你可以在适合你的地方做......
因此,我们进入授权页面,打开请求捕获,登录并查看请求。
他们通常看起来很突出,然后转到查看页面
/login或类似的东西。在网站上授权后,我收到了以下请求:
让我们看一下查询本身:
POST在 address有它/login/。Content-Type: application/x-www-form-urlencoded。User-Agent有的也可能派上用场Cookie。由于我们有一个带有 Web 表单数据的请求,因此还值得查看它的主体:
这里的一切都很清楚——我们的登录名、密码、记住与否、按钮的名称和登录名中的未知参数。让我们通过再次授权来检查这个未知参数。如果它发生变化,那么值得寻找它是如何形成的,如果没有,那么你可以使用它。就我而言,它是静态的。
好吧,还值得看看服务器本身的响应,它提供了什么以及它安装了什么:
可以看出,作为响应,服务器给了我们通常的 html 并设置了一对 Cookie。暂时看响应体是没有意义的。
我们正在尝试自己发送请求。
Postman非常适合这个目的。安装、跳过授权(或不跳过)并创建一个新请求。
https://rabota.by/loginx-www-form-urlencoded现在让我们清理请求:
*0=*0.login[login],login[password]并且足够login[type]。Content-Type和影响Referer。