• 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 的方式,过几天他来完成这里,妙啊)

  • 相关阅读:
    redis 学习笔记
    导数据方法
    数据库常用操作
    zepto.js
    shopnc
    vue.js
    laravel
    mysql进阶学习
    Python基础------生成器表达式形式、面向过程编程、内置函数部分
    Python基础----生成器、三元表达式、列表生成式、生成器表达式
  • 原文地址:https://www.cnblogs.com/wkzb/p/12850953.html
Copyright © 2020-2023  润新知