요르단 스크랩 Trulia
8058 단어 axiosrealestatejavascriptcheerio
비디오 워크스루
웹 스크래핑 Trulia. 부동산 세계 여행의 또 다른 단계. 지난 주에 스크래핑Redfin에 대한 게시물을 작성했으며 이 게시물의 목표는 동일합니다. 특정 자산에 대한 예상 가격을 가져옵니다.
조사
Trulia.com을 긁는 것은 Redfin.com을 긁는 것과 거의 똑같습니다.
두 단계. 경로를 파악한 다음 해당 경로를 사용하여 가격을 알아내야 합니다.
주소에서 경로를 얻는 것이 우리가 시작할 곳입니다. 우리는 정확한 주소를 가지고 있으며 검색에 사용하고 네트워크 탭을 보면 경로를 얻는 방법을 볼 수 있습니다.
결과를 확인하십시오. URL이 보이나요? 그것이 우리가 찾고 있는 것입니다!
{
"__typename": "SEARCHAUTOCOMPLETE_Address",
"title": "3950 Callahan Dr Memphis, TN 38127",
"details": "Address",
"searchEncodedHash": "eyJuYW1lIjoiMzk1MCBDYWxsYWhhbiBEciBNZW1waGlzLCBUTiAzODEyNyIsImlkIjoiMzk1MCBDYWxsYWhhbiBEciBNZW1waGlzLCBUTiAzODEyNyIsInR5cGUiOiJhZGRyZXNzIiwic3VidHlwZSI6ImFjdGl2ZV9hZGRyZXNzIiwic2NvcmUiOjE4NC41NTAyMDE0MTYwMTU2MiwicHJvcGVydHlJZCI6IjMyMDk1ODQzODIiLCJtYWxvbmVJZCI6IjIwNDEyMTU4MDgiLCJ6cGlkIjoiNDIyMjQwMDIiLCJsYXQiOjM1LjIzMzI0OTY2NDMwNjY0LCJsb24iOi04OS45ODM1MjgxMzcyMDcwMywic3RyZWV0RnVsbCI6IkNhbGxhaGFuIERyIiwiY2l0eSI6Ik1lbXBoaXMiLCJ6aXBDb2RlIjoiMzgxMjciLCJzdGF0ZSI6IlROIiwic3RyZWV0TnVtYmVyIjoiMzk1MCIsInVybFBhdGgiOiIvcC90bi9tZW1waGlzLzM5NTAtY2FsbGFoYW4tZHItbWVtcGhpcy10bi0zODEyNy0tMjA0MTIxNTgwOCJ9",
"url": "/p/tn/memphis/3950-callahan-dr-memphis-tn-38127--2041215808"
}
이를 통해 세부 정보 페이지로 이동합니다. 저는 역사적으로 항상 개발자 도구의 XHR 탭을 먼저 살펴보았습니다. 그러나 내가 정말로 시작해야 할 곳은 문서 탭입니다. 관찰하다.
데이터가 이미 Doc에 있다는 것은 XHR 요청이 유용한 것을 반환할 가능성이 매우 낮다는 것을 의미합니다. 페이지에 이미 렌더링되어 있습니다. 데이터를 추가로 채우기 위해 XHR 요청을 사용하는 이유는 무엇입니까?
그래서. 여기서는 cheerio(HTML 파서)로 데이터를 파싱합니다.
코드
두 가지 주요 기능. 하나는 경로를 얻는 것이고 다른 하나는 가격을 얻는 것입니다.
다음은 경로를 가져오는 함수의 핵심입니다.
const payload = {
opeartionName: 'searchBoxAutosuggest',
variables: {
query: `${formattedStreetAddress} ${theRestOfTheAddress}`,
searchType: 'FOR_SALE'
},
query: "query searchBoxAutosuggest($query: String!, $searchType: SEARCHAUTOCOMPLETE_SearchType, $mostRecentSearchLocations: [SEARCHDETAILS_LocationInput]) {\n searchLocationSuggestionByQuery(query: $query, searchType: $searchType, mostRecentSearchLocations: $mostRecentSearchLocations) {\n places {\n __typename\n ...on SEARCHAUTOCOMPLETE_Region{ title details searchEncodedHash }\n ...on SEARCHAUTOCOMPLETE_Address { title details searchEncodedHash url }\n }\n schools { title subtitle details searchEncodedHash }\n \n }\n}"
};
const axiosResponse = await axios.post(url, payload, {
headers: {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'
}
});
return axiosResponse.data?.data?.searchLocationSuggestionByQuery?.places[0]?.url;
헤더에 user-agent를 추가하지 않고 403을 반환했습니다. 이 코드 위에는 어떻게든 잘못된 거리 이름이 있는 시나리오를 처리하는 또 다른 코드가 있습니다(예: st 대신 rd 또는 rd 대신 dr).
다음과 같습니다.
// Location and v are required query parameters
const splitAddress = address.split(',');
// Format the street part so we can remove the last word (hopefully rd/st/dr/etc)
// We probably should only do this if there are more than two words in the street
const splitStreetAddress = splitAddress[0].split(' ');
if (splitStreetAddress.length > 2) {
splitStreetAddress.pop();
}
const formattedStreetAddress = splitStreetAddress.join(' ');
// Get the rest of the address (city, state, and zip)
splitAddress.shift();
const theRestOfTheAddress = splitAddress.join(' ');
이것이 하는 일은 두 단어만 있는 경우가 아니면 문자열의 마지막 단어를 빼내는 것입니다(123 Fake는 그대로 두어야 하지만 123 Fake St는 "St"를 잃어버리고 여전히 올바른 경로를 반환할 수 있습니다).
다음은 이 작업을 수행하는 방법에 대해 자세히 설명하는 비디오입니다.
다음 부분은 가격을 뽑습니다. 매우 간단합니다.
async function getPrice(path: string) {
const url = `https://trulia.com${path}`;
const axiosResponse = await axios.get(url, {
headers: {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36',
'cookie': '_pxhd=8c9673c1f4056ee7a77627ded7c8d4cb1e8d42054109dcfdf672184d1e1f55d5:5b1e9741-1205-11eb-b1e9-a7e8d53ee70d; tlftmusr=201019qig7kp1lgl74u9t6o21rwpm022; zjs_user_id=null; _pxvid=5b1e9741-1205-11eb-b1e9-a7e8d53ee70d; zjs_anonymous_id=%22201019qig7kp1lgl74u9t6o21rwpm022%22; s_fid=16ED6EFD94A2BF4E-213974C00E9509F5; s_vi=[CS]v1|2FC6C22D0515A937-60000B66EC7F9CDD[CE]; QSI_S_ZN_aVrRbuAaSuA7FBz=v:0:0; _csrfSecret=DH22skBX8VMM7gABqyjqooKX; s_cc=true; g_state={"i_p":1603374232256,"i_l":1}; trul_visitTimer=1603366896615_1603367532459; OptanonConsent=isIABGlobal=false&datestamp=Thu+Oct+22+2020+05%3A52%3A12+GMT-0600+(Mountain+Daylight+Time)&version=5.8.0&landingPath=NotLandingPage&groups=1%3A1%2C0_234869%3A1%2C3%3A1%2C4%3A1%2C0_234866%3A1%2C0_234867%3A1%2C0_234868%3A1%2C0_240782%3A1%2C0_240783%3A1%2C0_240780%3A1%2C0_234871%3A1%2C0_240781%3A1%2C0_234872%3A1%2C0_234873%3A1%2C0_234874%3A1%2C0_234875%3A1%2C0_234876%3A1%2C0_234877%3A1&AwaitingReconsent=false; _px3=f7d9fac3630e1dd422e475ff793186284795bc5aa6363614943b8bf5cd2b6a73:Pj+xFCVT2i7AyMCUvgrcfd/KjikynxhMnmim3uqRqZ5niEPAyFqN54FutfRPfxD2HTFyDqD8H2ZEdAqf09CxxQ==:1000:ViYMtJksk/0GJJbGnGJz8XSWcTP+533Le6v5P9XTr+YxNhPZCBvCWNRQNkIhXCVQ+E/SJyCxiYr34P5Fir/Dv7kfgnQ72Agl8Gc+zaV5xEpeNnQ8ujJlhvYyIAsGk041Px4/k6JRjhpTIK6dhDwVHo2UEDnzpKQZ5B0I5YoBpTA='
}
});
const $ = cheerio.load(axiosResponse.data);
const price = $('[data-testid="home-details-sm-lg-xl-price-details"] .qAaUO').text();
return price;
}
거기에 거대한 쿠키가 있음을 알 수 있습니다. 403을 받지 않으려면 이 요청에 쿠키와 사용자 에이전트가 필요했습니다.
그리고 그게 다야. 우리는 해냈다.
Demo code here
비즈니스 리드를 찾고 계십니까?
여기javascriptwebscrapingguy.com에서 설명한 기술을 사용하여 멋진 웹 데이터에 액세스하는 방법을 시작할 수 있었습니다. 자세한 내용은 Cobalt Intelligence에서 알아보세요!
게시물 Jordan Scrapes Trulia이 Javascript Web Scraping Guy에 처음 나타났습니다.
Reference
이 문제에 관하여(요르단 스크랩 Trulia), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/aarmora/jordan-scrapes-trulia-4n97텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)