python的selenium爬虫进阶篇(FAQ)

正文:

selenium单论做爬虫,是非常简单了,蛋疼的是调bug和环境(即模拟浏览器行为),所幸的是调出来了
我把我今天调环境的过程小结一下。。。。算了,还是直接给东西吧,越来越懒了。。。

一.无法定位元素

这个问题是没有加载完网页就取元素了,本来第一次是设置sleep(),可是会导致socket断开,所以就用内置的
参考:http://www.coin163.com/it/1260810376453124227/python-?-selenium

import selenium.webdriver.support.ui as ui
wait = ui.WebDriverWait(driver,20)
print wait.until(lambda x: x.find_element_by_css_selector("#b_results > li.b_pag > nav > ul > li:nth-child(3) > a")).text

二.python的ascii编码

import sys
reload(sys)
sys.setdefaultencoding(‘utf-8’)

三.元素不在视图(最蛋疼的)

想达到的操作是点击
原先用firefox,会can’t scroll into view,去网上找了蛮久的,都是java的解决方法
思路有这么几个
1.是不是没有指定frame
2.js
3.元素多个,没有指定清楚
4.原先认为的视图是界面,还以为是界面滚动:
参考:https://blog.csdn.net/u011806486/article/details/51197660

def scroll(driver):
	driver.execute_script("""
		(function () {
			var y = document.body.scrollTop;
			var step = 100;
			window.scroll(0, y);
			function f() {
				if (y < document.body.scrollHeight) {
					y += step;
					window.scroll(0, y);
					setTimeout(f, 50);
				}
				else {
					window.scroll(0, y);
					document.title += "scroll-done";
				}
			}
			setTimeout(f, 1000);
			})();
			""")

第二部分:
再用了下google浏览器
出现element not visible
ok的,这个问题好解决,用ActionChains模拟鼠标点击
参考:http://www.mamicode.com/info-detail-1981462.html
详细看原文,还是放一段在文章中,这段的模拟鼠标右键给了我启发,咋一看,不报错,定位准确,再一调,就OK了

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep
driver=webdriver.Chrome(executable_path="D:/selenium/chrome/chromedriver")
driver.implicitly_wait(10)
driver.maximize_window()
driver.get('http://sahitest.com/demo/clicks.htm')
click_btn = driver.find_element_by_xpath('//input[@value="click me"]')  # 单击按钮
doubleclick_btn = driver.find_element_by_xpath('//input[@value="dbl click me"]')  # 双击按钮
rightclick_btn = driver.find_element_by_xpath('//input[@value="right click me"]')  # 右键单击按钮
ActionChains(driver).click(click_btn).double_click(doubleclick_btn).context_click(rightclick_btn).perform()  # 链式用法
print driver.find_element_by_name('t2').get_attribute('value')
sleep(2)
driver.quit()

四.多窗口的句柄问题

另一种方法编我的代码就要用到,暂时没有试
参考:https://blog.csdn.net/mrlevo520/article/details/51926145
 
到此,遗留问题解决。
 
2018.8.12
 

发表评论

电子邮件地址不会被公开。 必填项已用*标注