QQ登录

只需要一步,快速开始

APP扫码登录

只需要一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

查看: 2533|回复: 0

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

[复制链接]

等级头衔

积分成就    金币 : 2857
   泡泡 : 1516
   精华 : 6
   在线时间 : 1317 小时
   最后登录 : 2025-2-28

丰功伟绩

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

联系方式
发表于 2022-4-12 07:51:04 | 显示全部楼层 |阅读模式
一、背景0 r8 s* r% M) r/ x5 U) k% {, D* e
       在1688官网里面有很多信息是需要登录才能看得到的,比如商家的联系电话等等。那么我们在抓取它的网页的时候,肯定是需要维持登录状态才能得到对应的内容。这里面就会涉及到自动登录的问题。
! w# t7 b+ i' |7 h6 \/ g2 v, K登录地址:https://login.1688.com/member/signin.htm
. ]3 b  p9 }+ v8 b9 D3 H9 _1 h0 P 1.jpg
- g2 b7 @3 h8 b# B  u二、自动登录方法8 Q9 s5 t# N1 s% M& U
1、找到对应的元素,账号、密码框。% \! l5 e' N8 c+ w( `1 X0 [( d
2.jpg % }& l& r; J7 c+ R' G
2、把账号、密码值带进去。
+ Y0 I" \0 F, K9 X9 L# E  o. y# h
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、模拟点击提交按钮操作。# d; f4 s/ ?! b2 a  {! t% l
     // Thread.Sleep(1000 * 30); //30时间操作
                driver.FindElement(By.ClassName("password-login")).Click();
                Thread.Sleep(1000 * 30);//30时间操作
4、进入控制台,验证是否登陆成功。并记录Cookies,下次再来的时候,直接使用现成的Cookies,一般有效期可以维持一天多左右。% ~4 e, w4 H: {5 \: z
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。7 m  N! M" Q3 D, u* p7 B
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);
三、完整代码' o! C; G6 M& g. a5 W8 ]
  /// <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);
        }
四、注意事项. p" ]6 R6 i# i; W+ q
1、登录的时候,有时候会出现滑块验证码,这时候一般是使用其他账号重试或者是在当前的机器手工登录一次,后面基本就会被信任。
( H7 L+ Y0 ], F! H2、使用这段代码本身就是模拟真实用户的行为,最大限度的减少验证码出现的几率。
+ G3 W- S) b# I3 \5 ]- g9 x
   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-3-14 15:17

Powered by paopaomj X3.5 © 2016-2025 sitemap

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