欢迎访问宙启技术站
智能推送

Python3爬虫怎么模拟登录

发布时间:2023-05-18 12:52:00

爬虫模拟登录是指使用程序模拟用户登录网站,以获取一些敏感信息或进行一些操作。在爬虫中,模拟登录是非常常见的一种技术手段,本文将介绍Python3爬虫怎么模拟登录的一般流程。

首先需要明确的是,模拟登录涉及到网站安全、用户隐私等相关问题,因此在实践过程中需要遵守法律法规及道德准则,不能进行违法乱纪的行为,否则后果自负。

一、登录方式的分析

在进行模拟登录前,需要确定登录方式。一般来说,网站的登录方式有两种:

1. Cookies登录:通过发送登录请求获取用户的Cookies信息,并将Cookies存储下来,以后再请求时带上Cookies。

2. 大部分网站的登录,是通过向登录页面发送用户名和密码,以POST或GET方法发送登录请求,服务器返回的结果中包含了账号验证的token,之后通过在请求中带上这个token实现模拟登录操作。

需要了解的是,有些网站为了提高安全性,会在登录过程中加入验证码或滑动验证码等手段进行人机验证,这时候我们需要对验证码进行破解。

二、发送登录请求

使用Requests库发送登录请求。网站中有两个比较重要的参数:csrf_token和Cookie,其中csrf_token是一种安全验证机制,Cookie是用于验证用户身份的参数。对于不同网站的登录url,发送的POST请求头信息以及表单内容参数名称都有所不同。具体而言:

(1)获取csrf_token

csrf_token是防止CSRF攻击的一种验证机制,仅在你采取的攻击手段中需要用到。

我们首先需要向登录页面发起GET请求,以获得csrf_token。在收到响应后,通过正则表达式,从相应的HTML文本中提取csrf_token值。例如:

import requests
import re

login_url = 'https://www.example.com/login'
headers = {...}

r = requests.get(login_url, headers=headers)
csrf_token = re.findall(r'(?<=<meta name="csrf-token" content=").{10}', 
                        r.text)[0]

(2)构造POST请求参数并发送请求

以一个维基百科登录为例,POST请求头信息如下:

url = 'https://en.wikipedia.org/w/api.php'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Host': 'en.wikipedia.org',
    'Origin': 'https://en.wikipedia.org',
    'Referer': 'https://en.wikipedia.org/w/index.php?title=Special:UserLogin&returnto=Main+Page',
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
    'Accept-Encoding': 'gzip, deflate, br',
    'Connection': 'keep-alive',
    'Cookie': ''  # Cookies信息自行填写
}

data = {
    'action': 'query',
    'format': 'json',
    'utf8': '',
    'meta': 'tokens',
    'type': 'login',
    'formatversion': '2'
}

r1 = requests.post(url, headers=headers, data=data)
token = r1.json()['query']['tokens']['logintoken']

# 登录
cookies = ' '  # Cookies信息自行填写
data = {
    'action': 'clientlogin',
    'format': 'json',
    'loginreturnurl': 'https://en.wikipedia.org',
    'utf8': '',
    'username': '',
    'password': '',
    'logintoken': token
}

cookies_dict = {}
for cookie in cookies.split(';'):
    name, value = cookie.strip().split('=', 1)
    cookies_dict[name] = value
cookies_dict['enwikiLoggedOut'] = '0'
cookies_dict['enwiki_session'] = 'sessionsnEb62e05d94ca55da96963ede1ae157e0'

r2 = requests.post(url, headers=headers, data=data, cookies=cookies_dict)
print(r2.text)

注:在代码中headers和data中部分字段需要根据网站进行修改。

三、获取登录后的信息

以模拟登录维基百科为例,我们获得登录后的页面和信息:注:

(1)判断是否登录成功

登录成功后,可以从返回的响应中判断是否真正登录了。登录成功后,页面会有一些登录用户的信息。在维基百科登录成功后,可以从下面代码中查看。

url = 'https://en.wikipedia.org/w/api.php?action=query&format=json&meta=userinfo&uiprop=rights%7Cgroups%7Cblockinfo'

r = requests.get(url, headers=headers, cookies=cookies_dict)
print(r.json()['query']['userinfo'])

(2)数据的提取

登录后,可以提取数据了,如CSS、JS、HTML、图片等等都可以获得。另外,如果需要在登录状态下进行后续操作,我们就需要将Cookies保存下来,方便以后使用。

四、验证码的处理

有些网站需要验证码,我们需要识别验证码,如果验证码比较简单,可以使用识别验证码,如果比较复杂,需要手动输入,所以我们需要理解验证码的类型,根据验证码类型设计验证码识别算法,另外还需要用到tesseract,模拟登录的完整代码如下:

`

import base64

import json

import os

import re

import time

from io import BytesIO

import requests

from PIL import Image

from pytesseract import image_to_string

from selenium import webdriver

class Taobao_Scraper(object):

def __init__(self, username, password):

self.username = username

self.password = password

self.headers = {

'Referer': 'https://login.taobao.com/member/login.jhtml?redirectURL=https%3A%2F%2Fwww.taobao.com%2F',

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '

'Chrome/91.0.4472.124 Safari/537.36',

}

self.login_url = 'https://login.taobao.com/member/login.jhtml'

self.TOKEN_URL = "https://login.taobao.com/member/request_nick_check.do?"

self.session = requests.Session()

self.driver = None

def login(self):

if self._login_by_cookies():

return

self._init_driver()

self._get_login_page()

self._fill_login_form()

self._get_TPL_password1()

self._submit_login_form()

self._save_cookies()

self.driver.quit()

def _init_driver(self):

options = webdriver.ChromeOptions()

options.add_argument('--headless')

options.add_argument('--disable-gpu')

options.add_argument('log-level=3')

self.driver = webdriver.Chrome(options=options)

def _get_login_page(self):

self.driver.get(self.login_url)

def _fill_login_form(self):

login_form = self.driver.find_element_by_css_selector('form[name="loginform"]')

login_tips = self.driver.find_element_by_css_selector('.login-tips')

# enter username & password

username_input = login_form.find_element_by_id('TPL_username_1')

password_input = login_form.find_element_by_id('TPL_password_1')

username_input.send_keys(self.username)

password_input.send_keys(self.password)

# slide block

div_elem = login_tips.find_element_by_css_selector('.login-slider')

b = div_elem.find_element_by_css_selector('b')

slide_icon = b.find_element_by_css_selector('.btn_slide')

action = webdriver.ActionChains(self.driver)

slide_width = slide_icon.size['width']

action.click_and_hold(slide_icon).perform()

action.move_by_offset(slide_width - 7, 0).perform()

action.release().perform()

time.sleep(1)

def _get_TPL_password1(self):

login_cookies