QQ登录

只需要一步,快速开始

APP扫码登录

只需要一步,快速开始

查看: 3243|回复: 0

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

[复制链接]

等级头衔

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

丰功伟绩

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

联系方式
发表于 2022-4-12 07:51:04 | 显示全部楼层 |阅读模式
一、背景& U8 c: i7 |7 `8 S5 R5 q
       在1688官网里面有很多信息是需要登录才能看得到的,比如商家的联系电话等等。那么我们在抓取它的网页的时候,肯定是需要维持登录状态才能得到对应的内容。这里面就会涉及到自动登录的问题。8 J0 U: v9 V% M' Z/ {# @: z% u
登录地址:https://login.1688.com/member/signin.htm3 R$ c+ a- p9 D6 j  O
1.jpg
. k: W- l7 g2 t二、自动登录方法
" d5 A- L* P( w- V0 U2 W) s0 Q+ c1、找到对应的元素,账号、密码框。+ f/ G* t3 o+ y3 x2 j% q
2.jpg
( V1 b( a6 ^8 a& l2、把账号、密码值带进去。( r- W! I2 r, W
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、模拟点击提交按钮操作。
+ @/ }: e* h( ^* ]* f7 C
     // Thread.Sleep(1000 * 30); //30时间操作
                driver.FindElement(By.ClassName("password-login")).Click();
                Thread.Sleep(1000 * 30);//30时间操作
4、进入控制台,验证是否登陆成功。并记录Cookies,下次再来的时候,直接使用现成的Cookies,一般有效期可以维持一天多左右。* a$ \. Z. e, O& X3 S" F
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。
) `5 ~6 P8 x, E5 A; V& ~' q
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);
三、完整代码( [2 ^- g1 ~- `7 {9 g
  /// <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);
        }
四、注意事项" a9 N3 _3 b$ S& Z
1、登录的时候,有时候会出现滑块验证码,这时候一般是使用其他账号重试或者是在当前的机器手工登录一次,后面基本就会被信任。
8 J- t- Y$ j2 |2、使用这段代码本身就是模拟真实用户的行为,最大限度的减少验证码出现的几率。' C' v. ^8 n; h. N- A. j. H/ J
   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-10-14 10:34

Powered by paopaomj X3.5 © 2016-2025 sitemap

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