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()
  • 相关阅读:
    在日本被禁止的コンプガチャ設計
    Starling常见问题解决办法
    Flixel引擎学习笔记
    SQLSERVER中修复状态为Suspect的数据库
    T4 (Text Template Transformation Toolkit)实现简单实体代码生成
    创建Linking Server in SQL SERVER 2008
    Linq to Sql 与Linq to Entities 生成的SQL Script与分页实现
    Linq to Entity 的T4 模板生成代码
    在VisualStudio2008 SP1中调试.net framework 源代码
    使用HttpModules实现Asp.net离线应用程序
  • 原文地址:https://www.cnblogs.com/zty1304368100/p/11042082.html
Copyright © 2011-2022 走看看