Rust의 다중 페이지 웹 스크레이퍼.

일부 사람들에 따르면 데이터는 새로운 금입니다. 어느 정도는 그들이 옳을 수도 있습니다. 데이터, 특히 대용량 데이터를 얻는 데 비용이 많이 들 수 있습니다. 이 기사에서는 Rust 프로그래밍 언어를 사용하여 다중 페이지 웹 스크레이퍼를 빌드하는 방법을 단계별로 보여줍니다.

여러 페이지가 있는 전자 상거래 웹 사이트에서 iPhone x의 가격을 얻고 싶다고 상상해 보십시오. 수동으로 달성할 수 있지만 시간이 많이 걸립니다. 목적에 맞는 코드를 작성하면 쉽게 만들 수 있습니다. 몇 초 만에 10페이지 이상을 스크랩할 수 있습니다.

cargo new multipage를 사용하여 새 프로젝트를 만듭니다. 다음 종속성이 필요합니다. 종속 항목 아래의 cargo.toml에 추가하십시오.

reqwest={version="0.11.9", features=["blocking"]}
select="0.5.0"
anyhow="1.0.56"`



Reqwest는 http 클라이언트이며 일부 데이터를 스크랩하려는 웹 페이지에 대한 http 호출을 만드는 데 유용합니다.

Select는 이 프로그램의 핵심입니다. HTML 웹 페이지를 스크랩하는 기능이 있는 멋진 크레이트입니다.

어쨌든 오류 처리에 크게 도움이 될 것입니다.

다이빙하자:
먼저 스크랩하려는 웹 페이지를 검사합니다. Chrome을 사용하는 경우 마우스 오른쪽 버튼을 클릭하고 검사 옵션을 선택합니다. 스크랩하려는 웹 페이지의 요소에 도달할 때까지 HTML 코드를 검사합니다. 이 웹 링크를 실습으로 사용했습니다.
"https://www.jumia.com.ng/catalog/?q=iphone&viewType=grid&page=1#catalog-listing "
웹사이트는 전자상거래 웹사이트입니다. 페이지를 조사한 후 카탈로그 목록에 대한 HTML 코드를 얻었습니다.

<a class="core" href="/castillo-castillo-de-liria-red-75cl-x1-81158848.html" data-id="CA254FF1EJDRYNAFAMZ" data-name="Castillo De Liria RED 75cl x1" data-price="3.85" data-brand="Castillo" data-category="Grocery/Beer, Wine &amp; Spirits/Wine/Red Wine" data-dimension23="" data-dimension26="18"
 data-dimension27="4.6" data-dimension28="1" data-dimension37="0" data-dimension43="CP_MT38|CP_MT72|CP_MT73|CP_MT76|CP_MT77|CP_MT78|CP_MT80|CP_MT81|CP_MT84|CP_MT92|Camp_45|Camp_70|Camp_72|FDY2020|FDYJE|Merch_148|Merch_150" data-dimension44="0" data-list=""
  data-position="1" data-track-onclick="eecProduct" data-track-onview="eecProduct" 
  data-track-onclick-bound="true"><div class="img-c"><img data-src="https://ng.jumia.is/unsafe/fit-in/300x300/filters:fill(white)/product/84/885118/1.jpg?0770" src="https://ng.jumia.is/unsafe/fit-in/300x300/filters:fill(white)/product/84/885118/1.jpg?0770"
   class="img" width="208" height="208" alt="">
   <img data-src="https://ng.jumia.is/badges/fdyje/10/138x18.png?4886" src="https://ng.jumia.is/badges/fdyje/10/138x18.png?4886" class="_ni camp" alt="FDYJE"></div>

   <div class="info"><h3 class="name">Castillo Castillo De Liria RED 75cl x1</h3>
   <div class="prc">₦ 1,725</div><div class="s-prc-w"><div class="old">₦ 1,898</div>
   <div class="tag _dsct _sm">9%</div></div>
   <div class="rev"><div class="stars _s">4.6 out of 5<div class="in" style="width:91.99999999999999%">
   </div></div>(18)</div><svg aria-label="Express Shipping" viewBox="0 0 114 12" class="ic xprss" width="94" height="10">
   <use xlink:href="https://www.jumia.com.ng/assets_he/images/i-shop-jumia.c8de1c55.svg#express"></use>
   </svg><p class="shipp">Jumia Express items in your order will be delivered for free (Lagos &amp; Abuja only, excluding large items)</p></div></a>


다음 속성이 사용되었습니다.

<class="info"> as the major node.
<class="name"> to get the name of the product
<class="prc"> to get the price of the product


Reqwest로 URL 호출




let mut page = 1;

    while page != 10 {
        let url = format!(
            "https://www.jumia.com.ng/catalog/?q=iphone&viewType=grid&page={:?}#catalog-listing",
            page
        );
        let res = reqwest::blocking::get(url).with_context(|| format!("opening url error"))?;
let document = Document::from_read(res).context("parsing response")?;


가장 먼저 주목해야 할 것은 이것이 다중 페이지 스크래퍼라는 것입니다. 우리는 만족할 때까지 다른 페이지를 반복할 것입니다. 위의 코드에서 iPhone 목록 페이지를 10번 살펴보고 사용 가능한 iPhone의 이름과 가격을 얻으려고 합니다. 페이지를 통해 루핑을 달성하기 위해 형식을 사용했습니다! 매크로, 연결하기 쉬운 방법 같아요. 매크로는 프로그램이 다른 페이지를 계속 반복하므로 페이지 매개변수를 허용합니다.

나는 reqwest를 사용하여 URL을 수락하고 select에서 문서 메서드를 사용하여 프로그램에서 읽을 수 있는 파일로 구문 분석했습니다.

let writer = OpenOptions::new()
            .read(true)
            .append(true)
            .create(true)
            .open("box.txt")
            .with_context(|| format!("opening file "))?;

        let mut writer = LineWriter::new(writer);

        let jumia = document.find(Class("info"));
        let link = document
            .find(Class("core"))
            .next()
            .context("writing to the output file")?;

        for node in jumia {
            let name = node
                .find(Class("name"))
                .next()
                .context("writing to the output file")?;
            let price = node
                .find(Class("prc"))
                .next()
                .context("writing to the output file")?;


            writeln!(
                writer,
                "{:?}---{:?}---{:?}",
                name.text(),
                price.text(),
                link.attr("href")
            )
            .context("writing to the output file")?;
        }
        page = page + 1;
    }

    Ok(())



코드의 첫 번째 부분은 폐기된 데이터가 저장될 대상을 지정합니다. box.txt로 저장됩니다.

페이징은 문서 변수에 의해 풀다운되며 모든 노드를 쉽게 평가하고 데이터를 스크랩할 수 있습니다.

읽어 주셔서 감사합니다. 제 영양 웹 애플리케이션인 nutrisoft도 확인할 수 있습니다.

github에서 사용 가능한 코드

좋은 웹페이지 즐겨찾기