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