在爬取网站数据时,需要通过登陆账户来获取cookie里的参数,才能向网站请求成功。
参数access_token和salt 通过登陆账户生成的cookie中携带
因此 首先通过selenium登陆账户
首先打开网页,定位用户名输入框,和密码输入框,输入后 点击登陆 弹出验证码
代码如下:
def __init__(self,u,p):
self.u = u
self.p = p
self.LoginClass = 'login'
# self.proxy = proxy
proxy = random_proxy()
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--proxy-server=%s' % proxy)
# self.browser = webdriver.Chrome()
self.browser = webdriver.Chrome(chrome_options=chrome_options)
self.wait = WebDriverWait(self.browser, 80)
self.browser.set_page_load_timeout(40)
self.threshold = 60 # 验证码图片对比中RGB的差值,可调
self.left = 50 # 验证码图片的对比中的起始坐标,即拖动模块的右边线位置
self.BORDER = 6
self.page_count = []
self.url = 'https://www.shujuling.com/login/logining'
def close(self):
self.browser.close()
def open(self):
"""
# 打开浏览器,并输入账户和密码
"""
self.browser.maximize_window()
self.browser.get(self.url)
def login_web(self):
user = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "input[name='loginName']")))
password = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "input[name='loginPwd']")))
user.send_keys(self.u)
password.send_keys(self.p)
self.login_in()
设置为无头模式,输入后点击弹出验证码
验证码为极验滑动验证码 ,通过js加载出验证码图片
1,获取完整验证码和有缺口的验证码图片
def get_images(self):
"""
获取验证码图片
:return: 图片的location信息
"""
"""
从网页的网站截图中,截取验证码图片
:return: 验证码图片对象
"""
times = random.uniform(3, 5)
times = round(times, 1)
time.sleep(times)
bg_js = 'return document.getElementsByClassName("geetest_canvas_bg geetest_absolute")[0].toDataURL("image/png");'
fullbg_js = 'return document.getElementsByClassName("geetest_canvas_fullbg geetest_fade geetest_absolute")[0].toDataURL("image/png");'
# slice 执行 JS 代码并拿到图片 base64 数据
bg_info = self.browser.execute_script(bg_js) # 执行js文件得到带图片信息的图片数据
bg_base64 = bg_info.split(',')[1] # 拿到base64编码的图片信息
bg_bytes = base64.b64decode(bg_base64) # 转为bytes类型
with open('bg.png', 'wb') as f: # 保存图片到本地
f.write(bg_bytes)
fullbg_info = self.browser.execute_script(fullbg_js) # 执行js文件得到带图片信息的图片数据
fullbg_base64 = fullbg_info.split(',')[1] # 拿到base64编码的图片信息
fullbg_bytes = base64.b64decode(fullbg_base64) # 转为bytes类型
with open('fullbg.png', 'wb') as f: # 保存图片到本地
f.write(fullbg_bytes)
bg_image = Image.open('bg.png')
fullbg_image = Image.open('fullbg.png')
return bg_image, fullbg_image
2,通过比对两张验证码图片计算出缺口位置
def get_distance(self, image1, image2):
"""
拿到滑动验证码需要移动的距离
:param image1: 没有缺口的图片对象
:param image2: 带缺口的图片对象
:return: 需要移动的距离
"""
i = 0
for