如何巧妙的利用selenium和requests組合來進行操作需要登錄的頁面


一、在這里selenium的作用

(1)模擬的登錄。

(2)獲取登錄成功之后的cookies

代碼

    def start_login(self):
        chrome_options = Options()
        # 禁止圖片加載,禁止推送通知
        prefs = {
            "profile.default_content_setting_values": {
                "images": 2
            }, "profile.default_content_setting_values.notifications": 2
        }
        chrome_options.add_experimental_option("prefs", prefs)
        if chrome_args().get("headless_flag") == "1":
            chrome_options.add_argument(chrome_args().get("headless"))
        chrome_options.add_argument(chrome_args().get("nogpu"))
        chrome_options.add_argument(chrome_args().get("noinfobars"))
        chrome_options.add_argument(chrome_args().get("max_windows"))
        chrome_options.add_argument(self.Proxy_server)

        driver = webdriver.Chrome(chrome_options=chrome_options)
        try:
            get_logger().info("start login.....")
            try:
                # login info
                self.login_name = self.loginInfo.get("login_id")
                self.password = aes_cbc_decrypt(self.loginInfo.get("login_pwd"))
            except Exception:
                get_logger().error("cant get login info,here are detals".format(traceback.format_exc()))
            wait = WebDriverWait(driver, 30)
            print(u"start login in")
            driver.get(self.login_url)
            try:
                login_id = wait.until(
                    eccd.presence_of_element_located(
                        (By.XPATH, self.Id_xpath))
                )
                login_id.send_keys(self.login_name)
                login_id.send_keys(Keys.ENTER)
                password = wait.until(
                    eccd.presence_of_element_located(
                        (By.XPATH, self.pwd_xpath))
                )
                password.send_keys(self.password)
                submit = wait.until(
                    eccd.presence_of_element_located(
                        (By.XPATH, self.login_btn_xpath))
                )
                submit.click()
                # login signal
                #判斷是否顯示 右上角是否顯示用戶名
                login_ok = wait.until(
                    eccd.presence_of_element_located(
                        (By.XPATH, self.login_ok_xpath))
                )
                try:
                    #判斷登錄成功
                    if login_ok:
                        get_logger().info("get user name successful:"+u"{}".format(login_ok.text))
                        try:
                            get_weibo_info=driver.find_element_by_xpath(self.forward_home_page)
                        except:

                            driver.get(self.first_page)

                        forward_home_page_ok = wait.until(
                              eccd.presence_of_element_located(
                                  (By.XPATH, self.forward_home_page))
                          )
                        forward_home_page_ok.click()
                        time.sleep(5)
                        self.first_page=driver.current_url
                        get_logger().info("get homepage successful,url is {}".format(driver.current_url))
                        cookies = driver.get_cookies()  # 導出cookie
                        get_logger().info("get cookies")
                        get_fansnum_ok= wait.until(
                                eccd.presence_of_element_located(
                                    (By.XPATH, self.follow_xpath))
                        )
                        self.get_followfanshome(driver)
                        get_logger().info("get_followfanshome ok")
                        self.home_page_source=driver.page_source
                        driver.close()  # 關閉chrome
                        #獲取主頁的
                        # 如果需要保存cookies
                        self.write_cookie(cookies)
                        get_logger().info("get cookies,login ok")
                        return cookies


                    else:
                        raise RuntimeError('login failed')
                except:
                    get_logger().error("login failed")
                    return None

            except:
                if driver is not None:
                    driver.close()
        except Exception as e:
            if driver is not None:
                driver.close()
                get_logger().error("dbs operation error,here are details:{}".format(traceback.format_exc()))

 通過使用cookies = driver.get_cookies() #我們獲取了cookie那么我們怎用呢。

二、requests如何使用獲取到的cookies

1.創建一個Session對象

req = requests.Session()  # 構建Session

2.轉換上面的cookies對象

for cookie in cookies:
            req.cookies.set(cookie['name'], cookie['value'])  # 轉換cookies

3.開始訪問該網站的需求頁面

data = req.get(url, headers=self.headers).text #獲取文本網頁
jsondata = req.get(url, headers=self.headers).json() #獲取json型網頁

  好了就是這么簡單,另外補充一個經常使用的庫fake-useragent,可以獲取隨機的useragent,但是其中谷歌的useragent版本比較低,尤其在訪問知乎的時候,會提示瀏覽器版本低的信息,這一點需要注意。

另外擁有一個headers是對爬蟲起碼的尊重,所以有個構建好的headers是非常必要的。我就經常用下面的例:

from fake_useragent import UserAgent as UA
import random

headers = {
            'Accept': 'text/html, application/xhtml+xml, image/jxr, */*',
            'Accept - Encoding': 'gzip, deflate',
            'Accept-Language': 'zh-Hans-CN, zh-Hans; q=0.5',
            'Connection': 'Keep-Alive',
            'User-Agent': UA().random #獲取隨機的useragent
        }

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM