掌握使用Selenium的方法轻松爬资源

为了了解网络资源抓取的基础知识,主要是学习如何利用不同的框架和请求库。通过对各种HTTP方法(主要是GET和POST)的理解,网络抓取变得容易得多。 

例如,Selenium比较有名,大家也经常用,是帮助网络浏览器实现自动化交互的工具之一。通过将其与其他技术(例如BeautifulSoup)一起使用,您可以更好地掌握网络资源抓取的基础知识。

Selenium如何工作?它可以自动执行您编写的脚本过程,因为脚本需要与浏览器进行交互,执行一些重复的任务,例如单击,滚动等。如Selenium官方网页所述,它“主要是为了测试而使网络应用程序自动化,但肯定不仅限于此。”

在本指南中,关于如何使用Selenium进行网络资源抓取,我们将使用Python3.x作为我们的主要输入语言(因为它不仅是最常用的抓取语言,而且也是我们工作中经常使用的一种语言)。 

设置Selenium

首先,下载Selenium软件包,在终端中执行pip命令:

pip install selenium

您还需要安装Selenium驱动程序,因为它使python能够在操作系统级别的交互中控制浏览器。手动安装,就可以通过PATH变量进行访问。 

您可以从

https://pypi.org/project/selenium/#drivers

下载Firefox,Chrome和Edge的驱动程序。

快速入门Selenium

让我们启动浏览器开始自动化:

  • 打开一个新的浏览器窗口(在本例中为Firefox) 
  • 加载您选择的页面(我们提供的URL)
from selenium import webdriver
browser = webdriver.Firefox()
browser.get('http://oxylabs.io/')

这将以头部模式启动它。为了以无头模式运行浏览器并在服务器上运行它,它应该看起来像这样: 

from selenium import webdriver
from selenium.webdriver.firefox.options import Options

options = Options()
options.headless = True
options.add_argument("--window-size=1920,1200")

driver = webdriver.firefox(options=options, executable_path=DRIVER_PATH)
driver.get("https://www.oxylabs.io/")
print(driver.page_source)
driver.quit()

execute_path = DRIVER_PATH
)driver.get(“https://www.oxylabs.io/”)
print(driver.page_source)
driver.quit()

定位元素

find_element 

Selenium提供了多种功能来帮助定位页面上的元素: 

  • find_element_by_id
  • find_element_by_name
  • find_element_by_xpath
  • find_element_by_link_text(使用文本值查找元素)
  • find_element_by_partial_link_text [通过匹配超链接文本的某些部分来查找元素(锚标记)]
  • find_element_by_tag_name
  • find_element_by_class_name
  • find_element_by_css_selector(用CSS选择器查找id类来找到元素)

例如,让我们尝试使用Selenium在oxylabs.io主页上找到H1标签: 

<html>
    <head>
        ... something
    </head>
    <body>
        <h1class="someclass" id="greatID"> Partner Up With ProxyExperts</h1>
    </body>
</html>

h1 = driver.find_element_by_name('h1')
h1 = driver.find_element_by_class_name('someclass')
h1 = driver.find_element_by_xpath('//h1')
h1 = driver.find_element_by_id('greatID')
掌握使用Selenium的方法轻松爬资源
掌握使用Selenium的方法轻松爬资源 1


您还可以使用find_elements(复数形式)返回元素列表。例如: 

all_links = driver.find_elements_by_tag_name('a')

这样,您将在页面中获得所有锚点。 

但是,使用ID或简单的类不容易访问某些元素。这就是为什么您需要XPath的原因。

XPath

XPath是一种语法语言,可以帮助您在

https://www.w3schools.com/js/js_htmldom.asp

查找特定对象。XPath语法通过绝对路径或相对路径从根元素中找到节点。例如: 

  • /:从根目录中选择节点。/ html / body / div [1]将找到第一个div
  • //:无论当前节点在哪里,都从当前节点中选择节点。// form [1]将找到第一个表单元素
  • [@ attributename =’value’]:说明。它查找特定的节点或具有特定值的节点。

例:

//input[@name='email'] will find the first input element with the name "email".

<html> 
 <body> 
   <div> 
     <form id="loginForm"> 
         <div> 
            <inputtype="text" name="email" value="EmailAddress:"> 
            <inputtype="password"name="password"value="Password:"> 
         </div> 
        <buttontype="submit">Submit</button> 
     </form> 
   </div> 
 </body> 
</html>

Web元素

Selenium中的WebElement表示一个HTML元素。以下是最常用的操作: 

  • element.text(访问文本元素)
  • element.click()(单击元素) 
  • element.get_attribute(’class’)(访问属性) 
  • element.send_keys(’mypassword’)(将文本发送到输入项)

慢速网站渲染解决方案

一些网站使用了大量的JavaScript来呈现内容,并且由于它们使用了大量的AJAX调用而难以处理。下面是几种解决方法:

  • time.sleep(ARBITRARY_TIME)
  • WebDriverWait()

例:

try:    
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID,"mySuperId"))
    )
finally:
    driver.quit()

这将允许在10秒钟后加载定位的元素。要深入研究该主题,请继续阅读Selenium官方文档。

Selenium与资源爬取利器Real-Time Crawler对比

如果您想学习网页抓取,Selenium非常有用。我们建议将它与BeautifulSoup一起使用,并重点学习HTTP协议,服务器和浏览器如何交换数据以及cookieheaders如何工作的方法。

然而,如果您正在寻找一种更简单的网络资源抓取方法,可以有不少工具来帮助您完成此过程。根据您的抓取项目的规模和目标,选择不同的网络资源抓取工具将为您节省大量时间和资源。

在Oxylabs,我们提供了一个称为Real-Time Crawler的工具。它具有两个主要功能:

  • 数据API –专注于电子商务和搜索引擎网站,并允许您接收JSON里的结构化数据
  • HTML Crawler API –第二种功能使您可以对大多数HTML网站进行数据抓取

Real-Time Crawler也很容易集成,这是针对Python的:


    import requests

  from pprint import pprint

  # Structure payload.

  payload = {

    'source': 'universal',

    'url': 'https://stackoverflow.com/questions/tagged/python',

    'user_agent_type': 'desktop',

  }


  # Get response.

  response = requests.request(

    'POST',

    'https://realtime.oxylabs.io/v1/queries',

    auth=('user', 'pass1'),

    json=payload,

  )

  # This will return the JSON response with results.

  pprint(response.json())

提供了其他语言的更多集成示例(shellPHPcurl)。 

Selenium相比,Real-Time Crawler的主要优点是: 

  • 所有网页抓取过程都是自动化的
  • 无需额外编码
  • 轻松扩展 
  • 每个成功请求保证100%成功率
  • 具有内置的代理轮换工具

结论

Selenium是用于Web抓取的好工具,尤其是在学习基础知识时。但是,根据您的目标,有时选择一个已经为您进行网络抓取的内置工具会更容易。构建自己的抓取工具是一个漫长且耗费资源的过程,而且花费不值得的时间和精力。