背景
在1688官網里面有很多資訊是需要登錄才能看得到的,比如商家的聯系電話等等,那么我們在抓取它的網頁的時候,肯定是需要維持登錄狀態才能得到對應的內容,這里面就會涉及到自動登錄的問題,
登錄地址
https://login.1688.com/member/signin.htm

自動登錄方法
1、找到對應的元素,賬號、密碼框,

2、把賬號、密碼值帶進去,
List<string> logininfolist = new List<string>();string file = "1688Account.json";if (!File.Exists(file)){throw new ArgumentException("1688Account not found");}string data = https://www.cnblogs.com/lyl6796910/archive/2021/02/06/File.ReadAllText(file, Encoding.UTF8);var account1688list = JsonConvert.DeserializeObject<List<Account1688Item>>(data);logininfolist.AddRange(account1688list.Select(o => o.AccountPassword).ToList());Random rdinfo = new Random();int indexinfo = rdinfo.Next(logininfolist.Count);var modelinfo = logininfolist[indexinfo];driver.FindElement(By.Id("fm-login-id")).SendKeys(modelinfo.Split('+')[0]);driver.FindElement(By.Id("fm-login-password")).SendKeys(modelinfo.Split('+')[1]);
3、模擬點擊提交按鈕操作,
// Thread.Sleep(1000 * 30); //30時間操作driver.FindElement(By.ClassName("password-login")).Click();Thread.Sleep(1000 * 30);//30時間操作
4、進入控制臺,驗證是否登陸成功,并記錄Cookies,下次再來的時候,直接使用現成的Cookies,一般有效期可以維持一天多左右,
driver.Navigate().GoToUrl("https://work.1688.com/?tracelog=login_target_is_blank_1688");Thread.Sleep(1000 * 5);if (driver.Url.Contains("login.1688.com")){Console.WriteLine("登錄失敗");CookieHelp.DeleteCookies();Console.WriteLine("2");throw new Exception("重新登錄");}driver.Navigate().Refresh();CookieHelp.WriteCookies(driver.Manage().Cookies.AllCookies);
5、判斷是否有現成的登錄cookies,
driver.Navigate().GoToUrl("https://www.1688.com/");driver.Manage().Cookies.DeleteAllCookies();var listCookie = CookieHelp.GetCookie();if (listCookie != null){logintry = 0;Console.WriteLine("有現成cookies" + DateTime.UtcNow);foreach (var item in listCookie){driver.Manage().Cookies.AddCookie(new Cookie(item.Name, item.Value, item.Domain, item.Path, item.Expiry));}Thread.Sleep(2000);driver.Navigate().GoToUrl("https://work.1688.com/?tracelog=login_target_is_blank_1688");Thread.Sleep(1000 * 2);
完整代碼
/// <summary>/// 登錄 todo/// </summary>/// <param name="_reptilesImageSearchService"></param>/// <param name="options"></param>/// <param name="driver"></param>public void Implement(IReptilesImageSearchService _reptilesImageSearchService, IWebDriver driver){driver.Navigate().GoToUrl("https://www.1688.com/");driver.Manage().Cookies.DeleteAllCookies();var listCookie = CookieHelp.GetCookie();if (listCookie != null){logintry = 0;Console.WriteLine("有現成cookies" + DateTime.UtcNow);foreach (var item in listCookie){driver.Manage().Cookies.AddCookie(new Cookie(item.Name, item.Value, item.Domain, item.Path, item.Expiry));}Thread.Sleep(2000);driver.Navigate().GoToUrl("https://work.1688.com/?tracelog=login_target_is_blank_1688");Thread.Sleep(1000 * 2);if (driver.Url.Contains("login.1688.com")){Console.WriteLine("cookies過期了");CookieHelp.DeleteCookies();Console.WriteLine("1");throw new Exception("重新登錄");}}else{if (logintry > 4){Console.WriteLine("登陸次數超出:" + logintry);throw new Exception("登陸次數超出,退出");}logintry++;Console.WriteLine("無現成cookies" + DateTime.UtcNow);driver.Navigate().GoToUrl("https://login.1688.com/member/signin.htm");#region 登錄動作driver.SwitchTo().Frame(0);IJavaScriptExecutor js = (IJavaScriptExecutor)driver;// string returnjs = (string)js.ExecuteScript("Object.defineProperties(navigator, {webdriver:{get:()=>undefined}});");string jsfile = File.ReadAllText("stealth.min.js", Encoding.UTF8);string returnjs = (string)js.ExecuteScript(jsfile);List<string> logininfolist = new List<string>();string file = "1688Account.json";if (!File.Exists(file)){throw new ArgumentException("1688Account not found");}string data = https://www.cnblogs.com/lyl6796910/archive/2021/02/06/File.ReadAllText(file, Encoding.UTF8);var account1688list = JsonConvert.DeserializeObject<List<Account1688Item>>(data);logininfolist.AddRange(account1688list.Select(o => o.AccountPassword).ToList());Random rdinfo = new Random();int indexinfo = rdinfo.Next(logininfolist.Count);var modelinfo = logininfolist[indexinfo];driver.FindElement(By.Id("fm-login-id")).SendKeys(modelinfo.Split('+')[0]);driver.FindElement(By.Id("fm-login-password")).SendKeys(modelinfo.Split('+')[1]);// Thread.Sleep(1000 * 30); //30時間操作driver.FindElement(By.ClassName("password-login")).Click();Thread.Sleep(1000 * 30);//30時間操作#endregion 登錄動作driver.Navigate().GoToUrl("https://work.1688.com/?tracelog=login_target_is_blank_1688");Thread.Sleep(1000 * 5);if (driver.Url.Contains("login.1688.com")){Console.WriteLine("登錄失敗");CookieHelp.DeleteCookies();Console.WriteLine("2");throw new Exception("重新登錄");}driver.Navigate().Refresh();CookieHelp.WriteCookies(driver.Manage().Cookies.AllCookies);}Thread.Sleep(1000);}
注意事項
1、登錄的時候,有時候會出現滑塊驗證碼,這時候一般是使用其他賬號重試或者是在當前的機器手工登錄一次,后面基本就會被信任,
2、使用這段代碼本身就是模擬真實用戶的行為,最大限度的減少驗證碼出現的幾率,
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;// string returnjs = (string)js.ExecuteScript("Object.defineProperties(navigator, {webdriver:{get:()=>undefined}});");string jsfile = File.ReadAllText("stealth.min.js", Encoding.UTF8);string returnjs = (string)js.ExecuteScript(jsfile);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/257297.html
標籤:.NET技术
下一篇:外網訪問公司的服務端很慢,求分析
