如何找到网站的API进行解析?
我开始研究Web-Scraping方法,在接收Json格式的文件时遇到了400、401、403错误等问题。
例如,我访问了 Magnit 网站,目标是在程序退出时收到产品卡。( https://magnit.ru/promo/ )
正如您在所附的屏幕截图中看到的,我需要的数据已正确显示,并且在输出中我以 Json 格式获取它。但是,如果我想在另一个窗口中打开该文件,我会得到这张图片:
它甚至没有触及Headrs
我所坐的WebDriver
东西Silenium
。我只是用普通浏览器访问那里,无法访问这本词典。
所以我想知道问题是什么以及如何解决?或者是防火墙的问题,它过滤了请求并只允许管理员访问此 API?(但是我如何在主页上访问此文件并获取所有这些卡作为响应?)也许有一些库Python 以便您可以以某种方式上传此文件?
是的,当然有拐杖,我怎样才能通过 再次解决这个问题Selenium
,只需加载整个页面并通过page_source
,结果收到一个可以轻松解析并获取这些卡片的 HTML 文件,但我不喜欢这种方法所有,因为一切都取决于与网站本身的稳定连接,这并不总是可能的,并且代码的工作时间更长(由于负载,相似之处可能存在例外,因此我将不得不等待很TimeoutExeption
长时间当它加载所有页面并将它们全部保存到我需要的目录中时,会生成一个新页面)。
我在做一个任务,上面写着通过API key实现认证,就是在项目中存一个reference key,每次请求的header中接受这个参数,如果匹配,则处理请求,如果不匹配,则返回401 Unathorized
。
我不明白-身份验证与它有什么关系?鉴权毕竟是为了识别用户,如果密钥相同,那还算什么身份。
这更像是权限 ( ),如果 API 密钥错误,permission
则返回更有意义。403 Foribdden
请帮助我理解这一刻。
有一个网站可以为各种情况添加卡片(笔记本):
var addButton = document.getElementById("add-task-submit");
var taskList = document.getElementById("task-list")
//класс инфы о задаче//
class Task {
constructor(name, description, priority, deadline) {
this.name = name;
this.description = description;
this.priority = priority;
this.deadline = deadline;
}
}
//класс который создает один из 4 "компонентов" задачи//
class TaskComponent {
constructor(innertext, style, type) {
this.innertext = innertext;
this.style = style;
this.type = type;
this.component = document.createElement(this.type);
this.component.classList.add(this.style);
this.component.appendChild(document.createTextNode(this.innertext));
taskCard.appendChild(this.component);
}
}
//функция для кнопки "выполнено"//
function taskDone(event) {
this.button = event.target;
let taskCard = this.button.parentElement;
let taskList = taskCard.parentElement;
taskList.removeChild(taskCard);
}
//ивент на создачу задачи//
addButton.addEventListener('click', function(event) {
let task = new Task(
`${document.getElementById("add-task-name").value}`,
`${document.getElementById("add-task-description").value}`,
`${document.getElementById("add-task-priority").value}`,
`${document.getElementById("add-task-deadline").value}`,
)
console.log(task)
//создание самой карточки//
taskCard = document.createElement("div");
taskCard.classList.add("task-card");
//создание каждого элемента в карточке//
taskName = new TaskComponent(task.name, "task-name", "h2");
console.log(taskName);
taskDescription = new TaskComponent(task.description, "task-description", "div");
console.log(taskDescription);
taskPriority = new TaskComponent(`Приоритет: ` + task.priority, "task-priority", "div");
console.log(taskPriority);
taskDeadline = new TaskComponent(`Выполнить до: ` + task.deadline, "task-deadline", "div");
console.log(taskDeadline);
doneButton = document.createElement("button");
doneButton.classList.add("task-done");
doneButton.appendChild(document.createTextNode('Выполнить'));
taskCard.appendChild(doneButton);
doneButton.addEventListener('click', taskDone);
taskList.insertBefore(taskCard, taskList.childNodes[0]);
event.preventDefault();
})
<header>
<div class="header-content">
<h1>Динамическое добавление компонентов</h1>
</div>
</header>
<main>
<form id="add-task-form">
<h1>Новая задача</h1>
<div class="input-wrapper">
<label for="add-task-name">Задача</label>
<input type="text" id="add-task-name" pattern="^.+$" required>
</div>
<div class="input-wrapper">
<label for="add-task-description">Описание</label>
<input type="text" id="add-task-description">
</div>
<div class="input-wrapper">
<label for="add-task-priority">Приоритет</label>
<select id="add-task-priority">
<option value="Очень Высокий">Очень Высокий</option>
<option value="Высокий">Высокий</option>
<option value="Средний" selected>Средний</option>
<option value="Низкий">Низкий</option>
<option value="Очень Низкий">Очень Низкий</option>
</select>
</div>
<div class="input-wrapper">
<label for="add-task-deadline">Дедлайн</label>
<input type="datetime-local" id="add-task-deadline">
</div>
<div class="input-wrapper">
<input type="submit" value="Добавить" id="add-task-submit">
</div>
</form>
</main>
<div id="task-list">
</div>
但是,用户可能会也可能不会把taskDescription
/taskDeadline
放在任务上。因此,在截止日期和描述的输入字段为空的情况下,不必在此类任务的卡片中创建元素,问题是:如何理解站点用户将这些字段留空而不创建div为他们?目前,如果这些字段没有填写,它仍然会创建一个带有“运行直到: ”字样的 div
错误的选项
它应该是