软文采集器(数据玩家:如果手头上没有数据怎么办?那很容易!)

优采云 发布时间: 2022-03-14 12:08

  软文采集器(数据玩家:如果手头上没有数据怎么办?那很容易!)

  作为“数据玩家”,手头没有数据怎么办?当然,用代码自动化采集数据,但现在“爬虫”可没那么容易了,其中最难的是突破网站的各种反爬机制。本系列将全面讲解.NET中一个非常成熟的库——selenium,并教你如何使用它在网络上爬取你需要的数据

  虽然自动爬虫很方便,但希望大家可以考虑到网站服务器的承受能力,不要频繁访问网站。永远不要采集敏感数据!!否则很容易“从入门到监狱”

  本系列大部分案例都是selenium和puppeteerSharp库同时讲解的,并且有Python和C#2语言的实现文章,详情请到公众号目录。

  前言

  学习任何库,首先要了解库的机制和流程。今天,我们将从一个小例子开始我们的学习之旅。

  搜索和采集结果的标题

  要求如下:

  这是vs上完整编码过程的视频,一些关键点的解释请看文章:

  硒的问题

  这个系列一直围绕着一个点:“用代码操作浏览器”,我们来看看整个过程:

  

  

  然而,市面上的浏览器种类繁多,甚至一个厂商的浏览器版本也不同。我们如何保证我们的代码只需要编写一次就可以控制不同的浏览器?

  更深入的流程图如下:

  

  

  “案子怎么还没开始,就说硒不是?我还在学吗?”

  他有以下优点:

  缺点:

  如果觉得无法接受 selenium 的缺点,可以查看 PuppeteerSharp 的相关文章(公众号:Data Universe > Crawler-PuppeteerSharp > C#)

  得到驱动

  现在让我们开始使用 selenium 来解决我们的需求。

  由于我在本地安装了谷歌Chrome浏览器,打开浏览器查看浏览器的版本:

  

  

  

  

  然后去相关的网站(公众号发送“爬虫”)下载对应的驱动:

  

  

  

  都准备好了

  看过我相关教学文章的人都知道,我喜欢从语义的角度去理解和学习图书馆。

  Selenium 本质上控制着浏览器,所以我们在使用它的时候,代码的语义应该类似于手动操作浏览器的过程。

  首先,Nuget安装相关库“Selenium.Support”,操作过程见文章开头的操作视频。

  本文所需的命名空间:

  1使用OpenQA.Selenium;

  2使用OpenQA.Selenium.Chrome;3使用OpenQA.Selenium.Support.UI;

  让我们看看如何使用代码来描述我们的手动操作。

  打开浏览器:

  1使用(vardriver=newChromeDriver())

  2{34}

  确实,我们只是下载了驱动程序,但是程序怎么知道在哪里可以找到该驱动程序呢?

  我们可以在实例化浏览器对象的时候传入一个文件路径,告诉他程序的具体位置:

  1使用(vardriver=newChromeDriver(@"D:xxxchromedriver.exe"))

  2{34}

  输入百度搜索的网址:

  1使用(vardriver=newChromeDriver(@"D:xxxchromedriver.exe"))

  2{3driver.Url="";4}

  将鼠标移动到输入框,点击一次,然后输入内容“爬虫”:

  这里的问题是,如何在代码中表达“鼠标到输入框,点击一次”?

  其实selenium确实可以模拟鼠标移动等操作(网站的一些登录验证码需要用鼠标拉动拼图来模拟),但是目前的情况下,我们不应该模拟鼠标,而是根据html标签定位。.

  此时,我们可以使用浏览器的“开发者功能”进行定位。

  限于篇幅,本文不详细讲解“开发者功能”的所有操作,详细讲解会放在公众号目录:数据宇宙>爬虫工具>系列文章

  

  

  下面用一张动态图来展示操作过程:

  

  

  看一下代码:

  1使用(vardriver=newChromeDriver(@"D:xxxchromedriver.exe"))

  2{3driver.Url="";45varinput=driver.FindElementByCssSelector("#kw");6}

  接下来,输入内容“爬虫”:

  1使用(vardriver=newChromeDriver(@"D:xxxchromedriver.exe"))

  2{3driver.Url="";45varinput=driver.FindElementByCssSelector("#kw");6input.SendKeys("Crawler");7}

  我们继续模拟点击输入框右侧的“百度点击”按钮。

  同样使用“开发人员功能”,找到元素并复制 css 选择器表达式字符串:

  1使用(vardriver=newChromeDriver(@"D:xxxchromedriver.exe"))

  2{ 3driver.Url=""; 4 5varinput=driver.FindElementByCssSelector("#kw"); 6input.SendKeys("爬虫"); 7 8varbtn=driver.FindElementByCssSelector("#su"); 9btn.Click(); 10}

  所有结果的主标题:

  这对初学者来说可能有点困难,因为这一次我们需要同时选择多个元素(多个搜索结果的主标题),并查看定位到的标签:

  

  

  仔细看看我们需要的主要标题在哪里:

  

  

  所以,现在我们将使用 CSS 选择器来表达以下语义: 在 div 内部 (id=content_left),在 h3 标记内部的 a 标记文本。div 和 h3 之间可能有多层嵌套。

  生成的选择器表达式如下:

  

  调用代码如下:

  1使用(vardriver=newChromeDriver(@"D:xxxchromedriver.exe"))

  2{ 3driver.Url=""; 4 5varinput=driver.FindElementByCssSelector("#kw"); 6input.SendKeys("爬虫"); 7 8varbtn=driver.FindElementByCssSelector("#su"); 9btn.Click(); 1011vartitleSelector="div#content_lefth3>a";12vartitles=driver.FindElementsByCssSelector(titleSelector);1314foreach(varitemintitles)15{16Console.WriteLine(item.Text);17}18}代码执行太快

  上面的代码之所以没有得到任何结果,是因为执行第10行的代码时,页面上还没有加载任何结果。

  如果一个人正在操作浏览器,那么你应该对他说:嘿,直到你看到那些结果,你去提取主标题。

  怎么说“直到你看到那些结果”?,selenium有一种特殊的等待元素出现的机制,代码如下:

  1使用(vardriver=newChromeDriver(@"D:xxxchromedriver.exe"))

  2{ 3driver.Url=""; 4 5varinput=driver.FindElementByCssSelector("#kw"); 6input.SendKeys("爬虫"); 7 8varbtn=driver.FindElementByCssSelector("#su"); 9btn.Click(); 1011varwait=newWebDriverWait(driver,TimeSpan.FromSeconds(10));12wait.IgnoreExceptionTypes(typeof(WebDriverException));1314vartitleSelector="div#content_lefth3>a";15wait.Until(wd=>wd.FindElement(By .CssSelector(titleSelector)));16vartitles=driver.FindElementsByCssSelector(titleSelector);1718foreach(varitemintitles)19{20Console.WriteLine(item.Text);21}2223Console.WriteLine("done");24Console.ReadKey();25 C# 与 Python 的代码实现有点不同

  为什么要在这里等着找两句代码呢?(Python见文章,你会发现Python可以直接等待并返回结果)

  由于该库的 .NET 版本在 FindElementsXXX 方法的实现方面存在问题,因此无法适应在 Wait 对象的 Until 方法中使用。下一节将详细讲解层级机制,并教大家如何自定义各种等待方法的实现,让这里的代码调用得到彻底的改进。

  它甚至可以创建比 Python 更方便的调用方式。

  总结

  使用代码控制 selenium 与手动操作基本相同。一般流程是:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线