Day04 爬虫学习第四天:Selenium捕获动态加载数据,12306模拟登录

文章目录

    • Selenium捕获动态加载数据
    • selenium模拟12306登录

学习了Selenium捕获动态加载数据和Selenium模拟12306登录

Selenium捕获动态加载数据

我是在chorme浏览器中进行爬虫的,在进行Selenium动态爬取之前,需要先下载choremdriver驱动,可以通过下面的链接下载对应的版本。
chormedriver下载 http://chromedriver.storage.googleapis.com/index.html
下面还是一个爬取药监局页面的公司名称的代码,药监局的url:http://125.35.6.84:81/xk/

from selenium import webdriver
import time
from lxml import etree
bro = webdriver.Chrome(executable_path='./chromedriver.exe') 
url = 'http://125.35.6.84:81/xk/'
bro.get(url)
#爬取药监总局的前三页的数据
time.sleep(2)
#获取当前浏览器显示的页面源码数据
page_text = bro.page_source  #该属性可以返回当前页面的所有被加载出来的页面源码数据

#列表:存放前三页的页面源码数据
all_page_text = [page_text]
for i in range(3):
    #进行下一页按钮的定位且对其进行点击
    a_tag = bro.find_element_by_xpath('//*[@id="pageIto_next"]')
    a_tag.click()
    time.sleep(1)
    all_page_text.append(bro.page_source)

for page_text in all_page_text:    
    #解析企业名称(动态加载的数据)
    tree = etree.HTML(page_text)
    li_list = tree.xpath('//*[@id="gzlist"]/li')
    for li in li_list:
        name = li.xpath('./dl/@title')[0]
        print(name)
time.sleep(1)
bro.quit()

输出结果如下(部分)Day04 爬虫学习第四天:Selenium捕获动态加载数据,12306模拟登录_第1张图片

selenium模拟12306登录

模拟的是12306网站的登录,在12306模拟登录这里需要用到之前使用过的识别验证码的工具-超级鹰

from selenium import webdriver
from PIL import Image  #进行截图和裁剪
import time
from selenium.webdriver import ActionChains  #动作链
from lxml import etree
bro = webdriver.Chrome(executable_path='./chromedriver.exe') 
time.sleep(1)
bro.maximize_window()
url = 'https://kyfw.12306.cn/otn/resources/login.html'
bro.get(url)
time.sleep(2) #保证验证码图片可以被刷新出来

#切换到密码登录
bro.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]').click()

在这里存在的一个问题是如果获取到的网页界面不是最大化的,需要先进性一下最大化,因为现在12306的验证码图片在左边,如果不最大的话会导致截到的图片不完整。

第二个问题是现在的登录模块分为二维码扫描登陆和密码登录两个模块,而我们需要使用密码进行登录,所以还有一个登录方式的切换过程。

解决好上面两个问题后,就可以将登录用户名和密码输入,并对验证码进行识别,完成模拟登录。通过下面的代码完成:

#录入用户名和密码
username_tag = bro.find_element_by_id('J-userName')
username_tag.send_keys('用户名')
 
pwd_tag = bro.find_element_by_id('J-password')
pwd_tag.send_keys('密码')

#验证码识别处理:验证码应该被截屏截取下来而不应该单独请求
bro.save_screenshot('./main.png') #表示登录页面对应的图片
#在main.png中对验证码局部裁剪,需要将验证码图片的左下角和右上角的坐标读取到,则可以获取裁剪的矩形区域


#验证码图片的img标签
code_img_tag = bro.find_element_by_xpath('//*[@id="J-loginImg"]')
location = code_img_tag.location  #当前标签在页面中左下角的坐标
size = code_img_tag.size  #当前标签的size

#裁剪的矩形区域
rangle = (int(location['x']),int(location['y']),int(location['x']+size['width']),int(location['y']+size['height']))
#基于Image类提供的工具类进行裁剪
i=Image.open('./main.png')
frame = i.crop(rangle)
frame.save('./12306.png')  #获取验证码图片

#识别验证码图片
result = transform_code_img('./12306.png',9008)
print(result)  #返回的需要点击验证码上子图的坐标(x1,y1|x2,y2)

#需要将坐标存入列表
all_list = []
if '|' in result:
    list_1 = result.split('|')
    count_1 = len(list_1)
    for i in range(count_1):
        xy_list = []
        x = int(list_1[i].split(',')[0])
        y = int(list_1[i].split(',')[1])
        xy_list.append(x)
        xy_list.append(y)
        all_list.append(xy_list)
else:
    x = int(result.split(',')[0])
    y = int(result.split(',')[1])
    xy_list = []
    xy_list.append(x)
    xy_list.append(y)
    all_list.append(xy_list)

for pos in all_list:
    x = pos[0]
    y = pos[1]
    #x,y就是需要点击的一个点的坐标
    ActionChains(bro).move_to_element_with_offset(code_img_tag,x,y).click().perform()
    time.sleep(1)
    
print(all_list)
#点击登录按钮
bro.find_element_by_id('J-login').click()
time.sleep(3)
# bro.quit()

关于验证码图片的获取,我们需要获取到的是验证码图片的左上角坐标和右下角坐标,获取到坐标后,对验证码图片进行裁剪并保存,存储的验证码图片类似下图:
Day04 爬虫学习第四天:Selenium捕获动态加载数据,12306模拟登录_第2张图片
获取到验证码图片后,对验证码进行识别,识别验证码用的是之前定义的函数transform_code_img函数,再写一下,之前放的是图片。

def transform_code_img(imgPath,imgType):
    chaojiying = Chaojiying_Client('用户名', '密码', '软件ID')#我的账号密码和软件ID
    im = open(imgPath, 'rb').read() #本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
    return chaojiying.PostPic(im, imgType)['pic_str']#1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()

验证码识别后,就可以实现登录了。
还学习了js加密和js混淆,但是因为我没有安装node.js环境,代码有些问题,所以这里先不讲,这几天陆陆续续也接着投了一些简历,爬虫也有在学,但是前几天没有好好整理,之后要多自己去爬一些网站。继续加油!
Day04 爬虫学习第四天:Selenium捕获动态加载数据,12306模拟登录_第3张图片

你可能感兴趣的:(爬虫)