爬虫问题总结

遇到有登陆页面并且有验证码

使用selenium + webdriver

  1. 首先要下载chromedriver

    地址:http://npm.taobao.org/mirrors/chromedriver/ 下载浏览器对应版本(windows64位下载win32版本即可)

  2. 配置chromedriver

      将下载的文件解压至chrome浏览器的安装路径下

爬虫问题总结

  1. 配置环境变量,路径为放置文件的路径

    爬虫问题总结

  2. 爬取具体过程

首先输入要获取页面的网址,一般没有登陆过会自动跳转到登陆页面,此时对登陆页面进行解析,获得输入账号密码验证码的位置,此处账号密码设置到程序中自动输入,验证码由自己输入。

爬虫问题总结

然后登录到页面后,发现用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)
上一篇:Day_45_ jQueryHTML、事件、插件


下一篇:C#开发可播放摄像头及任意格式视频的播放器