python爬虫基础-处理复杂的登陆验证以及javascript动态加载数据-以登陆QQ空间为例

由于采集数据可能会造成信息泄露以及对占用服务器资源,因此很多网站都会设置很多反爬虫的机制来限制我们采集网站上的数据。很多时候我们很难在短时间破解这些反爬机制,这些反爬机制不会阻碍我们使用浏览器来浏览信息,因此我们可以使用python与浏览器软件交互的方式来采集数据。我们使用的工具selenium+chromedriver来调用本地的谷歌浏览器或者使用selenium+phantomjs。phantomjs是一个无界面的浏览器。下载地址:phantomjsseleniumchromedriver

代码如下:

from selenium import webdriver
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import codecs
from bs4 import BeautifulSoup
#driver = webdriver.PhantomJS(executable_path='phantomjs.exe')
userName="147******"
password="******"
driver = webdriver.Chrome('chromedriver.exe')
driver.get("https://qzone.qq.com/")
try:
    time.sleep(3)
    #driver.find_element_by_link_text("帐号密码登录").click()
    #driver.find_element_by_id('switcher_plogin').click()
    print("切换frame")
    driver.switch_to_frame("login_frame")
    print("切换成功")
    driver.find_element_by_id('switcher_plogin').click()
    #隐式等待表单元素加载完成
    wait = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,"u")))
    print("等待结束,输入表单")
    eleU=driver.find_element_by_id("u")
    eleP=driver.find_element_by_id("p")
    eleU.clear()
    time.sleep(1)
    eleU.send_keys(userName)
    time.sleep(1)
    eleP.click()
    eleP.clear()
    eleP.send_keys(password)
    time.sleep(1)
    eleS=driver.find_element_by_id("login_button")
    eleS.click()
    js="var q=document.documentElement.scrollTop=100000"
    for i in range(30):
    #执行js,下拉滚动条
        driver.execute_script(js)
        time.sleep(3)
        #以下未解析提取部分
        bsObj = BeautifulSoup(driver.page_source)
        f=codecs.open("page"+str(i)+".txt","w","utf8")
        elements=bsObj.findAll("li",{"class":"f-single f-s-s"})
        for element in elements:
            title=""
            try:
                title=element.find("div",{"class":"f-info"}).get_text()
            except AttributeError as e:
                title="未获取到主题"
            record=element["id"]+"\t"+title+"\n"
            f.write(record)

        f.close()
        time.sleep(3)     
    print("即将结束程序")

finally:
    driver.close()

猜你喜欢

转载自blog.csdn.net/hfutzhouyonghang/article/details/80978301
今日推荐