QQ登录

只需要一步,快速开始

APP扫码登录

只需要一步,快速开始

查看: 3376|回复: 0

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

[复制链接]

等级头衔

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

丰功伟绩

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

联系方式
发表于 2022-4-12 07:51:04 | 显示全部楼层 |阅读模式
一、背景
! Z8 H" L5 x6 v; A& t  ^* A! H       在1688官网里面有很多信息是需要登录才能看得到的,比如商家的联系电话等等。那么我们在抓取它的网页的时候,肯定是需要维持登录状态才能得到对应的内容。这里面就会涉及到自动登录的问题。
) O. J- ?3 Z+ ^3 m: P- p' D* J登录地址:https://login.1688.com/member/signin.htm
' S% h  K% Q1 q+ P- E 1.jpg
. Q+ f6 @7 M9 c% g二、自动登录方法
5 ^9 \3 J7 t$ g$ N; G" X1、找到对应的元素,账号、密码框。
6 y/ W0 I% z) u! @  H 2.jpg ; a* J( N9 L$ T7 R, E: k9 l) F
2、把账号、密码值带进去。0 o3 `' L8 d' `! `5 s; s; x  ~
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、模拟点击提交按钮操作。5 c. }3 ^- b( X; m
     // Thread.Sleep(1000 * 30); //30时间操作
                driver.FindElement(By.ClassName("password-login")).Click();
                Thread.Sleep(1000 * 30);//30时间操作
4、进入控制台,验证是否登陆成功。并记录Cookies,下次再来的时候,直接使用现成的Cookies,一般有效期可以维持一天多左右。9 @9 T4 Y  i# o5 G0 @% C
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。
' i9 a  y+ o" F" h
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);
三、完整代码
0 ]: n0 v0 ~& H* D) I# O4 y4 S4 M3 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);
        }
四、注意事项* O0 {5 k: s- S2 l
1、登录的时候,有时候会出现滑块验证码,这时候一般是使用其他账号重试或者是在当前的机器手工登录一次,后面基本就会被信任。
" @, Q8 B5 x2 c1 i2、使用这段代码本身就是模拟真实用户的行为,最大限度的减少验证码出现的几率。
0 [+ F. E, E* g8 O! I
   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-11-29 05:43

Powered by paopaomj X3.5 © 2016-2025 sitemap

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