QQ登录

只需要一步,快速开始

APP扫码登录

只需要一步,快速开始

查看: 3184|回复: 0

[C#/.NET] c#爬虫-1688官网自动登录

[复制链接]

等级头衔

积分成就    金币 : 2861
   泡泡 : 1516
   精华 : 6
   在线时间 : 1321 小时
   最后登录 : 2025-7-9

丰功伟绩

优秀达人突出贡献荣誉管理论坛元老活跃会员

联系方式
发表于 2022-4-12 07:51:04 | 显示全部楼层 |阅读模式
一、背景- b) g/ @9 c. u' h
       在1688官网里面有很多信息是需要登录才能看得到的,比如商家的联系电话等等。那么我们在抓取它的网页的时候,肯定是需要维持登录状态才能得到对应的内容。这里面就会涉及到自动登录的问题。: R$ H  V- F# ^( [: Z
登录地址:https://login.1688.com/member/signin.htm
, P, [  _4 f( N! ~% [ 1.jpg
' T+ m  _$ |% O0 `0 _3 c8 F二、自动登录方法
/ i: h! y& U8 ^; H. `: |1、找到对应的元素,账号、密码框。$ ?7 K4 B" n; x7 X& a& p, L- [- C4 a& v
2.jpg   k7 Y4 e) G+ O, @. {' f$ p, P
2、把账号、密码值带进去。
$ b$ q) U: k  [
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]);
3、模拟点击提交按钮操作。9 @! {& W% |) Y: f& |+ `6 ^% p- ~
     // Thread.Sleep(1000 * 30); //30时间操作
                driver.FindElement(By.ClassName("password-login")).Click();
                Thread.Sleep(1000 * 30);//30时间操作
4、进入控制台,验证是否登陆成功。并记录Cookies,下次再来的时候,直接使用现成的Cookies,一般有效期可以维持一天多左右。6 D2 J# o, a: I/ }1 c" m) Z+ t
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。
$ M* g5 r; y: o" H! P) x" g
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);
三、完整代码7 m; V5 }4 o# |" w
  /// <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);
        }
四、注意事项
* k, F' D! Z) `! r8 c1、登录的时候,有时候会出现滑块验证码,这时候一般是使用其他账号重试或者是在当前的机器手工登录一次,后面基本就会被信任。
( \7 h0 _- `: R8 r' o2、使用这段代码本身就是模拟真实用户的行为,最大限度的减少验证码出现的几率。3 J# W, U" I- T1 w. \1 r% Z
   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);
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|paopaomj.COM ( 渝ICP备18007172号|渝公网安备50010502503914号 )

GMT+8, 2025-9-13 15:35

Powered by paopaomj X3.5 © 2016-2025 sitemap

快速回复 返回顶部 返回列表