Node.js, Tor, Dalang dan Cheerio: pengikisan web anonim

Pengikisan web adalah metode pengumpulan data dari situs web. Istilah ini biasanya digunakan dalam kaitannya dengan pengumpulan data otomatis. Hari ini kita akan berbicara tentang cara mengumpulkan data dari situs secara anonim. Alasan mengapa seseorang mungkin menginginkan anonimitas dalam pengikisan web adalah karena banyak server web menerapkan aturan tertentu untuk koneksi dari alamat IP, yang darinya sejumlah permintaan dibuat selama periode waktu tertentu. Di sini kita akan menggunakan alat-alat berikut:

  • Dalang - untuk mengakses halaman web.
  • Cheerio - untuk parsing kode HTML.
  • Tor - untuk mengeksekusi setiap permintaan dari alamat IP yang berbeda.

Perlu dicatat bahwa aspek hukum pengikisan web adalah masalah yang kompleks dan seringkali tidak jelas. Karenanya, hormati " Ketentuan Penggunaan " dari halaman-halaman yang datanya Anda kumpulkan. Berikut adalah beberapa materi bagus tentang topik ini.



Instalasi Tor


Mari kita mulai dari awal - karena itu, pertama-tama, instal klien Tor menggunakan perintah berikut:

sudo apt-get install tor

Pengaturan Tor


Sekarang konfigurasikan klien Tor. Konfigurasi default Tor menggunakan port SOCKS , yang memberi kita satu jalur ke satu simpul keluaran (yaitu, satu alamat IP). Untuk penggunaan Tor sehari-hari, seperti hanya menjelajahi web, ini sangat cocok. Tetapi kami membutuhkan beberapa alamat IP. Ini akan memungkinkan Anda untuk beralih di antara mereka selama proses pengikisan web.

Untuk mengkonfigurasi Tor sesuai kebutuhan, kami cukup membuka port tambahan untuk mendengarkan koneksi SOCKS. Ini dilakukan dengan menambahkan beberapa entri SocksPortke file konfigurasi utama program, yang dapat ditemukan di /etc/tor.

Buka file /etc/tor/torrcmenggunakan beberapa editor teks dan tambahkan entri berikut ke akhir file:

#  4 SOCKS-,       Tor-.

SocksPort 9050
SocksPort 9052
SocksPort 9053
SocksPort 9054

Di sini perlu diperhatikan hal-hal berikut:

  • SocksPort . — , , SOCKS, .
  • SocksPort , , , - .
  • 9050 — , Tor- .
  • 9051. Tor , , , Tor.
  • 9051, , 1.

Untuk menerapkan perubahan yang dilakukan pada file konfigurasi, mulai ulang klien Tor:

sudo /etc/init.d/tor restart

Membuat proyek Node.js baru


Buat direktori baru untuk proyek tersebut. Mari kita panggil dia superWebScraping:

mkdir superWebScraping

Mari kita pergi ke direktori ini dan menginisialisasi proyek Node kosong:

cd superWebScraping && npm init -y

Atur dependensi yang diperlukan:

npm i --save puppeteer cheerio

Bekerja dengan situs web menggunakan Puppeteer


Puppeteer adalah browser tanpa antarmuka pengguna yang menggunakan protokol DevTools untuk berinteraksi dengan Chrome atau Chromium . Alasan kami tidak menggunakan perpustakaan di sini untuk bekerja dengan permintaan, seperti permintaan , adalah karena perpustakaan seperti itu tidak akan dapat memproses situs yang dibuat sebagai aplikasi web satu halaman yang isinya dimuat secara dinamis.

Buat file index.jsdan masukkan kode berikut ke dalamnya. Fitur utama dari kode ini dijelaskan dalam komentar.

/**
 *   puppeteer.
 */
const puppeteer = require('puppeteer');

/**
 *   main  , 
 *     -.
 * ,      ,
 *   ,     
 *  puppeteer.
 */
async function main() {
  /**
   *  Chromium.   `headless`   false,
   *     .
   */
  const browser = await puppeteer.launch({
    headless: false
  });

  /**
   *   .
   */
  const page = await browser.newPage();

  /**
   *   ,   https://api.ipify.org.
   */
  await page.goto('https://api.ipify.org');

  /**
   *  3     .
   */
  setTimeout(() => {
    browser.close();
  }, 3000);
}

/**
 *  ,  main().
 */
main();

Jalankan skrip dengan perintah berikut:

node index.js

Setelah itu, jendela browser Chromium akan muncul di layar, di mana alamatnya terbuka https://api.ipify.org.


Jendela browser, koneksi Tor tidak digunakan.

Saya membukanya di jendela browser justruhttps://api.ipify.orgkarena halaman ini dapat menunjukkan alamat IP publik dari mana itu diakses. Ini adalah alamat yang terlihat oleh situs yang saya kunjungi jika saya mengunjunginya tanpa menggunakan Tor.

Ubah kode di atas dengan menambahkan kunci berikut ke objek dengan parameter yang dilewatipuppeteer.launch:

  /**
   *  Chromium.   `headless`  false,
   *     .
   */
  const browser = await puppeteer.launch({
  headless: false,
  
  //   .
  args: ['--proxy-server=socks5://127.0.0.1:9050']
});

Kami menyampaikan argumen ke browser --proxy-server. Nilai argumen ini memberi tahu browser bahwa ia harus menggunakan server proxy socks5 yang berjalan di komputer kami dan dapat diakses di port 9050. Nomor port adalah salah satu nomor yang sebelumnya kita masukkan ke dalam file torrc.

Jalankan kembali skrip:

node index.js

Kali ini, di halaman yang terbuka, Anda dapat melihat alamat IP yang berbeda. Ini adalah alamat yang digunakan untuk melihat situs melalui jaringan Tor.


Jendela browser, koneksi Tor digunakan.

Dalam kasus saya, alamat muncul di jendela ini144.217.7.33. Anda mungkin memiliki beberapa alamat lain. Harap perhatikan bahwa jika Anda menjalankan skrip lagi dan menggunakan nomor port yang sama (9050), Anda akan menerima alamat IP yang sama dengan yang Anda terima sebelumnya.


Diluncurkan kembali jendela browser, koneksi Tor digunakan.

Itulah sebabnya dalam pengaturan Tor kami membuka beberapa port. Coba sambungkan browser Anda ke port lain. Ini akan mengubah alamat IP.

Pengumpulan data dengan Cheerio


Sekarang kami memiliki mekanisme yang nyaman untuk memuat halaman, sekarang saatnya melakukan pengikisan web. Untuk ini, kita akan menggunakan perpustakaan cheerio . Ini adalah parser HTML yang API-nya dibangun dengan cara yang sama dengan API jQuery . Tujuan kami adalah untuk mendapatkan 5 posting terbaru dari halaman Berita Hacker.

Pergi ke situs web Hacker News .


Situs web Hacker News

Kami ingin mengambil 5 berita utama baru dari halaman terbuka (sekarang HAKMEM (1972), Larry Roberts telah meninggal, dan lainnya). Meneliti judul artikel menggunakan alat pengembang browser, saya perhatikan bahwa setiap judul ditempatkan dalam elemen HTML<a>dengan kelasstorylink.


Mempelajari struktur dokumen

Untuk mengekstraksi apa yang kita butuhkan dari kode HTML halaman, kita perlu melakukan urutan tindakan berikut:

  • Memulai instance browser baru tanpa antarmuka pengguna yang terhubung ke proxy Tor.
  • Buat halaman baru.
  • Pergi ke alamat https://news.ycombinator.com/.
  • Mengambil konten HTML halaman.
  • Memuat konten HTML halaman ke dalam cheerio.
  • Membuat array untuk menyimpan judul artikel.
  • Mengakses elemen dengan kelas storylink.
  • Mendapatkan 5 elemen pertama menggunakan metode cheerio slice () .
  • Melintasi elemen yang dihasilkan menggunakan metode cheerio Each () .
  • Tulis setiap tajuk yang ditemukan pada sebuah larik.

Berikut adalah kode yang mengimplementasikan tindakan ini:

const puppeteer = require('puppeteer');

/**
 *   cheerio.
 */
const cheerio = require('cheerio');

async function main() {
  const browser = await puppeteer.launch({
    /**
     *       (   ).
     */
    headless: true,
    args: ['--proxy-server=socks5://127.0.0.1:9050']
  });

  const page = await browser.newPage();

  await page.goto('https://news.ycombinator.com/');

  /**
   *      HTML-.
   */
  const content = await page.content();

  /**
   *    cheerio.
   */
  const $ = cheerio.load(content);


  /**
   *      .
   */
  const titles = [];

  /**
   *   ,   `storylink`.
   *  slice()      5   .
   *      each().
   */
  $('.storylink').slice(0, 5).each((idx, elem) => {
    /**
     *   HTML-,   .
     */
    const title = $(elem).text();
  
    /**
     *    .
     */
    titles.push(title);
  })

  browser.close();
  
  /**
   *     .
   */
  console.log(titles);
}

main();

Inilah yang terjadi setelah menjalankan skrip ini.


5 Berita Header Peretas Pertama Berhasil diekstraksi dari Halaman Code

Pengikisan berkelanjutan menggunakan berbagai alamat IP


Sekarang mari kita bicara tentang cara menggunakan berbagai port SOCKS yang kita tentukan dalam file torrc. Ini sangat sederhana. Kami akan mendeklarasikan sebuah array, yang masing-masing akan berisi nomor port. Kemudian, ubah nama fungsi main()menjadi fungsi scrape()dan nyatakan fungsi baru main()yang akan memanggil fungsi tersebut scrape(), dengan memberinya nomor port baru pada setiap panggilan.

Ini kode yang sudah jadi:

const puppeteer = require('puppeteer');
const cheerio = require('cheerio');

async function scrape(port) {
  const browser = await puppeteer.launch({
    args: ['--proxy-server=socks5://127.0.0.1:' + port]
  });

  const page = await browser.newPage();
  await page.goto('https://news.ycombinator.com/');
  const content = await page.content();

  const $ = cheerio.load(content);

  const titles = [];

  $('.storylink').slice(0, 5).each((idx, elem) => {
    const title = $(elem).text();
    titles.push(title);
  });

  browser.close();
  return titles;
}

async function main() {
  /**
   *  SOCKS- Tor,    torrc. 
   */
  const ports = [
    '9050',
    '9052',
    '9053',
    '9054'
  ];
  
  /**
   *  -...
   */
  while (true) {
    for (const port of ports) {
      /**
       * ...  -    .
       */
      console.log(await scrape(port));
    }
  }
}

main();

Ringkasan


Sekarang Anda memiliki alat yang Anda inginkan yang memungkinkan Anda melakukan pengikisan web anonim.

Pembaca yang budiman! Apakah Anda pernah melakukan pengikisan web? Jika demikian, beri tahu kami alat apa yang Anda gunakan untuk ini.

Source: https://habr.com/ru/post/undefined/


All Articles