如何使用 Python 抓取无限滚动页面

方法, 蟒蛇, 搜索, Nov-15-20225 分钟阅读

当今世界,每个人都在使用新技术。借助网络搜刮技术,您可以自动获取结构化数据。例如,您可以利用网络刮削技术:无限滚动(又称无尽滚动)是一种网页设计技术,网站通常将其与 AJAX 或 Javascript 结合使用。

目录

当今世界,每个人都在使用新技术。借助网络搜刮技术,您可以自动获取结构化数据。例如,您可以使用网络搜索来:

  • 价格监测
  • 潜在客户生成
  • 新闻监测
  • 市场调研
  • 价格情报

无限滚动(也称无尽滚动)是一种网页设计技术,网站通常使用 AJAX 或Javascript在用户向下滚动到网页底部时动态加载额外内容。这种技术因其在社交媒体网站上的成功而广受欢迎。例如,Twitter 中的无限滚动就是通过异步加载实现的。Twitter在页面加载后进行 AJAX 调用,以便在滚动时不断添加新内容。虽然无限滚动有很多优点,但不建议用于需要人们定位特定内容的目标导向型查找任务。

让我们先来了解一下扫描无限滚动页面的好处。

为什么需要抓取无限滚动页面?

以下是刮取无限滚动页面的一些原因。

  • 用户参与--无限滚动可让用户在页面上保持参与。在 Twitter 和 Facebook 等社交媒体网站上,有大量用户生成的内容可供滚动浏览,因此用户可以持续参与其中。 
  • 点击次数更少--滚动所需的操作更少,对用户来说比点击更容易。
  • 移动设备的理想选择--无限滚动功能非常适合移动设备和触摸屏。用户可以向下滑动来生成新内容,而不是切换到新标签页。 

除了上述无限滚动页面的优点外,它也有一些缺点,比如: 1:

  • 这不利于搜索引擎优化(SEO)。
  • 对于身体残疾的用户来说,要浏览无限滚动的页面并不容易。
  • 无限滚动网站的加载时间可能较长,这可能来自用户端或开发端。

如何使用 Python 抓取无限滚动页面

让我们来看看如何在以下步骤的帮助下使用 Python 浏览无限滚动页面。

导入图书馆

您需要导入 Selenium 库。

fromseleniumimportwebdriver
fromselenium.webdriver.common.keysimportKeys    
导入时间

Selenium 设置

在此,您必须选择要使用的浏览器。我们将选择 Chrome 浏览器,因为它比 Firefox 提供更多选项。 

defget_selenium():                          
  options= webdriver.ChromeOptions()
  options.add_argument('--ignore-certificate-errors')
  options.add_argument('--incognito')
  options.add_argument('headless')                       
   driver = webdriver.Chrome(chrome_options=options)
  return(driver)

上面提到的无头参数相当重要。在 Python 中无头运行时,Selenium 不会在新窗口中打开 Chrome 浏览器。不过,如果在刮擦时遇到问题,可以注释无头选项,查看 Chrome 浏览器中发生了什么以及页面上加载了什么。

我们可以省略两个标志,即忽略证书错误和隐身。

如果遇到验证码或 cookie 横幅阻止页面加载,可以点击 "确定 "并正常进入页面。但是,如果浏览器意外关闭,可以使用 time.sleep() 暂停代码,以便有充足的时间进行调试。

修复无限滚动问题

您需要检查页面的 HTML 结构以修复无限滚动问题,并按照以下步骤操作。

  • 您必须找到加载到页面上的最后一个元素。
  • 您必须使用 Selenium 才能向下滚动到该元素。
  • 要等待页面加载更多内容,请使用 time.sleep()。
  • 再次滚动到页面上加载的最后一个元素。
  • 您需要重复同样的过程,直到页面结束。

您可以参考下面的示例,以便更好地理解。

selenium = get_selenium()              
selenium.get("your/url")   
last_elem =''
while True:
   current_last_elem ="#my-div > ul > li:last-child"
   scroll ="document.querySelector(\'"+ current_last_elem +"\').scrollIntoView();"
   selenium.execute_script(scroll)
   time.sleep(3)
  如果(last_elem == current_elem)
     断开
  否则
      last_elem = current_elem

在上述代码中,我们在 Python 中使用了 jQuery 和 Javascript。 

给你

  • 我们使用selenium.get()函数打开了URL页面。不过,如果你想在 URL 搜索中添加关键词,可以使用下面这行代码。
selenium.get("your/url.com/{0}".format(keyword))
  • 我们将 last_time 初始化为 0,在其中存储了一个空字符串。
  • 我们使用了一个 while 循环,其中使用了 CSS_selector 或 Xpath 来获取 current_last_elem。要获取路径,请按照以下步骤操作。 打开页面。要选择需要路径的元素,必须使用 webdev 工具。您可以按照教程在页面 HTML 结构中选择元素,并在 Chrome 浏览器中获取 Xpath。
  • 打开您的页面。
  • 要选择需要路径的元素,必须使用网络开发工具。您可以按照教程在页面 HTML 结构中选择元素,并在 Chrome 浏览器中获取 Xpath。
  • 为了向下滚动页面到所选元素,我们使用了 jQuery 和 scrollIntoView()。 
"document.querySelector(\'" + .. + ").scrollIntoView();"

在此,您的格式必须正确,因此需要注意单引号、双引号和转义字符。

  • 我们使用 selenium.execute_script() 运行 js 脚本。
  • 您需要给页面足够的加载时间,以便它能找到最后一个元素。因此,time.sleep() 函数非常重要,因为它会暂停执行几秒钟。如果不给页面足够的加载时间,它就会停止滚动,从而得到未定义的结果。
  • 每次向下滚动到页面底部时,我们都要检查是否找到新的最后一个元素。如果找到了,说明我们还没有到达页面的末尾,需要继续滚动。如果未找到,则表示页面已经滚动完毕,我们可以跳出循环。

解决常见问题

无限滚动时经常出现的一些问题如下:

  • 找到最后一个元素的正确 Xpath 需要一些时间。您需要检查 js 脚本中的单引号和双引号。
  • 如果每次都出现未定义或相同的最后一个元素,则需要增加持续时间,例如,增加 time.sleep(),因为页面可能没有足够的时间完全加载。 
  • 如果一切正常,你可以注释掉 get_selenium() 中的无头选项,但它仍然不起作用。

在 Python 中触发 js

可以在 Python 中触发一个 js 脚本,并得到一个列表。 

例如,我们可以使用下面的代码来获取页面上所有图片的来源。

js_script='''\    
var jslist = []  
document.querySelectorAll('img').forEach(i => jslist.push(i.src));
返回 jslist;
'''  
python_list= selenium.execute_script(js_script)

在上述代码中

  • 我们创建了一个名为 jslist 的空数组。
  • 我们选择了页面中的所有 img 标记。
  • 我们使用 forEach 来推送数组中的每个 img.src。
  • 我们退回了 jslist。

对于 href 链接,我们也可以使用同样的方法:

  • 选择所有 "a "标记。
  • 将每个 a.href 推入我们的数组。

之后,我们可以使用 selenium.execute_script() 运行脚本。 

这就是我们如何使用 Python 浏览无限滚动页面。

使用代理

我们知道,代理是第三方服务器,它充当请求资源的客户端与提供资源的服务器之间的中介。 如果想在 Selenium 和 Python 中使用代理,可以使用以下代码。

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=%s'% hostname +":"+port)
driver = webdriver.Chrome(chrome_options=chrome_options)

要处理无限滚动,可以使用 scroll-proxy,它支持在视图层次结构中以编程方式滚动可滚动视图。如果使用 npm,可以使用下面的命令安装 scroll-proxy。我们将使用 js 演示 scroll-proxy 的使用。

npm installscroll-proxy--save

安装 scroll-proxy 后,可以使用以下代码实例化一个 ScrollProxy 对象。

varmyScroll =new ScrollProxy();

您可以看到,我们没有向 ScrollProxy 构造函数传递任何参数,因为当用户滚动页面时,它将默认报告操作。

但是,如果要在用户滚动某些特定 HTML 元素时获取更新,则必须将其传递给构造函数。

varmyDiv =document.querySelector('.scrollable');
varmyDivScroll =newScrollProxy(myDiv);

为什么使用代理进行无限滚动搜索?

以下是使用代理进行无限滚动搜索的一些原因。

  • 验证码会导致页面超时,从而阻止你的搜刮程序。如果经常出现超时错误,可以手动检查页面以查找验证码。大多数验证码都是由安全措施触发的,你可以在使用搜刮工具的同时使用轮换居住代理来避免验证码。
  • 有些网站喜欢根据用户代理可能是僵尸的假设或可能性,过滤掉可疑的头信息请求。为了避免发出你是僵尸的信号,你可以使用代理服务器,它可以更改你的 IP 地址,并为你(用户代理)防止红色标记。 

结论

我们讨论过,当用户不是在寻找特定信息时,无限滚动是首选。不断产生新内容的新闻网站和社交媒体可以从无限滚动中受益。另一方面,商业网页和电子商务网站并不适合无限滚动,因为用户寻求的是特定信息。此外,我们还讨论了使用 Selenium 扫描无限滚动页面的步骤。我们还可以使用旋转住宅代理来处理无限滚动,因为它们有助于避免验证码并过滤可疑的头请求。

希望你已经了解了如何使用 Python 抓取无限滚动页面。