zoukankan      html  css  js  c++  java
  • 爬虫第五章 selenium模块的应用

    什么是selenium

    selenium是一款基于浏览器自动化的模块
    
    和爬虫的关联:
        - 模拟登录
        - 获取动态加载的数据

    selenium如何获取动态加载的数据

    环境安装 : pip install selenium
    基本的使用情况:
        结合着某一款浏览器驱动程序实例化一个浏览器对象
        1.下载浏览器驱动程序:
        http://chromedriver.storage.googleapis.com/index.html
        2.查看驱动和浏览器版本的映射关系:
        http://blog.csdn.net/huilan_same/article/details/51896672
        3.编写自动化操作代码

    实例代码

    from selenium import webdriver
    from bs4 import BeautifulSoup
    #实例化一个浏览器对象,Chrome可以选择成别的浏览器,chromedriver.exe是一个可执行程序
    bro = webdriver.Chrome(excutable_path='./chromedriver.exe')
    #发送get请求
    bro.get(url='http://125.35.6.84:81/xk/')
    #获取页面数据
    page_text=bro.page_source
    #进行数据解析
    soup=BeautifulSoup(page_text,'lxml')
    dl_list=soup.select('#gzlist > li > dl')
    for dl in dl_list:
        name=dl.string
        print(name)

    selenium的详细用法

    bro=webdriver.Chrome(executable_path='./chromedriver.exe')
    bro.get('https://www.taobao.com')
    #从网页上定位到搜索框,并输入信息 search_input
    =bro.find_element_by_id('q') search_input.send_keys('小苹果') time.sleep(2) #如何执行js代码 bro.execute_script('window.scrollTo(0,document.body.scrollHeight)') time.sleep(2) bro.execute_script('window.scrollTo(0,document.body.scrollHeight)') time.sleep(2) #定位到提交按钮,输入完毕之后点击提交 btn = bro.find_element_by_xpath('//*[@id="J_TSearchForm"]/div[1]/button') btn.click() time.sleep(2) #关闭浏览器 bro.quit()

    执行动作链(执行动作链其实就是拖动某一个物体到另一个地方)

     

    实例代码

    from selenium import webdriver
    frim selenium.webdriver import ActionChains
    
    # 实例化一个浏览器页面
    bro = webdriver.Chrome(executable_path='chromedriver.exe')
    # 向这个网址发送请求
    bro.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
    # 如果html中又封装了一个html,则需要手动找到iframe标签 ,需要在定位到这个标签才可以
    bro.switch_to.frame('iframeResult')
    # 找到拖拉窗口的标签
    div_tag = bro.find_element_by_id('draggable')
    # 实例化一个动作链对象,将整个页面页面全部传递进去
    actionChains = ActionChains(bro)
    # 给动作链对象指定那个标签进行拖拽
    actionChains.click_and_hold(div_tag)
    
    # 指定拖动几次
    for i in range(3):
        # 指定每一次拖动的距离
        actionChains.move_by_offset(40, 0).perform()
        time.sleep(1)
    
    # 动作链的释放
    actionChains.release()
    # 退出浏览器
    bro.quit()
    我们现在知道了selenium可以轻而易举的爬取到网站的动态数据,那么有些网站就会出来检测你所发送的请求是不是selenium模块发送的,如果是,直接屏蔽掉,那么我们就无法获取到数据了

     解决方法:

    #固定用法
    from
    selenium.webdriver import ChromeOptions option = ChromeOptions() option.add_experimental_option('excludeSwitches', ['enable-automation']) url = 'https://bj.meituan.com/' bro = webdriver.Chrome(executable_path='./chromedriver.exe',options=option) bro.get(url) time.sleep(2) bro.get(url)
    如何设置浏览器的无可视化界面
    from selenium.webdriver.chrome.options import Options
    
    # 创建一个参数对象,用来控制chrome以无界面模式打开
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-gpu')
    url = 'https://bj.meituan.com/'
    bro = webdriver.Chrome(executable_path='./chromedriver.exe', chrome_options=chrome_options)
    bro.get(url)
    time.sleep(2)
    bro.get(url)
    time.sleep(2)
    bro.save_screenshot('1.png')
    print(bro.page_source)

    linux下使用selenium

    使用selenium需要对应的浏览器,这个就不做过多的解释了,直接官网上下载安装即可

    from selenium import webdriver
    
    from selenium.webdriver.chrome.options import Options
    
    options = Options()
    options.add_argument('--no-sandbox')
    options.add_argument('--disable-dev-shm-usage')
    options.add_argument('--headless')
    browser = webdriver.Chrome(chrome_options=options)
    
    browser.get("https://www.baidu.com")
    print browser.title
    
    '''
    –no-sandbox 参数是让Chrome在root权限下跑
    –headless 参数是不用打开图形界面
    # 如果想提高速度,可以添加以下参数
    options.add_argument('blink-settings=imagesEnabled=false') 
    # 谷歌文档提到需要加上这个属性来规避bug
    options.add_argument('--disable-gpu')
    '''

    scrapy框架

    概况:

    什么是框架: 
        框架其实是一个具有很强的通用性并且集成了很多功能的项目模板
    
    如何学习框架:
        掌握框架的功能,可以熟练使用每一种功能即可.
    
    scrapy:
        - 集成了异步操作,高性能的数据解析,高性能的持久化存储

    环境的安装:

    1. pip install wheel
    
    2. 下载twisted  http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
    
    3. 在python的Teminal中进入下载的目录,执行pip3 install Twisted‑17.1.0‑cp36‑cp36m‑win_amd64.whl
    
    4. pip3 install pywin32
    
    5. pip3 install scrapy

    使用流程:

    1.创建一个工程:(创建完成之后会出现一个项目的目录)
        scrapy startproject ProName

    2.cd 到ProName

    3.创建一个爬虫文件: (创建完成之后会在项目目录下的spiders目录下出现一个爬虫文件)

      scrapy genspider spiderName www.baibai.com

     

     

    然后在爬虫文件中会出现以下代码

    name : 爬虫文件的名称

    allowed_domains : 允许通过的域名(一般用不到,除非排除的时候)

    start_urls : 相当于所有的域名

    然后我们进入settings.py文件中进行配置:

    4.执行程序 : 

      scrapy crawl spiderName

    实例: 12306模拟登录

    超级鹰代码识别验证码:

    import requests
    from hashlib import md5
    
    class Chaojiying_Client(object):
    
        def __init__(self, username, password, soft_id):
            self.username = username
            password =  password.encode('utf8')
            self.password = md5(password).hexdigest()
            self.soft_id = soft_id
            self.base_params = {
                'user': self.username,
                'pass2': self.password,
                'softid': self.soft_id,
            }
            self.headers = {
                'Connection': 'Keep-Alive',
                'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
            }
    
        def PostPic(self, im, codetype):
            """
            im: 图片字节
            codetype: 题目类型 参考 http://www.chaojiying.com/price.html
            """
            params = {
                'codetype': codetype,
            }
            params.update(self.base_params)
            files = {'userfile': ('ccc.jpg', im)}
            r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)
            return r.json()
    
        def ReportError(self, im_id):
            """
            im_id:报错题目的图片ID
            """
            params = {
                'id': im_id,
            }
            params.update(self.base_params)
            r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
            return r.json()
    
    def get_img_text(imgPath):
        chaojiying = Chaojiying_Client('超级鹰账号', '超级鹰密码', '899370')#用户中心>>软件ID 生成一个替换 96001
        im = open(imgPath, 'rb').read()#本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
        return chaojiying.PostPic(im, 9004)['pic_str']

    然后对12306进行模拟登录: 验证码图片必须通过裁剪图片的形式获取

    from selenium import webdriver
    from lxml import etree
    from selenium.webdriver import ActionChains
    from PIL import Image
    from time import sleep
    
    bro = webdriver.Chrome(executable_path='./chromedriver.exe')
    bro.get('https://kyfw.12306.cn/otn/login/init')
    sleep(2)
    bro.find_element_by_id('username').send_keys('xxxxxxx')
    bro.find_element_by_id('password').send_keys('123456')
    
    #想要获取验证码图片左上角和右下角亮点坐标,通过这亮点坐标可以形成一个裁剪的矩形区域
    code_img_ele = bro.find_element_by_xpath('//*[@id="loginForm"]/div/ul[2]/li[4]/div/div/div[3]/img')
    location = code_img_ele.location  # 验证码图片左上角坐标
    size = code_img_ele.size #验证码图片的长宽
    #指定矩形区域
    rangle = (int(location['x']),int(location['y']),int(location['x']+size['width']),int(location['y']+size['height']))
    
    bro.save_screenshot('aa.png')
    
    i = Image.open('./aa.png')
    code_img_name = 'code.png'
    frame = i.crop(rangle)
    frame.save(code_img_name)
    #进行验证码的识别
    result = get_img_text(code_img_name)
    print(result)
    # x1,y1|x2,y2|x3,y3                   x,y
    #[[x1,y1],[x2,y2],[x3,y3]]            [[x,y]]
    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 l in all_list:
        #x,y就是需要点击的某一个点的坐标
        x = l[0]
        y = l[1]
        #move_to_element_with_offset就是将x,y的参照系转移到指定的标签中
        #每一个动作连的操作都必须基于一个单独的动作连
        ActionChains(bro).move_to_element_with_offset(code_img_ele,x,y).click().perform()
    
    sleep(2)
    
    bro.find_element_by_id('loginSub').click()
    sleep(10)
    
    bro.quit()
  • 相关阅读:
    C语言 · 字符串输入输出函数
    C语言 · 判定字符位置
    剑指offer二之替换空格
    剑指offer一之二维数组中的查找
    算法复杂度:时间复杂度与空间复杂度
    二分查找法
    信息熵
    K-means算法的原理、优缺点及改进(转)
    office2013安装与卸载
    Deep Learning (中文版&英文版)
  • 原文地址:https://www.cnblogs.com/zty1304368100/p/11042082.html
Copyright © 2011-2022 走看看