Board logo

标题: python–爬虫–模拟登录全面介绍和简例–以抓取雅卓app为例)(4) [打印本页]

作者: look_w    时间: 2019-5-16 14:50     标题: python–爬虫–模拟登录全面介绍和简例–以抓取雅卓app为例)(4)

二、直接使用已知的cookie访问

上面一种方法,我们需要去后台获取 POST 请求链接和参数,比较麻烦。下面,我们可以尝试先登录,获取 Cookie,然后将该 Cookie 添加到 Headers 中去,然后用 GET 方法请求即可,过程简单很多。

从上面Fiddler捕获到的登录返回值中有需要Cookie值。
如下:

{"access_token":"c6ccb2be7a233c2f8637b82c1457820c5f9ea0f5b4a47a8cf641bbf526d6e3df00aa0900504fbcd4f047c8","expires_in":172800,"refresh_token":"335eeecb0dd6cba5a2dc0ac7a75b498b4076c89012e459bc99f7fec797aff5e8b0c6afd24b23e0be5e9c18","token_type":"bearer"}



使用代码如下:

import requests
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
    'Cookie': 'c6ccb2be7a233c2f8637b82c1457820c5f9ea0f5b4a47a8cf641bbf526d6e3df00aa0900504fbcd4f047c8',
}
session = requests.Session()
# 登录后,我们需要获取另一个网页中的内容
response = session.get('https://yzapi.yazio.com/v1/user',headers = headers)
print(response.status_code)
print(response.text)



可以看到,添加了 Cookie 后就不用再 POST 请求了,直接 GET 请求目标网页即可。可以看到,也能成功获取到网页内容。
三、Selenium 模拟登录 (模拟登陆万能法)

这个方法很直接,利用 Selenium 代替手动方法去自动输入账号密码然后登录就行了。

关于 Selenium 的使用,在之前的一篇文章中有详细介绍,如果你不熟悉可以回顾一下:

https://www.makcyun.top/web_scraping_withpython5.html

参考网站:

Selenium官网: https://selenium-python.readthedocs.io/

SeleniumPython文档(英文版):http://selenium-python.readthedocs.org/index.html

SeleniumPython文档(中文版):https://selenium-python-zh.readthedocs.io/en/latest/faq.html

Selenium 基本操作:https://www.yukunweb.com/2017/7/ ... um-PhantomJS-basic/

Selenium爬取淘宝信息实战:https://cuiqingcai.com/2852.html

只需要记住重要的一点就是:Selenium能做到"可见即可爬"。也就是说网页上你能看到的东西,Selenium基本上都能爬取下来。包括上面我们提到的东方财富网的财务报表数据,它也能够做到,而且非常简单直接,不用去后台查看用了什么JavaScript技术或者Ajax参数。下面我们就实际来操练下吧。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
browser = webdriver.Chrome()
browser.maximize_window()  # 最大化窗口
wait = WebDriverWait(browser, 10) # 等待加载10s

def login():
    browser.get('https://www.itjuzi.com/user/login')
    input = wait.until(EC.presence_of_element_located(
        (By.XPATH, '//*[@id="create_account_email"]')))
    input.send_keys('irw27812@awsoo.com')
    input = wait.until(EC.presence_of_element_located(
        (By.XPATH, '//*[@id="create_account_password"]')))
    input.send_keys('test2018')
    submit = wait.until(EC.element_to_be_clickable(
        (By.XPATH, '//*[@id="login_btn"]')))
    submit.click() # 点击登录按钮
    get_page_index()

def get_page_index():
    browser.get('https://yzapi.yazio.com/v1/user')
    try:
        print(browser.page_source)  # 输出网页源码
    except Exception as e:
        print(str(e))
login()



这里,我们在网页中首先定位了账号节点位置:’//[@id=“create_account_email”]’,然后用 input.send_keys 方法输入账号,同理,定位了密码框位置并输入了密码。接着定位 登录 按钮的位置://[@id=“login_btn”],然后用 submit.click() 方法实现点击登录按钮操作,从而完成登录。可以看到,也能成功获取到网页内容。

注意Selenium只支持网页版的,如果是要抓取app,需要使用Appium。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0