具备Python Selenium性能的Web爬网

时间:2019-09-14 20:02:44

标签: python performance selenium web-scraping beautifulsoup

根据性能,使用BautifulSoup进行Web抓取比使用Selenium进行Web驱动要快得多。但是我不知道从动态网页获取内容的任何其他方法。我以为差异来自浏览器加载元素所需的时间,但绝对不仅仅如此。浏览器加载页面(5秒)后,我要做的就是从表中提取一些<tr>标签。提取1016条记录大约需要3-4分钟,在我看来这是非常缓慢的。我得出的结论是,用于查找诸如find_elements_by_name之类元素的webdriver方法很慢。来自webdriver的find_elements_by ..是否比BeautifulSoup中的find方法慢得多?如果我从Webdriver浏览器中获取整个html,然后使用lxml解析并使用BeautifulSoup,会更快吗?

4 个答案:

答案 0 :(得分:1)

Web Scrapping with Python一起使用应该是测试策略的一部分。如果您打算擦除静态内容 BeautifulSoup ,那么请放直。但是如果网站内容是动态呈现的,那么 Selenium 是必经之路。

话虽如此,一旦页面加载完成, BeautifulSoup 就不会等待DOM Tree中不存在的动态内容。在使用Selenium的情况下,您可以随意使用Implicit Wait and Explicit Wait来查找所需的动态元素。

最后,由于 Selenium 将其转化为等效的 find_elements_by_name() ,因此find_element_by_css_selector()的性能可能会高昂。您可以在此discussion

中找到更多详细信息

Outro

Official locator strategies for the webdriver

答案 1 :(得分:1)

是的,在页面准备就绪后仅使用Selenium来获取HTML,然后使用BeautifulSoup或lxml解析该HTML会更快。

另一种选择是使用Puppeteer来获取HTML或直接获取您想要的信息。它也应该比硒快。有一些非官方的python绑定:pyppeteer

答案 2 :(得分:1)

查看2个选项:

1)有时,这些动态页面实际上确实具有有效json格式的<script>标记内的数据。您可以使用requests获取html,beautifulsoup将获取<script>标签,然后可以使用json,loads()进行解析。

2)直接转到源。查看开发工具并搜索XHR,以查看是否可以直接进入url / API并生成数据并以这种方式返回数据(很可能再次以json格式)。我认为,到目前为止,这是更好/更快的选择。

如果您可以提供网址,我可以检查一下这两个选项是否适用于您的情况。

答案 3 :(得分:0)

您也可以尝试使用javascript进行评估。例如:

item = driver.execute_script("""return {
  div: document.querySelector('div').innerText,
  h2: document.querySelector('h2').innerText
}""")

至少比此速度快10倍:

item = {
  "div": driver.find_element_by_css_selector('div').text,
  "h2": driver.find_element_by_css_selector('h2').text
}

如果它在很多时候也比BS快,我也不会感到惊讶。