【问题标题】:Crawl a whole website with selenium in python recursive在 python 递归中使用 selenium 爬取整个网站
【发布时间】:2019-07-15 17:16:49
【问题描述】:

我是 python 新手,我尝试使用 selenium 递归抓取整个网站。 我想用 selenium 来做这件事,因为我想获取网站使用的所有 cookie。我知道其他工具可以更轻松、更快速地抓取网站,但其他工具无法提供所有 cookie(第一方和第三方)。

这是我的代码:

from selenium import webdriver
import os, shutil


url = "http://example.com/"
links = set()


def crawl(start_link):
    driver.get(start_link)
    elements = driver.find_elements_by_tag_name("a")
    urls_to_visit = set()

    for el in elements:
        urls_to_visit.add(el.get_attribute('href'))

    for el in urls_to_visit:
        if url in el:
            if el not in links:
                links.add(el)
                crawl(el)
            else:
                return


dir_name = "userdir"
if os.path.isdir(dir_name):
    shutil.rmtree(dir_name)
co = webdriver.ChromeOptions()
co.add_argument("--user-data-dir=userdir")
driver = webdriver.Chrome(options = co)
crawl(url)
print(links)
driver.close();

我的问题是抓取功能显然没有打开网站上的所有页面。在某些网站上,我可以手动导航到功能未达到的页面。为什么?

【问题讨论】:

  • 你的网址是公开的吗?
  • 不抱歉。例如,您可以使用this website。如果您滚动到页面底部,您可以看到一个指向旧帖子的链接,当您单击此链接时,您会看到另一个包含博客帖子的页面,并且此页面上的 link to a blogpost 不在我的爬虫链接设置中。例如。
  • 我不知道任何 python,但似乎您需要为找到的每个链接调用 crawl(el)。现在它为您尚未访问的第一个链接调用它...然后 urls_to_visit 被炸毁...可能需要在运行 driver.get() 的函数之外定义它...保留一个列表抓取的网址和访问过的网址之一。
  • 顺便说一句,假设递归在这里工作,驱动程序是单个浏览器实例。这不会是多个...(并且可能不希望它成为会打开大量浏览器的原因...)。
  • 现在我想多了,我认为正在发生的事情是你正在生成一大堆驱动程序调用,这些调用并没有按照你想要的顺序发生。 Selenium 将在获取后等待 pageready,在此期间,您将在递归循环中进行越来越多的调用。我认为您需要在该递归之外进行所有 Selenium 调用。

标签: python selenium selenium-webdriver web-crawler


【解决方案1】:

我在使用 webdriver 时注意到的一件事是加载页面需要时间,这些元素不像在普通浏览器中那样立即可用。

您可能想要添加一些延迟,或者添加一个循环来检查某种类型的页脚,以指示页面已加载并且您可以开始抓取。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 2017-08-10
    • 1970-01-01
    相关资源
    最近更新 更多