Проблемы с запросом и приветствие при просмотре веб-страниц - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь написать код, который отправляет запрос на веб-сайт, для webscraping

Итак, это шаги:

Здесь Первая часть кода НАЧИНАЕТСЯ

  1. Программа делает запрос на mainURL
  2. Программа выбирает некоторые объекты из html mainURL и сохраняет их в массиве объектов (реклама), в свойствах объекта, это его ссылка, которую мы будем называть numberURL , код автоматически выбирается с помощью селектора css, количество объектов примерно равно 80-90;
  3. Программа делает запросы на каждый номерURL (80-90 запросов), и для каждого из них он устанавливает другие свойства для того же объекта и выбирает другую ссылку, которую мы будем называть accountURL
  4. Программа создает файл CSV, в который записывает каждый объект в разные строки

Здесь Первая часть кода ENDS

Так что на самом деле первая часть работает довольно хорошо, у нее нет проблем, но вторая часть делает

Здесь начинается вторая часть кода

  1. Программа делает запросы к каждому accountURL от предыдущего объекта
  2. Программа выбирает некоторые объекты из html accountURL и сохраняет их в другом массиве других объектов (account), также используя селекторы CSS
  3. Программа должна console.log () всех учетных записей объектов

Здесь Вторая часть кода ENDS

Но во второй части есть некоторые ошибки, потому что при console.logging объектов мы видим, что свойства объектов не меняют своих значений по умолчанию.

Итак, в целях отладки я взял один рекламный объект и поместил его значение вручную из кода

post[0].link = 'https://999.md/ru/profile/denisserj'

Наконец, при запуске кода для этого объекта он фактически работает правильно, поэтому он показывает измененные свойства, но для остальных из них это не так.

Я попытался установить несколько тайм-аутов, думая, что код пытается прочитать ссылку, до того, как второй запрос завершится, но без последствий

Я также попытался утешить ссылку на журнал, чтобы увидеть, существует ли она в массиве, поэтому она действительно существует, но также не оказывает никакого влияния.

Наконец, вот код:

// CLASSES
class advert {
    constructor() {
        this.id = 0;
        this.tile = new String();
        this.link = new String();
        this.phone = new String();
        this.account = new String();
        this.accountLink = new String();
        this.text = new String();
        this.operator = new String();
    }
    show() {
        console.log(this.id, this.title, this.link, this.phone, this.account, this.accountLink, this.text, this.operator);
    }

}
class account {
    constructor() {
        this.name = 0;
        this.createdAt = 0;
        this.phone = [];
        this.ads = [];
        this.adsNumber = 0;
    }
    show() {
        console.log(this.name, this.createdAt, this.phone, this.ads, this.adsNumber);
    }
}

// HEADERS
const mainRequest = require('request');
const auxRequest = require('request');
const cheerio1 = require('cheerio');
const cheerio2 = require('cheerio');
const fs = require('fs');
const fs2 = require('fs');
const adFile = fs.createWriteStream('anunturi.csv');
const accFile = fs2.createWriteStream('conturi.csv');

// SETTINGS
const host = 'https://999.md'
const category = 'https://999.md/ru/list/transport/cars'
const timeLimit = 60; //seconds

// VARIABLES
let post = [];
let postNumber = 0;
let acc = [];

// FUNCTIONS
function deleteFromArray(j) {
    post.splice(j, 1);
}

function number(i) {
    let category = post[i].link;
    auxRequest(category, (error, response, html) => {
        if (!error && response.statusCode == 200) {
            const $ = cheerio1.load(html);
            let phone;
            const siteTitle = $('strong').each((id, el) => {
                phone = $(el).text();
            });
            const txt = $('.adPage__content__description').html();
            const person = $('.adPage__header__stats').find('.adPage__header__stats__owner').text();
            const linkToPerson = host + $('.adPage__header__stats').find('.adPage__header__stats__owner').find('a').attr('href');
            post[i].phone = phone;
            post[i].account = person;
            post[i].accountLink = linkToPerson;
            post[i].text = txt;
            if (i == postNumber) {
                console.log('1. Number Putting done')
                writeToFileAd(accountPutter, writeToFileAccount);
            }
        }

    });
}

function writeToFileAd() {
    adFile.write('ID, Titlu, Link, Text, Cont, LinkCont, Operator\n')
    for (let i = 0; i <= postNumber; i++) {
        adFile.write(`${post[i].id}, ${post[i].title}, ${post[i].link}, ${post[i].phone}, ${post[i].account}, ${post[i].accountLink}, ${post[i].operator}\n`);
    }
    console.log('2. Write To File Ad done')
    accountPutter();
}

function accountAnalyzis(i) {
    let category = post[i].link;
    const mainRequest = require('request');
    category = category.replace('/ru/', '/ro/');
    mainRequest(category, (error, response, html) => {

        if (!error && response.statusCode == 200) {
            const $ = cheerio2.load(html);
            const name = $('.user-profile__sidebar-info__main-wrapper').find('.login-wrapper').text();
            let createdAt = $('.date-registration').text();
            createdAt = createdAt.replace('Pe site din ', '');
            const phones = $('.user-profile__info__data').find('dd').each((id, el) => {
                let phone = $(el).text();
                acc[i].phone.push(phone);
            });
            const ads = $('.profile-ads-list-photo-item-title').find('a').each((id, el) => {
                let ad = host + $(el).attr('href');
                acc[i].ads.push(ad);
                acc[i].adsNumber++;
            });
            acc[i].name = name;
            acc[i].createdAt = createdAt;
            console.log(name)
            if (i == postNumber) {
                console.log('3. Account Putting done')
                writeToFileAccount();
            }
        }
    });
}

function writeToFileAccount() {
    for (let i = 0; i <= postNumber; i++) {
        accFile.write(`${acc[i].name}, ${acc[i].createdAt}, ${acc[i].phone}, ${acc[i].ads}, ${acc[i].adsNumber}\n`);
    }
    console.log('4. Write to file Account done');
}

function numberPutter() {
    for (let i = 0; i <= postNumber; i++) {
        number(i);
    }
}

function accountPutter() {
    for (let i = 0; i <= postNumber; i++) {
        accountAnalyzis(i);
    }
}

// MAIN
mainRequest(category, (error, response, html) => {
    let links = [];
    for (let i = 0; i < 1000; i++) {
        post[i] = new advert();
    }
    for (let i = 0; i < 1000; i++) {
        acc[i] = new account();
    }
    if (!error && response.statusCode == 200) {
        const $ = cheerio2.load(html);
        const siteTitle = $('.ads-list-photo-item-title').each((id, el) => {
            const ref = host + $(el).children().attr('href');
            const title = $(el).text();
            post[id].id = id + 1;
            post[id].title = title;
            post[id].link = ref;
            links[id] = ref;
            postNumber = id;
        });
        post[0].link = 'https://999.md/ru/profile/denisserj'
        numberPutter()
    }

});

1 Ответ

0 голосов
/ 05 июня 2019

У вас ошибка в строке

const siteTitle = $('.ads-list-photo-item-title').each((id, el) => {

То, что вы на самом деле хотите, это .find('a').each...

...