此链接“ https://www.muscleandstrength.com/store/promos.html”会将您重定向到一个网站,该网站将向您显示所有600多种折扣商品的列表。我的目标是全部清除。但是我遇到的主要问题是它没有带有数字的常规分页(例如:prev 1、2、3、4、5 ... next)或我可以用来检索下一个的GET url页。我必须单击“查看另外20个产品”以显示下一批。我可以毫无问题地刮一个带有分页的网站,但是这个让我头疼。
下面的链接是每次单击下一个按钮时都会触发的主要JS
https://cdn.muscleandstrength.com/store/media/js/ec00de517e571209f780e1b62a3967fd-1534086933.js
在其中您会找到这样的一行:
X = np.array([[1, 2, 4],[2, 3, 9]]).T
print(X)
y = np.array([1, 4, 16])
X_poly = PolynomialFeatures(degree=2).fit_transform(X)
print(X_poly)
model = LinearRegression(fit_intercept = False)
model.fit(X_poly,y)
print('Coefficients: \n', model.coef_)
print('Others: \n', model.intercept_)
如果转到此链接“ www.muscleandstrength.com/store/promos/index/filter”,并一直向下滚动到底部,则会发现类似的内容。
e.post("www.muscleandstrength.com/store/promos/index/filter",{filter:JSON.stringify(t)}
我认为这是显示下一批物料的原因。
我的主要问题是,不管我没有常规分页或GET url来进入下一页的事实,最简单的方法是刮除所有这些项目?
答案 0 :(得分:1)
在浏览器(我使用Chrome)中打开网页https://www.muscleandstrength.com/store/promos.html。按 F12 打开开发人员工具。转到网络选项卡。在这里您可以看到所有记录的请求。如果单击网页上的“查看下20个产品”,则新的一个请求将被记录。过滤XHR请求。检索您可以在标题中找到的所有产品的必要数据,它对我的要求如下:
要检索所有产品,只需在过滤器中将总量设置为"limit"
,将参数0设置为"offset"
,则重播相同的XHR并解析响应。在“预览”中,您可以发现响应实际上是JSON,并且要解析的HTML内容位于content
属性中:
这里是显示如何完成此操作的示例。转到控制台选项卡。复制以下代码,将其粘贴到控制台中,然后按 Enter :
(function () {
// retrieve all products
var count = document.querySelector("span.search-result-available-count").innerText;
var x = new XMLHttpRequest;
x.open("POST","https://www.muscleandstrength.com/store/promos/index/filter",false);
x.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
x.send("filter=%7B%22order%22%3A%22sort_order+desc%2Csales_ranking+asc%22%2C%22brandfilter%22%3A%5B%5D%2C%22categoryfilter%22%3A%5B%5D%2C%22classfilter%22%3A%5B%5D%2C%22limit%22%3A"+count+"%2C%22offset%22%3A0%7D");
// replace body content with received data
document.body.innerHTML = JSON.parse(x.responseText).content;
// create table for output
var addCell = function(htmlContent) {
var cell = row.insertCell(-1);
cell.innerHTML = htmlContent;
};
var table = document.createElement("table");
document.body.appendChild(table);
table.style = 'margin:10px;'
// add table header and body
var tHead = table.createTHead();
var row = tHead.insertRow(-1);
["#","Product","Price","Rating","Reviews"].forEach(addCell);
var tBody = document.createElement("tbody");
table.appendChild(tBody);
// parse each product
var products = document.querySelectorAll("div.product-info");
for (var i = 0; i < products.length; i++) {
// add row
row = tBody.insertRow(-1);
addCell(i+1);
// parse name
var m = products[i].querySelector("a.product-name").innerText.trim();
addCell(m);
// parse price
var m = products[i].querySelector("div.price").innerText.trim();
addCell(m);
// parse rating
var m = products[i].querySelector("div.rating").style.width;
addCell(m);
// parse reviews
var m = products[i].querySelector("span.review-count").innerText.replace(/\D/g,"");
addCell(m);
}
// remove unnecessary content
document.querySelector("div.promo-products").remove();
})();
请求是同步的,因此您需要等待一段时间才能完成。最后将所有产品解析到表中,对我的输出如下:
答案 1 :(得分:0)
这是加载DOM的简单解决方案。 此循环功能将循环单击您的“查看更多”按钮,直到完成。您将需要一些条件来检查是否完成,然后运行刮板功能。
获取产品总数,删除前60个(已显示) 将其除以20(单击“查看更多”按钮时加载的产品数) 创建一个滚动到页面底部的函数,每次滚动都有2秒的超时时间。
var prodElm = document.getElementsByClassName("search-result-available-count")[0].innerText;
var products = parseInt(prodElm.replace(/\D+/g, ''));
var numScrollEventsNeeded = Math.round((products - 60) / 20);
function timedScroller(num) {
setTimeout(() => {
window.scrollTo(0, document.body.scrollHeight);
document.getElementsByClassName("view-more btn btn-blue")[0].click();
}, num);
}
for (i = 0; i < numScrollEventsNeeded; i++) {
timedScroller(i * 2000);
}