爬虫系列总目录
Selenium的动态HTML及验证码处理 IP代理池使用
一、 模拟登录
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非常熟悉的人才好实施。(不会)