요르단, 워싱턴의 마리화나 생산자들을 긁다

Demo code here

여보세요. 이 게시물의 목표는 워싱턴의 마리화나 생산자의 법적 이름을 찾는 것입니다. 이는 이러한 생산자에게 마케팅하려는 사람에게 유용할 것입니다. 법적 이름으로 워싱턴 국무장관에게 소유자를 확인할 수 있습니다.

이를 위해 두 개의 다른 사이트를 사용하고 있습니다. 첫 번째 502data.com 에는 모든 생산자의 목록이 있지만 법적 이름은 없습니다. 두 번째 TopShelfData 에는 회사의 법적 이름이 있습니다. 이 법적 이름을 사용하면 워싱턴주 국무장관에게서 비즈니스 정보를 쉽게 찾을 수 있습니다.

502data.com





502data.com을 빠르게 조사한 결과 프레임워크에 Angularjs을 사용하고 있음이 분명해졌습니다. 이 사실을 알고 있었기 때문에 데이터와 함께 XHR 요청을 볼 수 있을 것이라고 충분히 예상했습니다. 하지만 https://502data.com/allproducerprocessors으로 가는 요청은 두 개뿐이었습니다. 둘 다 관련 정보가 없었습니다.



이것은 정말 나를 혼란스럽게 했다. 페이지 로드 시 데이터가 분명히 없었습니다. 모든 자바스크립트가 렌더링되기 전의 모습을 보십시오.



내 다음 단계는 자바 스크립트를 통과하는 것이 었습니다. 데이터가 XHR을 통해 가져온 경우 javascript의 어딘가에서 참조되어야 합니다. 그러나이 스크립트 파일을 보면 앱 자체를 관리하는 것으로 나에게 부름받은 것은 없습니다.



다음 중지는 루트 페이지였습니다. 스크립트 태그를 살펴보다가 마침내 페이지 하단에서 내가 찾던 것을 찾았습니다. 공동 자금.


$scope.licenses 참조 ? 그것이 내가 찾고 있는 것입니다. 워싱턴에 있는 모든 마리화나 생산자들의 거대한 배열입니다. 길이를 확인하면 1500이 넘었습니다.

전에는 스크립트 데이터를 얻기 위해 cheerio를 사용한 적이 없었지만 꽤 간단하다는 것이 밝혀졌습니다.

   const url = 'https://502data.com/allproducerprocessors';

    const axiosResponse = await axios.get(url);

    const $ = cheerio.load(axiosResponse.data);

    const script = $('script:nth-of-type(7)').html();

    const scriptSplit = script?.split('$scope.licenses = ');
    let arrayOfbusinesses: any[] = [];
    if (scriptSplit) {
        arrayOfbusinesses = JSON.parse(scriptSplit[1].split(';')[0]);
    }


일반적인 선택기와 유일한 차이점은 html() 대신 text() 를 사용한다는 것입니다. 그런 다음 원하는 부분만 찾을 때까지 html을 분할했습니다. 그렇다면 그것은 단순히 JSON.parse() 의 문제였습니다.

밤. 그런 식으로 생산자가 있습니다. 이제 법적 이름을 얻으십시오.

TopShelfData





꺼지면 TopShelfData으로 이동합니다. 등록된 이름은 우리가 찾고 있는 항목입니다.



502data.com에서 가져온 데이터는 다음과 같습니다.

    {
        "licensenumber": "78256",
        "name": "EVERGREEN HERBAL",
        "tier": 0,
        "city": "SEATTLE",
        "county": "KING",
        "totalSales": 26827987.182500,
        "ytdSales": 2887764.770000,
        "lastMonthSales": 588414.440000
    }


따라서 위의 데이터를 위 그림의 URL로 변환해야 합니다. 처음에는 모든 것을 소문자로 바꾸고 공백을 대체하기 위해 대시를 넣을 수 있다고 생각했습니다. 그러나 같은 이름을 가진 비즈니스가 둘 이상인 경우 문제가 발생합니다. 위의 사진에서 볼 수 있듯이 URL 끝에 1이 있습니다.

그래서… TopShelfData가 어떻게 범위를 좁혔는지 검색해 보았습니다.



빵. 우리는 사업을 하고 있습니다. 검색은 XHR 결과를 반환합니다. 그래서 방금 내 비즈니스 이름을 쿼리로 제출한 다음 동일한 도시가 포함된 제안에서 비즈니스를 찾습니다.

export async function getSlugFromTopShelfData(businessName: string, city: string): Promise<IBusinessSearchData> {
    const url = `https://www.topshelfdata.com/search?query=${businessName}`;
    const convertedCity = city.toLocaleLowerCase().replace(/\s/g, '-');

    const axiosResponse = await axios.get(url);
    const suggestions = axiosResponse.data?.suggestions;

    const foundBusiness = suggestions.find(suggestion => suggestion?.data?.address_city.includes(convertedCity));

    return foundBusiness?.data;
}


이를 통해 URL로 직접 이동하여 비즈니스의 법적 이름을 얻는 것은 단순히 문제였습니다.

export async function checkTopShelfDataDetails(businessSearchData: IBusinessSearchData) {
    const url = `https://www.topshelfdata.com/wa/${businessSearchData.address_city}/${businessSearchData.slug}`;

    let axiosResponse: AxiosResponse;

    try {
        axiosResponse = await axios.get(url);
    }
    catch (e) {
        console.log('e', e.response ? e.response.status : e.errno);
        throw '';
    }

    const $ = cheerio.load(axiosResponse.data);

    const title = $('.business-info div:nth-of-type(3) a').text();

    console.log('title', title);
}


완료. 아주 재미있는 스크랩!

Demo code here

비즈니스 리드를 찾고 계십니까?



여기javascriptwebscrapingguy.com에서 설명한 기술을 사용하여 멋진 웹 데이터에 액세스하는 방법을 시작할 수 있었습니다. 자세한 내용은 Cobalt Intelligence에서 알아보세요!

게시물 Jordan Scrapes Washington’s Marijuana ProducersJavaScript Web Scraping Guy에 처음 나타났습니다.

좋은 웹페이지 즐겨찾기