草庐IT

C#-Selenium爬虫抓取(一)

Space-Junk 2024-03-15 原文

前言

Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。他能支持主流编程语言,以及拥有多种浏览器驱动。
用C#写爬虫确实是不方便,网上的资料也相对较少,但懒得配python的环境,所以选用了C#。本文用C#做了一些爬虫抓取的尝试,包括登录、抓取信息,筛选信息。Selenium的用法都是相同的,基础的操作用什么语言来写没什么差别,操作方法与逻辑也都可以在别的语言直接实现。
原理与逻辑:通过代码指令,识别分析前端语言并代替人手动操作如点击、输入、选择等操作,相比于人手更加的具有复用性,准确性。常用于定时签到(抢票类),以及大量的数据选取等操作。

环境与配置

选用Winform框架,配置Driver驱动:

引用(自动添加即可):

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.PhantomJS;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Windows.Forms;

chromedriver版本驱动安装
先Chrome检查版本号

并于http://chromedriver.storage.googleapis.com/index.html
下载对应版本驱动,添加下环境变量,安装位置在下述代码中用于启动驱动。

代码块示例

public void GetHtml(string url)
            {
                PhantomJSDriverService driverService = PhantomJSDriverService.CreateDefaultService();
                driverService.IgnoreSslErrors = true;
                ChromeOptions options = new ChromeOptions();
                options.AddArgument("--headless");
                options.AddArgument("--nogpu");
                //options.AddArguments(profile_directory);
                List<String> tagNmaeList = new List<string>();
                using (driver = new ChromeDriver(@"C:\Users\Downloads", options, TimeSpan.FromSeconds(120)))//启动驱动
                {
                    //Login(driver);
                    try
                    {
                        driver.Manage().Window.Maximize();
                        driver.Navigate().GoToUrl(url);
                        Thread.Sleep(5000);
                        string js1 = "login-qrcode__title__right";
                        string js2 = "js-tab-password-login";
                        string js3 = "js-login-btn";
                        //点击按钮
                        driver.FindElementByClassName(js1).Click();
                        driver.FindElementByClassName(js2).Click();
                        driver.FindElementsByClassName("zent-checkbox")[0].Click();//对勾选框的选择
                        driver.FindElementsByClassName("zent-checkbox")[1].Click();
                       //输入账号密码
                        driver.FindElementByClassName("zent-input").SendKeys("10001");
                        driver.FindElementByName("password").SendKeys("1234567");
                        Thread.Sleep(200);
                        driver.GetScreenshot().SaveAsFile("C:\\Users\\Desktop\\WebScreen.PNG",System.Drawing.Imaging.ImageFormat.Png);
                        driver.FindElementByClassName(js3).Click();
                        Thread.Sleep(200);//线程等待载入
                        Console.WriteLine(driver.PageSource); //输出网页源码
                        System.IO.File.WriteAllText(@"C:\Users\Desktop\WriteLines.txt", driver.PageSource);//输出到txt
                    }
                    catch (NoSuchElementException)
                    {
                        Console.WriteLine("找不到该元素"); ;
                    }
                }

            }
        }

各项动作功能介绍

1.通过元素识别
1.1通过类名识别,并点击:

driver.FindElementByClassName(str).Click();

如果是多项同名类,我们可以按序号来抓取到:

driver.FindElementsByClassName(str)[0].Click();
//注意差别           

1.2通过其他方式识别,如id等,如下:

2.识别元素后的操作
2.1密码块输入示例:

driver.FindElementByName("password").SendKeys("1234567");

2.2其他操作:
例如通过text抓取信息等

3.抓取页面信息
截取信息块PageSource输出:

System.IO.File.WriteAllText(@"C:\Users\Desktop\WriteLines.txt", driver.PageSource);//输出到txt

截图检查网页情况:

driver.GetScreenshot().SaveAsFile("C:\\Users\\Desktop\\WebScreen.PNG",System.Drawing.Imaging.ImageFormat.Png);

截取到的登录页面示例如下:

如此,便可以让驱动开始进行点击、输入等交互动作,从而完成页面跳转、登录,初步的抓取。抓取结果其实就是你在网页检查中看到的源代码,你需要获取的信息会夹在源代码中。

注意事项

1.url与类名的准确性,这个不用多说。
2.驱动的版本对应问题:
如果有这种问题,说明驱动版本号不对应,去Chrome检查版本号,按前文说明重新安装一下。

3.登录问题
登录过程中可能有其他的反爬机制,例如验证码与人机验证框,可以通过cookie跳过登录过程,这个以后再更新。

有关C#-Selenium爬虫抓取(一)的更多相关文章

  1. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  2. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  3. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  4. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  5. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

  6. ruby - 我需要从 facebook 游戏中抓取数据——使用 ruby - 2

    修改(澄清问题)我已经花了几天时间试图弄清楚如何从Facebook游戏中抓取特定信息;但是,我遇到了一堵又一堵砖墙。据我所知,主要问题如下。我可以使用Chrome的检查元素工具手动查找我需要的html-它似乎位于iframe中。但是,当我尝试抓取该iframe时,它​​是空的(属性除外):如果我使用浏览器的“查看页面源代码”工具,这与我看到的输出相同。我不明白为什么我看不到iframe中的数据。答案不是它是由AJAX之后添加的。(我知道这既是因为“查看页面源代码”可以读取Ajax添加的数据,也是因为我有b/c我一直等到我可以看到数据页面之后才抓取它,但它仍然不存在)。发生这种情况是因为

  7. RUBY - 网页抓取 - (OpenURI::HTTPError) - 2

    我正在尝试用ruby​​编写一个简单的网络抓取代码。它一直工作到第29个url,然后我收到此错误消息:C:/Ruby193/lib/ruby/1.9.1/open-uri.rb:346:in`open_http':500InternalServerError(OpenURI::HTTPError)fromC:/Ruby193/lib/ruby/1.9.1/open-uri.rb:775:in`buffer_open'fromC:/Ruby193/lib/ruby/1.9.1/open-uri.rb:203:in`blockinopen_loop'fromC:/Ruby193/lib/r

  8. ruby - 下载位置 Selenium-webdriver Cucumber Chrome - 2

    我将Cucumber与Ruby结合使用。通过Selenium-Webdriver在Chrome中运行测试时,我想将下载位置更改为测试文件夹而不是用户下载文件夹。我当前的chrome驱动程序是这样设置的:Capybara.default_driver=:seleniumCapybara.register_driver:seleniumdo|app|Capybara::Selenium::Driver.new(app,:browser=>:chrome,desired_capabilities:{'chromeOptions'=>{'args'=>%w{window-size=1920,1

  9. c# - C# 中的 Flatten Ruby 方法 - 2

    我如何做Ruby方法"Flatten"RubyMethod在C#中。此方法将锯齿状数组展平为一维数组。例如:s=[1,2,3]#=>[1,2,3]t=[4,5,6,[7,8]]#=>[4,5,6,[7,8]]a=[s,t,9,10]#=>[[1,2,3],[4,5,6,[7,8]],9,10]a.flatten#=>[1,2,3,4,5,6,7,8,9,10 最佳答案 递归解决方案:IEnumerableFlatten(IEnumerablearray){foreach(variteminarray){if(itemisIEnume

  10. ruby - 可以像在 C# 中使用#region 一样在 Ruby 中使用 begin/end 吗? - 2

    我最近从C#转向了Ruby,我发现自己无法制作可折叠的标记代码区域。我只是想到做这种事情应该没问题:classExamplebegin#agroupofmethodsdefmethod1..enddefmethod2..endenddefmethod3..endend...但是这样做真的可以吗?method1和method2最终与method3是同一种东西吗?还是有一些我还没有见过的用于执行此操作的Ruby惯用语? 最佳答案 正如其他人所说,这不会改变方法定义。但是,如果要标记方法组,为什么不使用Ruby语义来标记它们呢?您可以使用

随机推荐