/// <summary> /// 특이 케이스 페이지 처리 ( 타켓 Url -> http://mg.gmarket.co.kr/Promotion/Plan?lcId=&sid=160045 ) /// </summary> /// <param name="startNum"></param> /// <param name="endNum"></param> /// <param name="xPathModel"></param> /// <param name="logFunc"></param> /// <returns></returns> List <DataModel> GetGoods_Mobile_Alias_type2_2(int startNum, int endNum, XPathModel xPathModel, Action <string> logFunc) { var result = new List <DataModel>(); // 페이지 소스 가져오기 var getPageSourceResult = webController.GetPageSource(); if (!getPageSourceResult.ResultFlag) { logFunc($"페이지소스를 가져오는 중 오류 발생 : {getPageSourceResult.Err}"); return(result); } var page = new BeautifulPage(getPageSourceResult.ResultValue); // 시작 지점 초기화 int curNumGroup1 = xPathModel.ParamsStartNum[0]; int curNumGroup2 = xPathModel.ParamsStartNum[1]; for (int num = 1; num <= endNum; num++, curNumGroup2++) { // 우선 값 가져오기 var xPath = string.Format(xPathModel.NumNodeXPath, curNumGroup1, curNumGroup2); BeautifulNode node = page.SelectNode(xPath); // 그룹 끝났는지 체크 후 다시 수집 : 라인 수정 했는데도 null이면 현재 그룹의 상품코드가 더이상 없다고 보고 그룹 옮기기 if (node == null || string.IsNullOrEmpty(node.Href)) { curNumGroup1++; // 그룹 옮기고 curNumGroup2 = xPathModel.ParamsStartNum[1]; // 상품 순번 첫번째로 이동 // 다시 가져오기 xPath = string.Format(xPathModel.NumNodeXPath, curNumGroup1, curNumGroup2); node = page.SelectNode(xPath); } // 위에서 파라미터 인덱스 증가 시켜줬는데도 null이면 더이상 상품이 없다고 보고 종료 // 하지만 null이 아니라면 num부터 endNum 까지 계속 루프 돌아줌 if (node == null || string.IsNullOrEmpty(node.Href)) { break; } // 상품코드 가져올 처음번호 이전 꺼는 전부 버리기 if (num < startNum) { continue; } // 상품코드 추가 var goodsCode = GetGoodsCode(node.Href); result.Add(new DataModel() { GooodsCode = goodsCode }); } return(result); }
/// <summary> /// xPath 선택자 /// </summary> /// <param name="xPathModels"></param> /// <returns></returns> private XPathModel GetXPathModel(List <XPathModel> xPathModels) { // 설명 : 애매한 상황들 때문에 어쩔 수 없이 모든 xPath로 상품코드 노드 수 수집 후 가장 노드 수 가 많은 xPath 리턴 if (xPathModels == null || xPathModels.Count <= 0) { return(null); } XPathModel result = null; var getPageSource = webController.GetPageSource(); if (!getPageSource.ResultFlag) { return(result); } foreach (var xPathModel in xPathModels) { if (string.IsNullOrEmpty(xPathModel.PageNodeXPath)) { continue; } var page = new BeautifulPage(getPageSource.ResultValue); var nodes = page.SelectNodes(xPathModel.PageNodeXPath); if (nodes != null && nodes.Count() > 0) { xPathModel.SelectTotalNode = nodes.Where(nc => nc.Href.ToLower().Contains("goodscode"))?.Count() ?? 0; } } result = xPathModels.OrderByDescending(n => n.SelectTotalNode)?.FirstOrDefault(); return(result); }
/// <summary> /// 페이지의 특정 순서 상품코드 가져오기 /// </summary> /// <param name="logFunc"></param> /// <returns></returns> private string GetIndexGoodsCodeTableType(int codeNum, XPathModel xPathModel, Action <string> logFunc) { var getPageSourceResult = webController.GetPageSource(); if (!getPageSourceResult.ResultFlag) { logFunc(getPageSourceResult.Err); return(string.Empty); } string result = string.Empty; try { var page = new BeautifulPage(getPageSourceResult.ResultValue); BeautifulNode node = null; string xPathText = string.Empty; // PC 웹의 경우 html 구조가 여러가지여서 여기서 상황별 대처가 필요함. // (현재는 파라미터가 2, 3 개인 케이스가 한건씩 밖에 없어서 이렇게 처리 했는데 다른 케이스가 발견 되면 수정 필요...) switch (xPathModel.ParamCount) { case 1: xPathText = string.Format(xPathModel.NumNodeXPath, codeNum); node = page.SelectNode(xPathText); break; case 2: if (xPathModel.ParamsStartNum.Count == 2 && xPathModel.ColLength > 0) { int startDepth0 = xPathModel.ParamsStartNum[0]; // 첫번째 파라미터 시작번호 int startDepth1 = xPathModel.ParamsStartNum[1]; // 두번째 파라미터 시작번호 int colLen = xPathModel.ColLength; // 총 갯수 // 첫번째 파라미터 위치 decimal currentTmp = Math.Ceiling((decimal)codeNum / (decimal)colLen); int param0 = (int)currentTmp; // 두번째 파라미터 위치 int param1Tmp = codeNum % colLen; int param1 = param1Tmp == 0 ? colLen : param1Tmp; xPathText = string.Format(xPathModel.NumNodeXPath, param0, param1); } else if (xPathModel.ParamsStartNum.Count == 2 && xPathModel.ColLength == 0) { int startDepth0 = xPathModel.ParamsStartNum[0]; // 첫번째 파라미터 시작번호 int startDepth1 = xPathModel.ParamsStartNum[1]; // 두번째 파라미터 시작번호 int colLen = xPathModel.ColLength; // 총 갯수 // 첫번째 파라미터 위치 decimal currentTmp = Math.Ceiling((decimal)codeNum / (decimal)colLen); int param0 = (int)currentTmp; // 두번째 파라미터 위치 int param1Tmp = codeNum % colLen; int param1 = param1Tmp == 0 ? colLen : param1Tmp; xPathText = string.Format(xPathModel.NumNodeXPath, param0, param1); } break; } // xPath를 가져왔다면 상품코드 가져오기 if (!string.IsNullOrEmpty(xPathText)) { node = page.SelectNode(xPathText); result = GetGoodsCode(node.Href); } } catch (Exception e) { string err = $"상품코드 가져오는 중 오류가 발생했습니다. [{e.Message}]"; logFunc(err); } return(result); }