【发布时间】: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