Python 爬虫模拟登陆方法汇总

摘要: 在进行爬虫时,除了常见的不用登陆就能爬取的网站,还有一类须要先登陆的网站。好比豆瓣、知乎,以及上一篇文章中的桔子网。这一类网站又能够分为:只需输入账号密码、除了账号密码还需输入或点击验证码等类型。本文以只需输入帐号密码就能登陆的桔子网为例,介绍模拟登陆经常使用的 3 种方法。html

  • POST 请求方法:须要在后台获取登陆的 URL并填写请求体参数,而后 POST 请求登陆,相对麻烦;
  • 添加 Cookies 方法:先登陆将获取到的 Cookies 加入 Headers 中,最后用 GET 方法请求登陆,这种最为方便;
  • Selenium 模拟登陆:代替手工操做,自动完成帐号和密码的输入,简单但速度比较慢。

下面,咱们用代码分别实现上述 3 种方法。python

1. 目标网页

这是咱们要获取内容的网页:web

radar.itjuzi.com/investeventapi

这个网页须要先登陆才能看到数据信息,登陆界面以下:服务器

能够看到,只须要输入帐号和密码就能够登陆,不用输验证码,比较简单。下面咱们利用一个测试帐号和密码,来实现模拟登陆。cookie

2. POST 提交请求登陆

首先,咱们要找到 POST 请求的 URL。session

有两种方法,第一种是在网页 devtools 查看请求,第二种是在 Fiddler 软件中查看。ide

先说第一种方法。工具

在登陆界面输入帐号密码,并打开开发者工具,清空全部请求,接着点击登陆按钮,这时便会看到有大量请求产生。哪个才是 POST 请求的 URL呢?这个须要一点经验,由于是登陆,因此能够尝试点击带有 「login」字眼的请求。这里咱们点击第四个请求,在右侧 Headers 中能够看到请求的 URL,请求方式是 POST类型,说明 URL 找对了。post

接着,咱们下拉到 Form Data,这里有几个参数,包括 identify 和 password,这两个参数正是咱们登陆时须要输入的帐号和密码,也就是 POST 请求须要携带的参数。

参数构造很是简单,接下来只须要利用 Requests.post 方法请求登陆网站,而后就能够爬取内容了。

下面,咱们尝试用 Fiddler 获取 POST 请求。

若是你对 Fiddler 还不太熟悉或者没有电脑上没有安装,能够先了解和安装一下。

Fiddler 是位于客户端和服务器端的 HTTP 代理,也是目前最经常使用的 HTTP 抓包工具之一 。 它可以记录客户端和服务器之间的全部 HTTP 请求,能够针对特定的 HTTP 请求,分析请求数据、设置断点、调试 web 应用、修改请求的数据,甚至能够修改服务器返回的数据,功能很是强大,是 web 调试的利器。

Fiddler 下载地址:

www.telerik.com/download/fi…

使用教程:

zhuanlan.zhihu.com/p/37374178

www.hangge.com/blog/cache/…

下面,咱们就经过 Fiddler 截取登陆请求。

当点击登陆时,官场 Fiddler 页面,左侧能够看到抓取了大量请求。经过观察,第15个请求的 URL中含有「login」字段,颇有多是登陆的 POST 请求。咱们点击该请求,回到右侧,分别点击「inspectors」、「Headers」,能够看到就是 POST 请求,该 URL 和上面的方法获取的 URL 是一致的。

接着,切换到右侧的 Webforms 选项,能够看到 Body 请求体。也和上面方法中获得的一致。

获取到 URL 和请求体参数以后,下面就能够开始用 Requests.post 方法模拟登陆了。

代码以下:

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',
    }
data = {
    'identity':'irw27812@awsoo.com',   
    'password':'test2018',
}
url ='https://www.itjuzi.com/user/login?redirect=&flag=&radar_coupon='
session = requests.Session()
session.post(url,headers = headers,data = data)
# 登陆后,咱们须要获取另外一个网页中的内容
response = session.get('http://radar.itjuzi.com/investevent',headers = headers)
print(response.status_code)
print(response.text)
复制代码

使用 session.post 方法提交登陆请求,而后用 session.get 方法请求目标网页,并输出 HTML代码。能够看到,成功获取到了网页内容。

下面,介绍第 2 种方法。

3. 获取 Cookies,直接请求登陆

上面一种方法,咱们须要去后台获取 POST 请求连接和参数,比较麻烦。下面,咱们能够尝试先登陆,获取 Cookie,而后将该 Cookie 添加到 Headers 中去,而后用 GET 方法请求便可,过程简单不少。

代码以下:

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': '你的cookie',
}
url = 'https://www.itjuzi.com/user/login?redirect=&flag=&radar_coupon='
session = requests.Session()
response = session.get('http://radar.itjuzi.com/investevent', headers=headers)

print(response.status_code)
print(response.text)
复制代码

能够看到,添加了 Cookie 后就不用再 POST 请求了,直接 GET 请求目标网页便可。能够看到,也能成功获取到网页内容。

下面介绍第 3 种方法。

4. Selenium 模拟登陆

这个方法很直接,利用 Selenium 代替手动方法去自动输入帐号密码而后登陆就好了。

关于 Selenium 的使用,在以前的一篇文章中有详细介绍,若是你不熟悉能够回顾一下:

www.makcyun.top/web_scrapin…

代码以下:

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('http://radar.itjuzi.com/investevent')
    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() 方法实现点击登陆按钮操做,从而完成登陆。能够看到,也能成功获取到网页内容。

以上就是模拟需登陆网站的几种方法。当登陆进去后,就能够开始爬取所需内容了。

5. 总结:

  • 本文分别实现了模拟登陆的 3 种操做方法,建议优先选择第 2 种,即先获取 Cookies 再 Get 请求直接登陆的方法。
  • 本文模拟登陆的网站,仅需输入帐号密码,不须要获取相关加密参数,好比 Authenticity_token ,同时也无需输入验证码,因此方法比较简单。可是还有不少网站模拟登陆时,须要处理加密参数、验证码输入等问题。后续将会介绍。

推荐阅读:

本文完。

欢迎长按识别关注个人公众号
相关文章
相关标签/搜索