Exemple #1
0
        public ResultReturn pushDataToCategory([FromForm] ResultList result1)
        {
            try
            {
                {
                    // Lấy ra danh sách url strong start_url cần bổ sung
                    var urls = entities.start_url.Where(m => result1.result.Contains(m.ID)).ToList();
                    if (urls != null)
                    {
                        var         countUrl = 0;
                        MyWebClient client   = new MyWebClient()
                        {
                            Encoding = Encoding.UTF8
                        };
                        client.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36";

                        foreach (var url1 in urls)
                        {
                            try
                            {
                                // Kiểm tra xem url có hợp lệ không
                                var  urltmp = url1.url;
                                bool isUrl  = Uri.TryCreate(urltmp, UriKind.Absolute, out Uri baseUri) &&
                                              (baseUri.Scheme == Uri.UriSchemeHttp || baseUri.Scheme == Uri.UriSchemeHttps);
                                if (isUrl)
                                {
                                    var myDomain = baseUri.Authority;
                                    // Loại bỏ www ở đầu domain
                                    myDomain = myDomain.StartsWith("www.") ? myDomain.Substring(4) : myDomain;
                                    // lấy ra cấu hình của domain
                                    var domains = entities.Domain.Where(domain => (myDomain == domain.Domain1 || myDomain.EndsWith("." + domain.Domain1)) &&
                                                                        domain.Type == 2).ToList();

                                    if (domains.Count > 0)
                                    {
                                        Domain domain = null;
                                        foreach (Domain domaintmp in domains)
                                        {
                                            if (domaintmp.Domain1 == myDomain)
                                            {
                                                domain = domaintmp;
                                                break;
                                            }
                                        }
                                        if (domain == null)
                                        {
                                            domain = domains.FirstOrDefault();
                                        }

                                        var data        = client.DownloadData(urltmp);
                                        var contentType = client.ResponseHeaders["Content-Type"];
                                        // Kiểm tra xem nội dung của trang web có phải là html hay không
                                        if (contentType.StartsWith(@"text/"))
                                        {
                                            var          jsonConfig = domain.Content;
                                            var          config     = StructuredDataConfig.ParseJsonString(jsonConfig);
                                            HtmlDocument docc       = new HtmlDocument();
                                            var          html       = Encoding.UTF8.GetString(data);
                                            docc.LoadHtml(html);
                                            var url = "";
                                            // Chuyển link động trong trang web thành link tĩnh
                                            HtmlNodeCollection nodes = docc.DocumentNode.SelectNodes("//a");
                                            if (nodes != null)
                                            {
                                                foreach (HtmlNode node in nodes)
                                                {
                                                    if ((node.Attributes["href"] != null) && (node.Attributes["href"].Value != ""))
                                                    {
                                                        try
                                                        {
                                                            url = node.Attributes["href"].Value.Trim();
                                                            node.Attributes["href"].Value = new Uri(baseUri, url).AbsoluteUri;
                                                        }
                                                        catch { }
                                                    }
                                                }
                                            }
                                            ;
                                            html = docc.DocumentNode.InnerHtml;
                                            // Bóc tách ra danh sách chủ đề của domain dựa vào cấu hình
                                            var openScraping    = new StructuredDataExtractor(config);
                                            var scrapingResults = openScraping.Extract(html);
                                            var result          = JsonConvert.SerializeObject(scrapingResults, Formatting.Indented);
                                            // Lấy ra danh sách chủ đề trong trang báo
                                            if (scrapingResults.Count > 0)
                                            {
                                                var    o     = JObject.Parse(result);
                                                JToken token = o["link"];
                                                if (token != null)
                                                {
                                                    List <url_crawl_list> listCrawl = new List <url_crawl_list>()
                                                    {
                                                    };
                                                    int count  = 0;
                                                    var lsturl = token is JArray ? ((JArray)token).Select(m => m?.ToString()?.Trim()).Where(m => !string.IsNullOrWhiteSpace(m)).Distinct().ToList() : new List <string>()
                                                    {
                                                        token.ToString()
                                                    };
                                                    foreach (var valuetmp in lsturl)
                                                    {
                                                        if (valuetmp.Contains(myDomain) && valuetmp.StartsWith("http"))
                                                        {
                                                            listCrawl.Add(new url_crawl_list {
                                                                url = valuetmp, status = 1, domain = myDomain, interval = result1.interval, module = result1.module, schedule_time = DateTime.Now
                                                            });
                                                            count++;
                                                        }
                                                    }
                                                    if (count > 0)
                                                    {
                                                        countUrl++;
                                                        // Thêm danh sách url chủ đề vào bảng url_crawl_list
                                                        //entities.Database.ExecuteSqlRaw("usp_url_crawl_list_addList"
                                                        //, UrlCrawlListParameters("@urlCrawlList", listCrawl));
                                                        entities.Database.ExecuteSqlCommand(new RawSqlString("usp_url_crawl_list_addList")
                                                                                            , UrlCrawlListParameters("@urlCrawlList", listCrawl));
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                            catch (Exception)
                            {
                            }
                        }
                        if (countUrl > 0)
                        {
                            return(new ResultReturn("Thêm thành công " + countUrl + " url !", 1));
                        }
                        return(new ResultReturn("Không thêm được url nào, vui lòng xem lại cấu hình!", -1));
                    }
                    else
                    {
                        return(new ResultReturn("Không tìm thấy bản ghi nào!", -1));
                    }
                }
            }
            catch
            {
                return(new ResultReturn("Thêm thất bại!", -1));
            }
        }
        // Api lấy về html của 1 trang web sau khi xử lý lại. Xóa hết javascript trong trang. CHuyển hết các link động sang tĩnh
        public IActionResult Html(string url, bool javascript)
        {
            var urlDecode = WebUtility.UrlDecode(url);
            Uri uriResult;
            // Kiểm tra xem url có hợp lệ hay không
            bool valid = Uri.TryCreate(urlDecode, UriKind.Absolute, out uriResult) &&
                         (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps);

            if (valid)
            {
                // Download html của trang web
                var         baseUri = new Uri(new Uri(urlDecode).GetLeftPart(UriPartial.Authority));
                MyWebClient client  = new MyWebClient();
                client.Encoding = Encoding.UTF8;
                client.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36";
                var result = client.DownloadString(urlDecode);
                // CHuyển đổi từ html string sang HtmlParser
                var parser   = new HtmlParser();
                var document = parser.ParseDocument(result);

                //
                IHtmlCollection <IElement> menuItems;
                if (!javascript)
                {
                    // Xóa hết các thẻ script
                    menuItems = document.QuerySelectorAll("script, base");
                    foreach (IElement item in menuItems)
                    {
                        item.Remove();
                    }
                }

                // Bắt tất cả các element có thuộc tính href
                menuItems = document.QuerySelectorAll("[href]");
                var urltmp = "";
                foreach (IElement item in menuItems)
                {
                    try
                    {
                        // Chuyển link động sang link tĩnh
                        urltmp = item.GetAttribute("href");
                        item.SetAttribute("href", new Uri(baseUri, urltmp).AbsoluteUri);
                    }
                    catch (Exception) { }
                }
                // Bắt tất cả các element có thuộc tính src
                menuItems = document.QuerySelectorAll("[src]");
                foreach (IElement item in menuItems)
                {
                    try
                    {
                        // Chuyển link động sang link tĩnh
                        urltmp = item.GetAttribute("src");
                        item.SetAttribute("src", new Uri(baseUri, urltmp).AbsoluteUri);
                    }
                    catch (Exception) { }
                }
                // Bắt tất cả thẻ a trong trang
                menuItems = document.QuerySelectorAll("a");
                foreach (IElement item in menuItems)
                {
                    try
                    {
                        // Chuyển link động sang link tĩnh
                        urltmp = item.GetAttribute("href");
                        item.SetAttribute("href", "javascript:LinkInfo(\"" + new Uri(baseUri, urltmp).AbsoluteUri + "\");");
                    }
                    catch (Exception) { }
                }
                // Bổ sung thêm file css, js để xử lý thêm trong trang
                var element = document.CreateElement("link");
                element.SetAttribute("href", "/Content/myStyle.css");
                element.SetAttribute("rel", "stylesheet");
                document.Head.AppendChild(element);
                var body = document.Body;
                element = document.CreateElement("script");
                element.SetAttribute("src", "/Scripts/jquery-3.3.1.min.js");
                body.Append(element);
                var scriptcss = document.CreateElement("script");
                scriptcss.SetAttribute("src", "/Scripts/css-selector-generator.js");
                body.Append(scriptcss);
                var baseurl      = client.ResponseUri.ToString();
                var scriptInBody = document.CreateElement("script");
                scriptInBody.InnerHtml = "var url = \"" + baseurl + "\";";
                body.Append(scriptInBody);
                var script = document.CreateElement("script");
                script.SetAttribute("src", "/Scripts/myScript.min.js");
                body.Append(script);
                return(PartialView((object)document.DocumentElement.OuterHtml));
            }
            else
            {
                ViewBag.Data = urlDecode;
                return(View("Error"));
            }
        }