c#爬虫-1688官网自动登录
生活随笔
收集整理的這篇文章主要介紹了
c#爬虫-1688官网自动登录
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
背景
在1688官網里面有很多信息是需要登錄才能看得到的,比如商家的聯系電話等等。那么我們在抓取它的網頁的時候,肯定是需要維持登錄狀態才能得到對應的內容。這里面就會涉及到自動登錄的問題。
登錄地址
https://login.1688.com/member/signin.htm
自動登錄方法
1、找到對應的元素,賬號、密碼框。
2、把賬號、密碼值帶進去。
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。
完整代碼
/// <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 = 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);總結
以上是生活随笔為你收集整理的c#爬虫-1688官网自动登录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 聊聊如何构建自驱团队(3)
- 下一篇: C# 规则引擎RulesEngine