当前位置: 首页 > 面试题库 >

Selenium与BeautifulSoup进行网页抓取

白光耀
2023-03-14
问题内容

我正在使用Python从网站上抓取内容。首先,我用BeautifulSoupMechanizePython的,但我看到,该网站有一个按钮,通过JavaScript创建的内容,所以我决定使用Selenium

假设我可以使用Selenium等方法找到元素并获取其内容driver.find_element_by_xpath,那么BeautifulSoup当我可以对所有内容都使用Selenium时,有什么理由要使用?

在这种特殊情况下,我需要使用Selenium来单击JavaScript按钮,以便更好地使用Selenium进行解析还是应该同时使用Selenium和BeautifulSoup?


问题答案:

在直接回答问题之前,值得一开始:如果您需要做的就是从静态HTML页面提取内容,则可能应将HTTP库(例如Requests或内置urllib.request)与lxmlBeautifulSoup而不是Selenium(尽管硒可能也足够了)。不需要使用硒的优点:

  • 带宽和运行脚本的时间。使用Selenium意味着获取在浏览器中访问页面时通常会获取的所有资源-样式表,脚本,图像等。这可能是不必要的。
  • 稳定且易于恢复错误。根据我的经验,即使使用PhantomJS,Selenium也可能有些脆弱,并且创建架构来杀死一个挂起的Selenium实例并创建一个新实例比使用时设置简单的异常重试逻辑更令人烦恼requests
  • 潜在地,CPU和内存的使用情况-根据要爬网的站点以及要并行运行的蜘蛛线程的数量,可以想象DOM布局逻辑或JavaScript执行可能会变得非常昂贵。

请注意,要求cookie起作用的站点并不是破解Selenium的理由-
您可以轻松创建一个URL开启函数,该函数使用cookielib
/
cookiejar神奇地设置和发送HTTP请求中的cookie。


好的,那为什么还要考虑使用Selenium?几乎完全可以处理您要爬网的内容是通过JavaScript添加到页面而不是烘焙为HTML的情况。即使这样,您也可以在不破坏重型机械的情况下获得所需的数据。通常,以下情况之一适用:

  • 随页面提供的JavaScript已包含内容。JavaScript就是在那里进行模板或其他将内容放入页面的DOM操作。在这种情况下,您可能想看看是否有一种简单的方法可以使用regex直接从JavaScript中提取您感兴趣的内容。
  • JavaScript正在通过Web API加载内容。在这种情况下,请考虑是否可以识别相关的API URL并自己点击它们。与实际运行JavaScript并从网页上抓取内容相比,这可能更简单直接。

如果您 确实
确定使用Selenium的情况值得考虑,请在无头模式下使用它,(至少)Firefox和Chrome驱动程序支持。Web爬虫通常不需要实际图形化地呈现页面,也不需要使用任何特定于浏览器的怪癖或功能,因此理想的选择是无头浏览器-
它具有较低的CPU和内存成本以及较少的死机或挂起活动部件。



 类似资料:
  • 问题内容: 基本上,我想使用来严格抓取网页上的可见文本。例如,此网页是我的测试用例。我主要想获取正文文本(文章),甚至在这里和那里甚至几个标签名称。我已经尝试过在这个SO问题中返回不想要的标签和html注释的建议。我无法弄清楚该函数所需的参数,以便仅获取网页上的可见文本。 那么,我应该如何查找除脚本,注释,CSS等之外的所有可见文本? 问题答案: 尝试这个:

  • 我正试图从以下网站“url=”上抓取内容https://angel.co/life-sciences' ". 该网站包含8000多个数据。从这个页面我需要像公司名称和链接,加入日期和追随者的信息。在此之前,我需要通过单击按钮对followers列进行排序。然后单击“更多隐藏”按钮加载更多信息。页面最多可点击20次(隐藏更多)内容,此后不会加载更多信息。但我只能通过排序来获取顶级追随者的信息。这里我

  • 问题内容: 我想从网站上获取每天的日出/日落时间。是否可以使用Python抓取网络内容?使用什么模块?有没有可用的教程? 问题答案: 结合使用urllib2和出色的BeautifulSoup库:

  • 因此,我正在尝试webscrape https://data.bls.gov/cgi-bin/surveymost?bls,并且能够弄清楚如何通过点击进行webscrape以获得一个表。 我正在练习的选择是在您选择与薪酬下的“雇用成本指数(ECI)文职(未调整)-CIU1010000000000A”相关联的复选框之后,然后选择“检索数据”。 处理完这两个之后,将显示一个表。这就是我要刮的桌子。 下

  • 问题内容: 我试图从HTML中提取许多页面的数据(数字)。每个页面的数据都不同。当我尝试使用soup.select(’span [class =“ pull- right”]’)时,它应该给我编号,但只有标签出现。我相信这是因为网页中使用了Javascript。180,476是我要在许多页面上使用的特定HTML处的数据位置: 我的代码(这在很多页面上都是循环的): 输出: 范例网址:https:/

  • 问题内容: 在网站上,有在标顶部的几个环节,,,和。如果按下以数字标记的链接,它将动态地将一些数据加载到content中。如果被按下,它会用标签页,,,和第4页中的数据显示。 我想从按下的所有链接的内容中抓取数据(我不知道有多少,一次只显示3个,然后) 请举一个例子。例如,考虑网站www.cnet.com。 请指导我下载使用selenium的一系列页面,并自行解析它们以处理漂亮的汤。 问题答案: