第三章 Selenium使用中总结 2021-10-23

爬虫系列总目录

一、 模拟登录

1.1 selenium登录163邮箱

  • 功能说明:
    登录位于iframe标签内,修改相应的定位方法,同时切换到iframe 窗口后才可输入。
from selenium import webdriver
import time
# 定义变量接受账号密码
users = input('邮箱账号:')
pwd = input('邮箱密码:')
driver = webdriver.Chrome()
driver.get('https://mail.163.com/')
time.sleep(2)
# 匹配到iframe标签对象
iframe = driver.find_element_by_xpath('//iframe[@scrolling="no"]')
# 切换到iframe窗口
driver.switch_to.frame(iframe)
# 定位到账号输入的input标签并且输入账号
driver.find_element_by_xpath('//input[@name="email"]').send_keys(users)
time.sleep(2)
# 定位到密码输入的input标签并且输入密码
driver.find_element_by_xpath('//input[@name="password"]').send_keys(pwd)
time.sleep(2)
# 定位到登录按钮 并且点击
driver.find_element_by_xpath("//*[@id='dologin']").click()
time.sleep(10)
driver.close()

1.2 cookie和session

二者重要的区别

  • cookie是在客户端保持状态的机制,session是在服务端保持状态的机制。
  • Cookie在客户端可以被编辑伪造,不是十分安全。
import requests

# 访问网站,获取session信息
session = requests.Session()
r = session.get('https://www.guazi.com/buy', headers=headers)
print(r.cookies.get_dict())

# 从网页复制cookie信息,传递至请求
# 也可以放字符串放到header中
c = "xxx"
cookie = {}
for i in c.split(';'):
    cookie[i.split('=')[0]] = i.split('=')[1]
res = requests.get(url, headers=headers, cookies=cookie)
print(res.json()['data']['postList'][1])

1.3 验证码处理

识别获取到的验证码(下载验证码文件),建议使用现有平台,超级鹰或者图鉴,查看的API 文档获取调用方法。

# 请求验证码
res = requests.get(url=img_url, headers=headers)
img_res = res.content

# 保存验证码到本地,检验结果
# with open('yzm.png', 'wb') as f:
#     f.write(img_res)

# 超级鹰的使用方法,将图片数据发送,获取验证码
cjy = chaojiying.Chaojiying_Client(username='xxxx',password='xxxx',soft_id='923501')
pic_str= cjy.PostPic(img_res, 1902)['pic_str']

二、 IP代理池

  • 当爬虫代码访问频率达到了目标网站的预警值时,就可能触发目标网站的反爬机制。而封禁访问者ip就是很常见的一个反爬机制。

  • 当ip被封禁后,从此ip发出的请求将不能得到正确的响应。这种时候,我们就需要一个IP代理池。

  • 爬虫ip代理到底是什么
    代理服务器 --> 转发请求和响应

  • 代理匿名度
    1 透明代理 : 就算用了这种代理 服务器也知道你是使用了代理ip的,并且还知道你的真实ip
    2 匿名代理 : 知道你使用了代理, 但是不知道你的真实ip
    3 高匿名代理 : 不知道你使用代理, 也不知道你的真实ip

使用快代理代理,个人学习可使用免费的,快代理访问过快,ip会被禁止。 付费代理可使用精灵代理,经济实惠。

使用代理后,通过访问https://2021.ip138.com/ 查看自己的ip地址是否改变, 或与代理ip 相一致认为代理可用, python 代理不可用时,会换回本地ip 。 免费的代理基本不具有匿名性。

"""
{
'http': 'ip:port',
'https':'ip:port'
}
"""
# proxies 为字典,结果如上图所示。
url = 'https://2021.ip138.com/'
print(requests.get(url=url, headers=headers, proxies=random.choice(proxy_list)).content.decode())

三、 动态页面处理

selenium 滑动上下的滚动条,实现对页面的加载。

from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('https://search.jd.com/Search?keyword=%E8%8B%B9%E6%9E%9C13')
time.sleep(5)
driver.execute_script('window.scrollTo(0,2000)')
time.sleep(5)
# 滑到顶部
driver.execute_script('window.scrollTo(0,0)')
time.sleep(5)
# 滑到底部
driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')
time.sleep(5)
driver.close()

四、对检测Selenium的网站应对方案

4.1 设置Chromedriver的启动参数

在启动Chromedriver之前,为Chrome开启实验性功能参数xcludeSwitches,它的值为[‘enable-automation’],完整代码如下:

此时启动的Chrome窗口,在右上角会弹出一个提示,不用管它,不要点击停用按钮。

再次在开发者工具的Console选项卡中查询window.navigator.webdriver,可以发现这个值已经自动变成undefined了

    # 用浏览器访问淘宝等网站的 window.navigator.webdriver的值为 undefined
    # 当我们用selenium 的时候, window.navigator.webdriver的值为 true
    global driver
    # 打开浏览器
    option = ChromeOptions()
    option.add_experimental_option('excludeSwitches', ['enable-automation'])
    driver = Chrome(options=option)

4.2 使用mitmproxy截取服务器发送来的js

使用mitmproxy用中间人的方式截取服务器发送来的js,修改js里面函数的参值方式发送给服务器。相当于在browser和server之间做一层中介的拦截。不过此方法要对js非常熟悉的人才好实施。(不会)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值