Python模拟浏览器实训:自动登陆邮箱|附视频

原标题:Python模拟浏览器实训:自动登陆邮箱|附视频

Python模拟浏览器实训:自动登陆邮箱|附视频
文章图片
Python模拟浏览器:自动登录邮箱为例 。
01
实训内容
模拟浏览器有三种实现方式 , 一种是以模拟特定浏览器的header信息方式实现对浏览器的模拟 , 一种是使用浏览器内核(例如webkit) , 另外还可以直接在浏览器上开发组件(firefox/chrome)以实现动态页面的采集 。 其中 , 第一种方式只是简单地在爬虫程序调用requests.get时指定headers参数 , 以下例子是一种基本用法 。
useragent='Mozilla/5.0(Linux;Android6.0;Nexus5Build/MRA58N)AppleWebKit/537.36(KHTML,likeGecko)Chrome/72.0.3626.121MobileSafari/537.36'
http_headers={
'User-Agent':useragent,
'Accept':'text/html'
#其他头部属性
}
page=requests.get(url,headers=http_headers)#url要请求的网址
其中 , useragent的值可以通过5.5.1浏览器的开发者模式下查看请求头 , 获取对应的User-Agent 。
当页面JS脚本比较复杂、AJAX交互较多或存在不同页面之间大量数据交换的情况下 , 使用浏览器组件来模拟浏览器进行页面内容采集就是比较合适的选择了 。 这里以selenium为例介绍具体方法 。 selenium是一套完整的web应用程序测试系统 , 包含了测试的录制(seleniumIDE)、编写及运行(SeleniumRemoteControl)和测试的并行处理(SeleniumGrid) 。 它可以模拟真实浏览器 , 支持多种浏览器 , 爬虫中主要用来解决Java渲染问题 。
这里以爬虫自动登陆邮箱 , 查看有没有新邮件为例 。 为达到目的 , 需要经过安装配置、页面结构分析和程序实现三个步骤 , 以下分别描述 。
1.安装配置
在python下安装selenium , 执行pipinstallselenium即可 , 如图5-14 。 安装完成后 , 下载chromedriver(http://chromedriver.storage.googleapis.com/index.html) , 这里以以chrome为例 。 chromedriver的版本有很多 , 一定要下载与电脑上chrome浏览器版本相对应的版本 。 下载zip包之后 , 将其解压 。 发现里面仅有一个chromedriver.exe文件 , 需放到Chrome浏览器安装目录(即chrome.exe所在的目录)里面 , 如图5-15所示 。

Python模拟浏览器实训:自动登陆邮箱|附视频
文章图片
▍图5-14安装selenium

Python模拟浏览器实训:自动登陆邮箱|附视频
文章图片
▍图5-15将chromedriver.exe放到Chrome浏览器安装目录里
最后 , 将浏览器环境变量添加到操作系统的path环境变量中 , 即完成安装配置过程 。
2.页面结构分析
这里以登陆邮箱为例(https://mail.fudan.edu.cn/),爬虫自动输入用户名、密码 , 并点击“登录”按钮 , 相应的页面部分如图5-16所示 。 通过页面的源代码 , 寻找相应界面控件对应的控件名称 , 用户名uid , 密码为password , 以及登陆按钮Button 。
登陆以后 , 通过浏览器的开发者模式的Source选项找到信息的位置 , 即新邮件数目 , 如图5-17所示 。

Python模拟浏览器实训:自动登陆邮箱|附视频
文章图片
▍图5-16邮箱登陆页面的部分

Python模拟浏览器实训:自动登陆邮箱|附视频
文章图片
▍图5-17寻找所需要的信息(新邮件数)
3.程序实现
在上述步骤分析完成之后就可以写出Python的程序了 , 以下是主体函数 。
frombs4importBeautifulSoup
fromseleniumimportwebdriver
fromselenium.webdriver.chrome.optionsimportOptions
importtime
importgetpass
defstart_browser(uid,passwd):#参数为用户id和口令
#调用图形界面
chrome_options=Options
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
browser=webdriver.Chrome(chrome_options=chrome_options)
browser.get('https://mail.fudan.edu.cn/')#指定URL
time.sleep(2)#延迟 , 等待返回
#模拟填写查询内容
browser.find_element_by_id("uid").send_keys(uid)
browser.find_element_by_id("password").send_keys(passwd)
#模拟单击登陆按钮
browser.find_element_by_class_name("Button").click
time.sleep(2)
#登陆以后的页面中划分了Frame , 切换到相应的Frame中进行信息提取
browser.switch_to.frame('welcome')
html=browser.page_source
#使用BeautifulSoup , 具体用法在第6章介绍
soup=BeautifulSoup(html,'html.parser')
try:
params=soup.select('.fNewMail')[0].text.strip
print("有"+str(params)+"封新邮件!")
exceptIndexErrorase:
print("没有新邮件!")
#关闭浏览器
browser.quit
return
通过浏览器组件来模拟浏览器的优点是使用简单 , 复杂的事都交给框架去处理 。 但是其缺点也是很明显的 , 在执行过程中需要启动控制台进程 , 执行速度慢 , 需要动态地执行js , 并模拟人的浏览器操作 。