java爬虫抓取动态网页(Selenium+Chrome:运用到爬虫中的思路是什么?)
优采云 发布时间: 2021-09-21 14:10java爬虫抓取动态网页(Selenium+Chrome:运用到爬虫中的思路是什么?)
爬虫:动态网页的处理方法(第2部分)——模拟浏览器行为前言:
在上一个示例中,我们使用WebKit库自定义浏览器渲染引擎,以便完全控制要执行的行为。如果您不需要如此多的灵活性,那么有一个很好的替代方案来替代selenium,它提供了一个API接口来自动化浏览器
硒简介:
Selenium是一种用于测试web应用程序的工具。Selenium测试直接在浏览器中运行,就像真实用户一样。支持市场上几乎所有主流浏览器
最初,我打算使用selenium+phantom JS的组合,但我发现chrome和Firefox也相继推出了无头浏览器模式,我更喜欢chrome。本文采用硒+铬的组合
例如:
适用于爬行动物的想法是:
以新浪阅读图书节选网站为例。目标是获取列表中每个文章详细页面的地址。直接参见示例代码:
# coding=utf-8
import time
from selenium import webdriver
class SinaBookSpider(object):
# 创建可见的Chrome浏览器, 方便调试
driver = webdriver.Chrome()
# 创建Chrome的无头浏览器
# opt = webdriver.ChromeOptions()
# opt.set_headless()
# driver = webdriver.Chrome(options=opt)
driver.implicitly_wait(10)
total = 1526 # 预先计算的总数据量
count = 0 # 已爬取的数据量
# 记录解析以及翻页位置
location = 0
click_times = 0
def run(self):
"""
开始爬虫
:return:
"""
# get方式打开网页
self.driver.get("http://book.sina.com.cn/excerpt/rwws/")
self.parselist()
while self.count < self.total:
if self.click_times is 2:
self.driver.find_element_by_css_selector('#subShowContent1_page > span:nth-child(6) > a').click()
# 等待页面加载完成
time.sleep(5)
self.click_times = 0
self.location = 0
else:
self.driver.find_element_by_css_selector('#subShowContent1_loadMore').click()
# 等待页面加载完成
time.sleep(3)
self.click_times += 1
# 分析加载的新内容,从location开始
self.parselist()
self.driver.quit()
def parselist(self):
"""
解析列表
:return:
"""
divs = self.driver.find_elements_by_class_name("item")
for i in range(self.location, len(divs)):
link = divs[i].find_element_by_tag_name('a').get_attribute("href")
print link
self.location += 1
self.count += 1
print self.count
if __name__ == '__main__':
spider = SinaBookSpider()
spider.run()
代码地址:动态web进程--GitHub
如果要实际运行上述代码,请确保在运行之前安装了与浏览器版本对应的驱动程序,并将其正确添加到环境变量中
这里可以看到对这三种方法的解释:Python selenium——必须能够使用selenium进行等待,以及对这三种等待方法的解释——gray和blue博客
总结:
在这里,我们介绍两种动态页面处理方法:
做一个简单的比较:
使用哪种方法取决于爬行动物活动的具体情况:
就我个人而言,我认为应该尽可能避免模拟浏览器的方法,因为浏览器环境会消耗大量内存和CPU,这可以作为短期解决方案。此时,长期性能和可靠性并不重要;作为一个长期的解决方案,我将尽最大努力网站进行逆向工程
欢迎指出本文中的任何错误或不足之处