遇到有登陆页面并且有验证码
使用selenium + webdriver
-
首先要下载chromedriver
地址:http://npm.taobao.org/mirrors/chromedriver/ 下载浏览器对应版本(windows64位下载win32版本即可)
-
配置chromedriver
将下载的文件解压至chrome浏览器的安装路径下
-
配置环境变量,路径为放置文件的路径
-
爬取具体过程
首先输入要获取页面的网址,一般没有登陆过会自动跳转到登陆页面,此时对登陆页面进行解析,获得输入账号密码验证码的位置,此处账号密码设置到程序中自动输入,验证码由自己输入。
然后登录到页面后,发现用requests不能成功请求跳转页面,每次都是获取到登录页面,我觉得是因为requests又要请求一次连接,被认定为第二次连接了,所以在这里我们不采用requests,我们继续采用webdriver
driver.page_source #这个就可以获取到页面代码
附上源码:
def loginSys():
print('开始登陆')
target = 'https://...'
driver = webdriver.Chrome()
driver.get(target)
driver.implicitly_wait(0.1)
LoginTitle = driver.title
username = "w...k"
password = "w..."
result = driver.title
if LoginTitle == result:
vcode = input("vcode:") # 请求验证码,人工识别后输入
driver.find_element_by_xpath('//*[@id="app"]/div/div/form/div[2]/div/div/input').send_keys(username) # 找到用户名录入框并填写
time.sleep(0.2) # 停顿模拟真实操作情况,降低被网站发现的几率
driver.find_element_by_xpath('//*[@id="app"]/div/div/form/div[3]/div/div/input').send_keys(password) # 找到输入密码录入框并填写
time.sleep(0.2)
driver.find_element_by_xpath('//*[@id="app"]/div/div/form/div[4]/div/div[1]/input').send_keys(vcode) # 找到验证码框并填写
driver.implicitly_wait(0.2)
driver.find_element_by_id('login_btn').click() # 点击登录
解析页面代码
这里我们使用BeautifulSoup,这里的html就是上面的driver.page_source ,然后利用.find .find_all 等方法来抓取所需要的内容
soup = BeautifulSoup(html, 'html.parser') # 从网页抓取数据
需要跳转下一页,不定时报错
首先,我们找到跳转下一页的按钮,然后定位到那里,调用click()方法点击
driver.find_element_by_xpath('//*[@id="information"]/div[3]/div/button[2]').click()
但是我们发现不定时会报错:
selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element is not clickable at point (1066, 547). Other element would receive the click:
...(Session info: chrome=95.0.4638.69)
经过搜集资料可以使用另一个调用 click 事件的方法代替 click() 方法:
element1 = driver.find_element_by_xpath('//*[@id="information"]/div[3]/div/button[2]')
driver.execute_script("arguments[0].click();", element1)