在网站模拟登陆的时候可能会遇到复杂的JS操作,如果用程序去模拟会很复杂,而且可用性很差,所以这个时候就需要用模拟浏览器操作。
selenium提供一系列操作接口可以操作firefox,chrom,phantomjs
PhantomJS是无头浏览器,没有界面所以效率很高
安装
python selenium安装
pip install selenium
phantomjs安装
wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
tar -jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2
selenium的使用
设置请求头和代理
#设置请求头
dcap = dict(DesiredCapabilities.PHANTOMJS)
dcap["phantomjs.page.settings.userAgent"] = (
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/52.0.2743.24 Safari/537.36"
)
#设置代理
service_args = [
'--proxy=' + proxy,
'--proxy-type=https',
]
#executable_path 设置PhantomJS_PATH地址
driver = webdriver.PhantomJS(executable_path=PhantomJS_PATH,
desired_capabilities=dcap,
service_args=service_args)
设置页面超时
driver.set_page_load_timeout(60)
请求网址
driver.get("https://www.baidu.com")
选择页面元素
#css 选择器
user_name_ele = driver.find_element_by_css_selector("form.login-form
input[name='user_login']")
#根据id选择
login_ele = driver.find_element_by_id("verify-state")
#根据tag_name选择
iframe = driver.find_element_by_tag_name("iframe")
输入内容
user_name_ele.send_keys(user_name)
元素点击
login_ele.click()
页面截图
driver.get_screenshot_as_file("screenshot.png")
#页面截图后会失去页面焦点,想要找回页面焦点可以点击页面元素
转到frame页面
driver.switch_to.frame(iframe)
等待页面加载
#直接浏览器休眠100秒
driver.implicitly_wait(100)
#60秒内没有加载到img元素会返回错误
WebDriverWait(driver, 60).until(lambda brow:
brow.find_element_by_css_selector("img"))
页面点击操作
#获取元素
verify_container = driver.find_element_by_class_name("verify-container")
#生成鼠标事件
action = webdriver.common.action_chains.ActionChains(driver)
#移动到某个元素
action.move_to_element(verify_container)
#偏移位置
action.move_by_offset(int(x) - 8, int(y) - 68)
#点击
action.click()
#加这个才能表现到页面上
action.perform()
获取cookie并保存
cookie = driver.get_cookies()
cj = LWPCookieJar()
for s_cookie in cookie:
cj.set_cookie(cookielib.Cookie(version=0, name=s_cookie['name'],
value=s_cookie['value'], port='80',
port_specified=False, domain=s_cookie['domain'],
domain_specified=True,
domain_initial_dot=False, path=s_cookie['path'],
path_specified=True,secure=s_cookie['secure'], rest={},
expires=s_cookie['expiry']
if "expiry" in s_cookie else None, discard=False,
comment=None, comment_url=None, rfc2109=False))
cj.save("cookie")
关闭
driver.close()