ajax数据爬取及selenium添加cookie免登录

写爬虫的时候遇到 ajax 动态网页,花了一天时间研究了一下(话说这个小工具写了一阵了,我打算做为这学期的课程设计提交,等拿到学分了再开源)
 

一、ajax技术

ajax 是指一种创建交互式、快速动态网页应用的网页开发技术,通过在后台与服务器进行少量数据交换,ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。比如微博就会用到 ajax 技术,可以发现在浏览几个微博之后,再向下会出现一个加载的动画,等加载完毕就可以继续浏览新的微博内容,这个就是 ajax 加载的过程。
 

二、爬虫获取动态页面

爬取动态页面目前只有两种方法

  1. 分析页面请求
  2. selenium模拟浏览器行为

两种方式都尝试了一下,分析页面请求可以从 F12->Network-XHR 处找到真实的请求目标 url,然后用常规的爬虫知识去构造GET或者POST请求就可以了;或者请求时用 burp 抓包,再逐个放包,也能找到目标 url。

 

这里详细讲一下 selenium 模拟浏览器行为的爬取动态页面的方式,首先需要浏览器配合安装 driver,以 Chrome 浏览器为例介绍安装测试过程:

  1. 先 pip3 install selenium 安装,再进入 python 命令行交互模式导入一下 selenium 包,如果没有报错则证明安装成功
  2. 点击 Chrome 的菜单,帮助->关于 Chrome,查看 Chrome 的版本号
  3. 在 http://npm.taobao.org/mirrors/chromedriver/ 找到自己的 Chrome 浏览器版本对应的 ChromeDriver 下载
  4. 将 ChromeDriver 的可执行文件配置到环境变量下,Windows 中直接将 chromedriver.exe 文件拖到 python 的 Scripts 目录下
  5. 在命令行下直接执行 chromedriver 命令验证安装,或是执行如下代码弹出一个空白的 Chrome 页面,证明所有的配置都没有问题
from selenium import webdriver
browser = webdriver.Chrome()

 

接下来就可以使用 selenium 语法进行具体操作了,举一个简单的登录并打印网页例子,user 和 pass 的值根据实际爬取网页 id 更换。

url=''#期望爬取的网页
username=''
password=''
browser = webdriver.Chrome()
browser.get(url)
browser.find_element_by_xpath('//*[@id="user"]').send_keys(username)#输入用户名
browser.find_element_by_xpath('//*[@id="pass"]').send_keys(password)#输入密码
browser.find_element_by_xpath('//*[@id="btn"]').click() #点击提交按钮
source = browser.page_source
print(source)#打印登录后网页

 

三、selenium添加cookie免登录

如果要进行很多次查询,那么运行一次登录一次的方式爬取数据的效率就太低了,或者是登录时需要输入验证码,我们无法绕过验证码实现程序的完全自动化,这时候就可以使用 selenium 添加 cookie 实现免登录。

由于 selenium 的 cookie 形式有些特别,无法直接使用 F12 中的 cookie 值,获取这个 cookie 的思路是:

  1. 先写一个 demo.py 用 selenium 请求一下目标网站,然后手动输入用户名、密码,待网页完全加载完毕后打印下来当前的 cookies(这里的 cookies 是一个 cookie 列表)
  2. 在爬虫 py 中需要先请求目标网站,再清除所有 cookie,然后从 cookies 列表中获取登录状态的 cookie,再请求一次目标网站即可

 

demo.py 代码

url=''#目标url
browser = webdriver.Chrome()
browser.get(url)
time.sleep(60)#留一点时间手动填账号密码
cookies=browser.get_cookies()#获得成功登录后cookies
print(cookies)

 

爬虫.py 代码

url=''#目标url
browser = webdriver.Chrome()
list_cookies=[]#刚才打印出的cookie列表
browser.get(url)#先访问目标
browser.delete_all_cookies()#清所有cookie
for i in list_cookies:#赋值cookie
    browser.add_cookie(i)
browser.get(url)#再请求一次

 

demo.py 获得的 cookies 中的每一条 cookie 都是字典格式的,并不是每一个键值对都是有用的。我的判断方式是运行爬虫代码后哪个键值对报错、selenium 不识别,就删掉哪个,最后保留的是下列四个键值对

{'domain': '', 'name': '', 'path': '', 'value': ''}

 

当然这个手动获取 cookies 列表并构造的方式可以用代码实现(黄同学提出了自动构造 cookie 的方式,过几天他来完成这里,妙啊)

 

posted @ 2020-05-08 16:40  beiwo  阅读(779)  评论(0编辑  收藏  举报