QQ登录

只需要一步,快速开始

APP扫码登录

只需要一步,快速开始

查看: 4354|回复: 0

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

[复制链接]

等级头衔

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

丰功伟绩

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

联系方式
发表于 2022-4-12 07:51:04 | 显示全部楼层 |阅读模式
一、背景% Q! J) H% o7 I  F# G
       在1688官网里面有很多信息是需要登录才能看得到的,比如商家的联系电话等等。那么我们在抓取它的网页的时候,肯定是需要维持登录状态才能得到对应的内容。这里面就会涉及到自动登录的问题。) C# }4 U; _$ A4 o; t# }5 e* J
登录地址:https://login.1688.com/member/signin.htm1 A* |8 d5 v2 D2 k) C- i5 ~
1.jpg
$ }" l+ T/ I. ?( ^- i2 X0 Q. U3 _二、自动登录方法
6 X& l, A9 S- G' R1、找到对应的元素,账号、密码框。4 p; }& [2 w3 s; c4 u8 I$ i
2.jpg + V3 k/ g  C2 k9 E/ |- n: S
2、把账号、密码值带进去。
4 R& D& H& O/ Q3 A: l( ~
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、模拟点击提交按钮操作。
+ n1 @3 S4 I4 c. _
     // Thread.Sleep(1000 * 30); //30时间操作
                driver.FindElement(By.ClassName("password-login")).Click();
                Thread.Sleep(1000 * 30);//30时间操作
4、进入控制台,验证是否登陆成功。并记录Cookies,下次再来的时候,直接使用现成的Cookies,一般有效期可以维持一天多左右。
1 W4 F2 U: H/ i( v& B/ S6 R1 O
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。
- h' T) d" x: N/ @( _7 k
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);
三、完整代码
) M. L2 Z- h' F0 I9 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);
        }
四、注意事项7 i) W' Q- U: u( m
1、登录的时候,有时候会出现滑块验证码,这时候一般是使用其他账号重试或者是在当前的机器手工登录一次,后面基本就会被信任。1 ]5 y5 f) P4 c% z
2、使用这段代码本身就是模拟真实用户的行为,最大限度的减少验证码出现的几率。
. P' Y  \8 z. I1 s% F  w) q  T
   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, 2026-8-28 08:16

Powered by paopaomj X3.5 © 2016-2025 sitemap

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