热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

c#爬虫1688官网自动登录

c#爬虫-1688官网自动登录-背景在1688官网里面有很多信息是需要登录才能看得到的,比如商家的联系电话等等。那么我们在抓取它的网页的时候,肯定是需要维持登录状态才能得到对应

背景

在1688官网里面有很多信息是需要登录才能看得到的,比如商家的联系电话等等。那么我们在抓取它的网页的时候,肯定是需要维持登录状态才能得到对应的内容。这里面就会涉及到自动登录的问题。

登录地址

https://login.1688.com/member/signin.htm

自动登录方法

1、找到对应的元素,账号、密码框。

2、把账号、密码值带进去。

  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(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、模拟点击提交按钮操作。

     // Thread.Sleep(1000 * 30); //30时间操作                driver.FindElement(By.ClassName("password-login")).Click();                Thread.Sleep(1000 * 30);//30时间操作

4、进入控制台,验证是否登陆成功。并记录COOKIEs,下次再来的时候,直接使用现成的COOKIEs,一般有效期可以维持一天多左右。

  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。

   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);

完整代码

  ///         /// 登录  todo        ///         /// <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(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);        }

注意事项

1、登录的时候,有时候会出现滑块验证码,这时候一般是使用其他账号重试或者是在当前的机器手工登录一次,后面基本就会被信任。

2、使用这段代码本身就是模拟真实用户的行为,最大限度的减少验证码出现的几率。

   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);

推荐阅读
author-avatar
jack2502937407
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有