QQ登录

只需要一步,快速开始

APP扫码登录

只需要一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

查看: 2399|回复: 0

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

[复制链接]

等级头衔

积分成就    金币 : 2841
   泡泡 : 1516
   精华 : 6
   在线时间 : 1294 小时
   最后登录 : 2024-11-21

丰功伟绩

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

联系方式
发表于 2022-4-12 07:51:04 | 显示全部楼层 |阅读模式
一、背景$ c9 o! l- Z: U2 X- l- J
       在1688官网里面有很多信息是需要登录才能看得到的,比如商家的联系电话等等。那么我们在抓取它的网页的时候,肯定是需要维持登录状态才能得到对应的内容。这里面就会涉及到自动登录的问题。# R% q1 @1 n; y, L3 W
登录地址:https://login.1688.com/member/signin.htm
" ]6 {( o' @; n& r 1.jpg
7 o+ t+ m  p/ ]5 q二、自动登录方法
6 O+ L7 P* u; e1、找到对应的元素,账号、密码框。% G3 M- b2 C+ G
2.jpg 6 f- G, k- Z5 H! H- p4 T6 w6 O
2、把账号、密码值带进去。
7 v& m% |7 A/ H
  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、模拟点击提交按钮操作。3 g  l# D! C" A  n/ q5 ?! @
  1.      // Thread.Sleep(1000 * 30); //30时间操作
  2.                 driver.FindElement(By.ClassName("password-login")).Click();
  3.                 Thread.Sleep(1000 * 30);//30时间操作
4、进入控制台,验证是否登陆成功。并记录Cookies,下次再来的时候,直接使用现成的Cookies,一般有效期可以维持一天多左右。& X$ K1 p9 u7 L7 I0 V- K! n
  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。8 n0 J/ y0 A  m4 b$ A3 r& @
  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);
三、完整代码
8 u# L8 y+ L5 C7 x  \4 I' ?1 r5 F
  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.         }
四、注意事项
2 f. J% ^6 h5 s7 Y1、登录的时候,有时候会出现滑块验证码,这时候一般是使用其他账号重试或者是在当前的机器手工登录一次,后面基本就会被信任。
( |! p* g. i0 a. M" s2、使用这段代码本身就是模拟真实用户的行为,最大限度的减少验证码出现的几率。
) Z  x  h  Y+ h* p3 D  m+ Q
  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号|渝公网安备50010502503914号 )

GMT+8, 2024-11-22 01:10

Powered by paopaomj X3.5 © 2016-2025 sitemap

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