为了了解网络资源抓取的基础知识,主要是学习如何利用不同的框架和请求库。通过对各种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')
您还可以使用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协议,服务器和浏览器如何交换数据以及cookie和headers如何工作的方法。
然而,如果您正在寻找一种更简单的网络资源抓取方法,可以有不少工具来帮助您完成此过程。根据您的抓取项目的规模和目标,选择不同的网络资源抓取工具将为您节省大量时间和资源。
在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())
提供了其他语言的更多集成示例(shell,PHP,curl)。
与Selenium相比,Real-Time Crawler的主要优点是:
- 所有网页抓取过程都是自动化的
- 无需额外编码
- 轻松扩展
- 每个成功请求保证100%成功率
- 具有内置的代理轮换工具
结论
Selenium是用于Web抓取的好工具,尤其是在学习基础知识时。但是,根据您的目标,有时选择一个已经为您进行网络抓取的内置工具会更容易。构建自己的抓取工具是一个漫长且耗费资源的过程,而且花费不值得的时间和精力。