千家信息网

怎么用C#+Selenium+ChromeDriver爬取网页,模拟真实的用户浏览行为

发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,本篇内容介绍了"怎么用C#+Selenium+ChromeDriver爬取网页,模拟真实的用户浏览行为"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何
千家信息网最后更新 2025年01月16日怎么用C#+Selenium+ChromeDriver爬取网页,模拟真实的用户浏览行为

本篇内容介绍了"怎么用C#+Selenium+ChromeDriver爬取网页,模拟真实的用户浏览行为"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

背景

Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。而对于爬虫来说,使用Selenium操控浏览器来爬取网上的数据那么肯定是爬虫中的杀手武器。这里,我将介绍selenium + 谷歌浏览器的一般使用。

需求

在平常的爬虫开发中,有时候网页是一堆js堆起来的代码,涉及很多异步计算,如果是普通的http 控制台请求,那么得到的源文件是一堆js ,需要自己在去组装数据,很费力;但是采用Selenium+ChromeDriver可以达到所见即所得的完美效果。

实现方式

项目结构:为了方便使用,用的winform程序,附nuget包

以下是form1.cs的代码,这里就只放关键方法代码了。需要安装最新的chrome浏览器+代码中使用的chromedriver是 v2.9.248315

  1. private void crawlingWebFunc()

  2. {

  3. SetText("\r\n开始尝试...");

  4. List surls = new List();

  5. string path = System.Environment.CurrentDirectory + "\\图片url\\";

  6. DirectoryInfo root = new DirectoryInfo(path);

  7. DirectoryInfo[] dics = root.GetDirectories();

  8. foreach (var itemdic in dics)

  9. {

  10. string txt = "";

  11. StreamReader sr = new StreamReader(itemdic.FullName + "\\data.txt");

  12. while (!sr.EndOfStream)

  13. {

  14. string str = sr.ReadLine();

  15. txt += str;// + "\n";

  16. }

  17. sr.Close();

  18. surls.Add(new testfold() { key = itemdic.FullName, picurl = txt });

  19. }

  20. ChromeDriverService service = ChromeDriverService.CreateDefaultService(System.Environment.CurrentDirectory);

  21. // service.HideCommandPromptWindow = true;

  22. ChromeOptions options = new ChromeOptions();

  23. options.AddArguments("--test-type", "--ignore-certificate-errors");

  24. options.AddArgument("enable-automation");

  25. // options.AddArgument("headless");

  26. // options.AddArguments("--proxy-server=http://user:password@yourProxyServer.com:8080");

  27. using (IWebDriver driver = new OpenQA.Selenium.Chrome.ChromeDriver(service, options, TimeSpan.FromSeconds(120)))

  28. {

  29. driver.Url = "https://www.1688.com/";

  30. Thread.Sleep(200);

  31. try

  32. {

  33. int a = 1;

  34. foreach (var itemsurls in surls)

  35. {

  36. SetText("\r\n第" + a.ToString() + "个");

  37. driver.Navigate().GoToUrl(itemsurls.picurl);

  38. //登录

  39. if (driver.Url.Contains("login.1688.com"))

  40. {

  41. SetText("\r\n需要登录,开始尝试...");

  42. trylogin(driver); //尝试登录完成

  43. //再试试

  44. driver.Navigate().GoToUrl("https://s.1688.com/youyuan/index.htm?tab=imageSearch&imageType=oss&imageAddress=cbuimgsearch/eWXC7XHHPN1607529600000&spm=");

  45. if (driver.Url.Contains("login.1688.com"))

  46. {

  47. //没办法退出

  48. SetText("\r\n退出,换ip重试...");

  49. return;

  50. }

  51. }

  52. //鼠标放上去的内容因为页面自带只能显示一个的原因 没办法做到全部显示 然后在下载 只能是其他方式下载

  53. // var elements = document.getElementsByClassName('hover-container');

  54. // Array.prototype.forEach.call(elements, function(element) {

  55. // element.style.display = "block";

  56. // console.log(element);

  57. // });

  58. // IJavaScriptExecutor js = (IJavaScriptExecutor)driver;

  59. // var sss = js.ExecuteScript(" var elements = document.getElementsByClassName('hover-container'); Array.prototype.forEach.call(elements, function(element) { console.log(element); element.setAttribute(\"class\", \"测试title\"); element.style.display = \"block\"; console.log(element); });");

  60. Thread.Sleep(500);

  61. var responseModel = Write(itemsurls.key, driver.PageSource, Pagetypeenum.列表);

  62. Thread.Sleep(500);

  63. int i = 1;

  64. foreach (var offer in responseModel?.data?.offerList ?? new List())

  65. {

  66. driver.Navigate().GoToUrl(offer.information.detailUrl);

  67. string responseDatadetail = driver.PageSource;

  68. Write(itemsurls.key, driver.PageSource, Pagetypeenum.详情);

  69. SetText("\r\n第" + a.ToString() + "-" + i.ToString() + "个");

  70. Thread.Sleep(500);

  71. i++;

  72. }

  73. }

  74. }

  75. catch (Exception ex)

  76. {

  77. CloseChromeDriver(driver);

  78. throw;

  79. }

  80. }

  81. }


#region 异常  退出chromedriver          [DllImport("user32.dll", EntryPoint = "FindWindow")]         private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);          [DllImport("user32.dll", EntryPoint = "SendMessage")]         public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);          public const int SW_HIDE = 0;         public const int SW_SHOW = 5;          [DllImport("user32.dll", EntryPoint = "ShowWindow")]         public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);          ///          /// 获取窗口句柄         ///          ///          public IntPtr GetWindowHandle()         {             string name = (Environment.CurrentDirectory + "\\chromedriver.exe");             IntPtr hwd = FindWindow(null, name);             return hwd;         }          ///          /// 关闭chromedriver窗口         ///          public void CloseWindow()         {             try             {                 IntPtr hwd = GetWindowHandle();                 SendMessage(hwd, 0x10, 0, 0);             }             catch { }         }          ///          /// 退出chromedriver         ///          ///          public void CloseChromeDriver(IWebDriver driver)         {             try             {                 driver.Quit();                 driver.Dispose();             }             catch { }             CloseWindow();         }          #endregion 异常  退出chromedriver

效果

总结

说一下思路:

1.跳转到指定的网页driver.Navigate().GoToUrl

2.确定数据源,从driver.PageSource读取数据

3.对html数据进行解析

"怎么用C#+Selenium+ChromeDriver爬取网页,模拟真实的用户浏览行为"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

0