16

所以我正在尝试使用 Python 登录 Quora,然后抓取一些东西。

我正在使用 Selenium 登录该站点。这是我的代码:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()
driver.get('http://www.quora.com/')

username = driver.find_element_by_name('email')
password = driver.find_element_by_name('password')

username.send_keys('email')
password.send_keys('password')
password.send_keys(Keys.RETURN)

driver.close()

现在的问题:

  1. 查找并填写登录表单花了大约 4 分钟,这非常缓慢。我可以做些什么来加快这个过程吗?

  2. 当它登录时,我如何确保没有错误?换句话说,我如何检查响应代码?

  3. 如何使用 selenium 保存 cookie,以便登录后可以继续抓取?

  4. 如果没有办法让 selenium 更快,还有其他登录方式吗?(Quora 没有 API)

4

6 回答 6

15

我在使用 ChromeDriver 在 Python selenium 中调用非常慢的 find_elements_xxx 时遇到了类似的问题。我最终找到了我在 find_element_xxx() 调用之前进行的 driver.implicitly_wait() 调用的问题;当我把它拿出来时,我的 find_element_xxx() 调用运行得很快。

现在,当我调用 find_elements_xxx() 时,我知道这些元素就在那里。所以我无法想象为什么implicit_wait 会影响这些操作的速度,但确实如此。

于 2016-02-16T01:01:41.553 回答
3

您可以使用自己的 setAttribute 方法来加快表单填写,这里是 java 的代码

public void setAttribute(By locator, String attribute, String value) {
    ((JavascriptExecutor) getDriver()).executeScript("arguments[0].setAttribute('" + attribute
            + "',arguments[1]);",
            getElement(locator),
            value);
}
于 2013-07-05T12:51:43.523 回答
3
  1. 我去过那里,硒很慢。填写表格可能不会像 4 分钟那么慢。然后我开始使用 phantomjs,它比 firefox 快得多,因为它是无头的。安装最新的 phantomjs 后,您可以简单地将 Firefox() 替换为 webdriver 行中的 PhantomJS()。

  2. 要检查您是否已登录,您可以断言登录后显示的某些元素。

  3. 只要您不退出驱动程序,cookies 将可用于跟踪链接

  4. 您可以尝试使用 urllib 并直接发布到登录链接。您可以使用 cookiejar 来保存 cookie。你甚至可以简单地保存cookie,毕竟cookie只是http头中的一个字符串

于 2013-07-04T06:56:44.657 回答
2

无头运行 Web 驱动程序应该会在一定程度上提高其执行速度。

from selenium.webdriver import Firefox
from selenium.webdriver.firefox.options import Options

options = Options()
options.add_argument('-headless')
browser = webdriver.Firefox(firefox_options=options)

browser.get('https://google.com/')
browser.close()
于 2018-06-29T19:46:36.847 回答
1

我已经改变了定位器,这工作得很快。此外,我还添加了使用 cookie。检查下面的代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.keys import Keys
import pickle


driver = webdriver.Firefox()
driver.get('http://www.quora.com/')
wait = WebDriverWait(driver, 5)
username = wait.until(EC.presence_of_element_located((By.XPATH, '//div[@class="login"]//input[@name="email"]')))
password = wait.until(EC.presence_of_element_located((By.XPATH, '//div[@class="login"]//input[@name="password"]')))

username.send_keys('email')
password.send_keys('password')
password.send_keys(Keys.RETURN)

wait.until(EC.presence_of_element_located((By.XPATH, '//span[text()="Add Question"]'))) # checking that user logged in
pickle.dump( driver.get_cookies() , open("cookies.pkl","wb")) # saving cookies
driver.close()

我们已经保存了 cookie,现在我们将在新的浏览器中应用它们:

driver = webdriver.Firefox()
driver.get('http://www.quora.com/')
cookies = pickle.load(open("cookies.pkl", "rb"))
for cookie in cookies:
    driver.add_cookie(cookie)
driver.get('http://www.quora.com/')

希望,这会有所帮助。

于 2018-07-24T11:27:55.623 回答
1

对于带有 Python Selenium 的 Windows 7 和 IEDRIVER,结束 Windows 命令行并重新启动它可以解决我的问题。

我遇到了 find_element..clicks 的问题。他们花了30秒加上一点点。这是我拥有的代码类型,包括捕获运行多长时间。

timeStamp = time.time()
elem = driver.find_element_by_css_selector(clickDown).click()
print("1 took:",time.time() - timeStamp)

timeStamp = time.time()
elem = driver.find_element_by_id("cSelect32").click()
print("2 took:",time.time() - timeStamp)

每次点击记录大约 31 秒。结束命令行并重新启动它(这确实结束了任何 IEDRIVERSERVER.exe 进程)后,每次单击为 1 秒。

于 2018-03-12T18:53:30.460 回答