所以我尝试使用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()
现在问题:
找到并填写登录表单需要大约4分钟,这种情况非常缓慢。我能做些什么来加快这个过程吗?
登录时,如何确保没有错误?换句话说,我如何检查响应代码?
如何使用selenium保存Cookie,以便我可以在登录后继续抓取?
如果没有办法让硒更快,还有其他办法登录吗? (Quora没有API)
答案 0 :(得分:9)
我在使用ChromeDriver的Python selenium中调用非常慢的find_elements_xxx时遇到了类似的问题。我最终找到了我在find_element_xxx()调用之前调用的driver.implicitly_wait()调用的麻烦;当我拿出它时,我的find_element_xxx()调用很快就会运行。
现在,当我执行find_elements_xxx()调用时,我知道那些元素。所以我无法想象为什么implicit_wait应该影响这些操作的速度,但确实如此。
答案 1 :(得分:3)
我去过那里,硒很慢。填写表格可能不会慢到4分钟。然后我开始使用phantomjs,它比firefox快得多,因为它是无头的。在安装最新的phantomjs之后,您可以在webdriver行中使用PhantomJS()替换Firefox()。
要检查您是否已登录,您可以断言登录后显示的某些元素。
只要您不退出驱动程序,就可以使用Cookie来关注链接
您可以尝试使用urllib并直接发布到登录链接。您可以使用cookiejar来保存cookie。你甚至可以简单地保存cookie,毕竟,cookie只是http标题中的一个字符串
答案 2 :(得分:2)
您可以使用自己的setAttribute方法来固定表单填充,这里是java的代码
public void setAttribute(By locator, String attribute, String value) {
((JavascriptExecutor) getDriver()).executeScript("arguments[0].setAttribute('" + attribute
+ "',arguments[1]);",
getElement(locator),
value);
}
答案 3 :(得分:0)
对于使用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秒。
答案 4 :(得分:0)
无头运行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()
答案 5 :(得分:0)
我更改了定位器,此方法运行很快。另外,我还添加了使用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/')
希望,这会有所帮助。