如何在不分页的情况下刮下一页

时间:2018-08-12 21:34:54

标签: javascript jquery web-scraping pagination

此链接“ 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来进入下一页的事实,最简单的方法是刮除所有这些项目?

2 个答案:

答案 0 :(得分:1)

在浏览器(我使用Chrome)中打开网页https://www.muscleandstrength.com/store/promos.html。按 F12 打开开发人员工具。转到网络选项卡。在这里您可以看到所有记录的请求。如果单击网页上的“查看下20个产品”,则新的一个请求将被记录。过滤XHR请求。检索您可以在标题中找到的所有产品的必要数据,它对我的​​要求如下:

request

要检索所有产品,只需在过滤器中将总量设置为"limit",将参数0设置为"offset",则重播相同的XHR并解析响应。在“预览”中,您可以发现响应实际上是JSON,并且要解析的HTML内容位于content属性中:

response

这里是显示如何完成此操作的示例。转到控制台选项卡。复制以下代码,将其粘贴到控制台中,然后按 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();
})();

请求是同步的,因此您需要等待一段时间才能完成。最后将所有产品解析到表中,对我的输出如下:

output

答案 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);

}