python爬虫selenium和bs4_[ Python爬虫实战 ] 使用Selenium模拟登录 - pytorch中文网

很多时候时候我们再分析登录请求的时候,发现登录算法非常麻烦,我们很多时候没有办法通过前面的Requests来登录,或者需要花费大量的时间,所以我们建议如果比较复杂的登录可以使用Selenium来登录。比如我们下面的案例,登录支付宝,我们分析发现光登录支付宝就传递了30多个参数。

2018050300254799273.png

注意

Selenium模拟登录性能相对Requests这种方式来说性能比较低,所以建议先分析接口然后再决定是否使用Selenium模拟登录。

一、使用Selenium模拟登录

前一章我们已经介绍了Selenium的安装与使用,所以我们直接开始使用。

1、导入Selenium

为了方便调试,我们这里使用Chrome驱动;如果到生产环境,我们可以使用PhantomJS或者使用Chrom/FireFox无头模式Headless代替PhantomJS,这样他们的性能相对有所提高!

from selenium import webdriver

driver = webdriver.Chrome()

2、定位元素以及输入账号密码

我们可以使用driver.get加载网页,这里我们可以通过show_login切换到密码登录

2018050300270042154.png

driver.get("https://auth.alipay.com/login/index.htm")

driver.find_element_by_xpath("//li[@data-status='show_login']").click()

for usname in self.username:

driver.find_element_by_id("J-input-user").send_keys(usname)

time.sleep(0.2)

for pwd in self.password:

driver.find_element_by_id("password_rsainput").send_keys(pwd)

time.sleep(0.2)

time.sleep(10)

driver.find_element_by_id("J-login-btn").click()

研究发现支付宝会监控输入速度,如果直接send_keys你会发现无论如何都会登录失败。

所以我们就缓慢输入,同时我们可以根据ID定位以及输入值。

3、获取登录后的网页

登录后我们可以页面会自动跳转到用户中心,我们可以使用driver.page_source来获取登录中心的代码,我们可以使用BeautifulSoup来解析页面代码

html = driver.page_source

soup = BeautifulSoup(html,"lxml")

table = soup.find("table",id="tradeRecordsIndex")

二、完整代码

我们在一些情况下会应用到time.sleep,为了方便我们可以在测试中调试和处理

# coding=utf-8

import time

from selenium import webdriver

from bs4 import BeautifulSoup

class Alipay:

def __init__(self,username,password):

self.username = username

self.password = password

self.driver = webdriver.Chrome()

def login(self):

driver = self.driver

driver.get("https://auth.alipay.com/login/index.htm")

driver.find_element_by_xpath("//li[@data-status='show_login']").click()

for usname in self.username:

driver.find_element_by_id("J-input-user").send_keys(usname)

time.sleep(0.2)

for pwd in self.password:

driver.find_element_by_id("password_rsainput").send_keys(pwd)

time.sleep(0.2)

time.sleep(10)

driver.find_element_by_id("J-login-btn").click()

records = self.getRecord(driver)

return records

def getRecord(self,driver):

html = driver.page_source

soup = BeautifulSoup(html,"lxml")

table = soup.find("table",id="tradeRecordsIndex")

records = []

if table:

trs = table.find_all("tr")

for tr in trs:

tds = tr.find_all("td")

created_at = tds[1].text

order = tds[2].text

money = tds[3].text

records.append({"time":created_at.replace("\n",""),"order":order.replace("\n",""),"money":money.replace("\n","")})

return records

if __name__ == '__main__':

alipay = Alipay("","")

logins = alipay.login()

print(logins)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值