QQ登录

只需要一步,快速开始

APP扫码登录

只需要一步,快速开始

手机号码,快捷登录

泡泡马甲APP 更多内容请下载泡泡马甲手机客户端APP 立即下载 ×
查看: 2298|回复: 0

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

[复制链接]

等级头衔

积分成就    金币 : 2806
   泡泡 : 1516
   精华 : 6
   在线时间 : 1244 小时
   最后登录 : 2024-5-5

丰功伟绩

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

联系方式
发表于 2022-4-12 07:51:04 | 显示全部楼层 |阅读模式
一、背景
! e% Z! B& q. M" I+ Q" S& _- Y       在1688官网里面有很多信息是需要登录才能看得到的,比如商家的联系电话等等。那么我们在抓取它的网页的时候,肯定是需要维持登录状态才能得到对应的内容。这里面就会涉及到自动登录的问题。
# H1 k/ x9 B- p登录地址:https://login.1688.com/member/signin.htm8 N  T; d& u4 W" P& [$ [! v, \
1.jpg
, M1 g- M1 B6 j二、自动登录方法
; N2 ^+ Y# `& `# ^6 ^6 F% y1、找到对应的元素,账号、密码框。0 b% U. T: H( @. B! _( m6 \
2.jpg & p( l# J! w9 U7 c
2、把账号、密码值带进去。( G( d8 G. i9 g3 J8 D' u3 `$ ~$ Y
  1. List<string> logininfolist = new List<string>();
  2.                 string file = "1688Account.json";
  3.                 if (!File.Exists(file))
  4.                 {
  5.                     throw new ArgumentException("1688Account  not found");
  6.                 }
  7.                 string data = File.ReadAllText(file, Encoding.UTF8);
  8.                 var account1688list = JsonConvert.DeserializeObject<List<Account1688Item>>(data);
  9.                 logininfolist.AddRange(account1688list.Select(o => o.AccountPassword).ToList());
  10.                 Random rdinfo = new Random();
  11.                 int indexinfo = rdinfo.Next(logininfolist.Count);
  12.                 var modelinfo = logininfolist[indexinfo];
  13.                 driver.FindElement(By.Id("fm-login-id")).SendKeys(modelinfo.Split('+')[0]);
  14.                 driver.FindElement(By.Id("fm-login-password")).SendKeys(modelinfo.Split('+')[1]);
3、模拟点击提交按钮操作。
' H) K7 N/ q+ t% a  y! U4 I* U
  1.      // Thread.Sleep(1000 * 30); //30时间操作
  2.                 driver.FindElement(By.ClassName("password-login")).Click();
  3.                 Thread.Sleep(1000 * 30);//30时间操作
4、进入控制台,验证是否登陆成功。并记录Cookies,下次再来的时候,直接使用现成的Cookies,一般有效期可以维持一天多左右。
0 ~- g1 E. S( z4 g3 t$ H
  1. driver.Navigate().GoToUrl("https://work.1688.com/?tracelog=login_target_is_blank_1688");
  2.                 Thread.Sleep(1000 * 5);
  3.                 if (driver.Url.Contains("login.1688.com"))
  4.                 {
  5.                     Console.WriteLine("登录失败");
  6.                     CookieHelp.DeleteCookies();
  7.                     Console.WriteLine("2");
  8.                     throw new Exception("重新登录");
  9.                 }
  10.                 driver.Navigate().Refresh();
  11.                 CookieHelp.WriteCookies(driver.Manage().Cookies.AllCookies);
5、判断是否有现成的登录cookies。
2 ~9 u7 L: H* {
  1. driver.Navigate().GoToUrl("https://www.1688.com/");
  2.             driver.Manage().Cookies.DeleteAllCookies();
  3.             var listCookie = CookieHelp.GetCookie();
  4.             if (listCookie != null)
  5.             {
  6.                 logintry = 0;
  7.                 Console.WriteLine("有现成cookies" + DateTime.UtcNow);
  8.                 foreach (var item in listCookie)
  9.                 {
  10.                     driver.Manage().Cookies.AddCookie(new Cookie(item.Name, item.Value, item.Domain, item.Path, item.Expiry));
  11.                 }
  12.                 Thread.Sleep(2000);
  13.                 driver.Navigate().GoToUrl("https://work.1688.com/?tracelog=login_target_is_blank_1688");
  14.                 Thread.Sleep(1000 * 2);
三、完整代码6 R8 s/ y( |1 z- i% e2 z
  1.   /// <summary>
  2.         /// 登录  todo
  3.         /// </summary>
  4.         /// <param name="_reptilesImageSearchService"></param>
  5.         /// <param name="options"></param>
  6.         /// <param name="driver"></param>
  7.         public void Implement(IReptilesImageSearchService _reptilesImageSearchService, IWebDriver driver)
  8.         {
  9.             driver.Navigate().GoToUrl("https://www.1688.com/");
  10.             driver.Manage().Cookies.DeleteAllCookies();
  11.             var listCookie = CookieHelp.GetCookie();
  12.             if (listCookie != null)
  13.             {
  14.                 logintry = 0;
  15.                 Console.WriteLine("有现成cookies" + DateTime.UtcNow);
  16.                 foreach (var item in listCookie)
  17.                 {
  18.                     driver.Manage().Cookies.AddCookie(new Cookie(item.Name, item.Value, item.Domain, item.Path, item.Expiry));
  19.                 }
  20.                 Thread.Sleep(2000);
  21.                 driver.Navigate().GoToUrl("https://work.1688.com/?tracelog=login_target_is_blank_1688");
  22.                 Thread.Sleep(1000 * 2);
  23.                 if (driver.Url.Contains("login.1688.com"))
  24.                 {
  25.                     Console.WriteLine("cookies过期了");
  26.                     CookieHelp.DeleteCookies();
  27.                     Console.WriteLine("1");
  28.                     throw new Exception("重新登录");
  29.                 }
  30.             }
  31.             else
  32.             {
  33.                 if (logintry > 4)
  34.                 {
  35.                     Console.WriteLine("登陆次数超出:" + logintry);
  36.                     throw new Exception("登陆次数超出,退出");
  37.                 }
  38.                 logintry++;
  39.                 Console.WriteLine("无现成cookies" + DateTime.UtcNow);
  40.                 driver.Navigate().GoToUrl("https://login.1688.com/member/signin.htm");
  41.                 #region 登录动作
  42.                 driver.SwitchTo().Frame(0);
  43.                 IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
  44.                 //////  string returnjs = (string)js.ExecuteScript("Object.defineProperties(navigator, {webdriver:{get:()=>undefined}});");
  45.                 string jsfile = File.ReadAllText("stealth.min.js", Encoding.UTF8);
  46.                 string returnjs = (string)js.ExecuteScript(jsfile);
  47.                 List<string> logininfolist = new List<string>();
  48.                 string file = "1688Account.json";
  49.                 if (!File.Exists(file))
  50.                 {
  51.                     throw new ArgumentException("1688Account  not found");
  52.                 }
  53.                 string data = File.ReadAllText(file, Encoding.UTF8);
  54.                 var account1688list = JsonConvert.DeserializeObject<List<Account1688Item>>(data);
  55.                 logininfolist.AddRange(account1688list.Select(o => o.AccountPassword).ToList());
  56.                 Random rdinfo = new Random();
  57.                 int indexinfo = rdinfo.Next(logininfolist.Count);
  58.                 var modelinfo = logininfolist[indexinfo];
  59.                 driver.FindElement(By.Id("fm-login-id")).SendKeys(modelinfo.Split('+')[0]);
  60.                 driver.FindElement(By.Id("fm-login-password")).SendKeys(modelinfo.Split('+')[1]);
  61.                 // Thread.Sleep(1000 * 30); //30时间操作
  62.                 driver.FindElement(By.ClassName("password-login")).Click();
  63.                 Thread.Sleep(1000 * 30);//30时间操作
  64.                 #endregion 登录动作
  65.                 driver.Navigate().GoToUrl("https://work.1688.com/?tracelog=login_target_is_blank_1688");
  66.                 Thread.Sleep(1000 * 5);
  67.                 if (driver.Url.Contains("login.1688.com"))
  68.                 {
  69.                     Console.WriteLine("登录失败");
  70.                     CookieHelp.DeleteCookies();
  71.                     Console.WriteLine("2");
  72.                     throw new Exception("重新登录");
  73.                 }
  74.                 driver.Navigate().Refresh();
  75.                 CookieHelp.WriteCookies(driver.Manage().Cookies.AllCookies);
  76.             }
  77.             Thread.Sleep(1000);
  78.         }
四、注意事项
/ K% A9 n# \0 e' R9 z1、登录的时候,有时候会出现滑块验证码,这时候一般是使用其他账号重试或者是在当前的机器手工登录一次,后面基本就会被信任。  J, ~) j8 ^3 f+ ?
2、使用这段代码本身就是模拟真实用户的行为,最大限度的减少验证码出现的几率。
* l) C% ]; O6 Q+ _1 b( e' V+ p
  1.    IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
  2.                 //////  string returnjs = (string)js.ExecuteScript("Object.defineProperties(navigator, {webdriver:{get:()=>undefined}});");
  3.                 string jsfile = File.ReadAllText("stealth.min.js", Encoding.UTF8);
  4.                 string returnjs = (string)js.ExecuteScript(jsfile);
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|paopaomj.COM ( 渝ICP备18007172号 )

GMT+8, 2024-5-10 08:19

Powered by paopaomj X3.4 © 2016-2024 sitemap

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