结合Selenium与Requests实现网页登录及Cookie复用详解
本文详解如何利用Selenium模拟浏览器登录以获取完整Cookie,随后通过Requests库的Session对象复用这些凭证进行后续请求。文章提供了从配置Chrome选项、提取Cookie到构建Headers及随机User-Agent的完整代码示例,旨在解决需要登录态才能访问资源的爬虫场景,并指出了fake-useragent库在使用中可能存在的版本兼容问题。
本文详细解析了如何将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数据。接下来需要解决的关键问题是:如何有效地利用这些获取到的Cookie?
二、Requests库如何复用已获取的Cookies
1. 首先,初始化并创建一个Session对象。
req = requests.Session() # 构建Session
2. 将Selenium获取到的Cookie对象转换为Requests可识别的格式。
for cookie in cookies:
req.cookies.set(cookie['name'], cookie['value']) # 转换cookies
3. 使用该Session对象访问目标网站中需要登录权限的页面。
data = req.get(url, headers=self.headers).text #获取文本网页 jsondata = req.get(url, headers=self.headers).json() #获取json型网页
整个过程逻辑清晰且易于实现。此外,补充一个常用技巧:使用fake-useragent库可以生成随机的User-Agent字符串。需要注意的是,该库中部分Chrome浏览器的User-Agent版本可能较低,在访问如知乎等网站时,可能会触发“浏览器版本过低”的提示,这一点在实际应用中需特别留意。
同时,构建合理的Headers是爬虫开发的基本规范,因此预先配置好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
}
以上就是本文的全部内容,希望能为读者的学习和工作提供有益的帮助,同时也欢迎大家继续支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













