您的位置:68399皇家赌场 > 集群主机 > 皇家赌场:python爬虫入门 实战(伍)---用webdri

皇家赌场:python爬虫入门 实战(伍)---用webdri

发布时间:2019-05-03 22:06编辑:集群主机浏览(153)

    落到实处进程:

      上边介绍一下达成进度及思路,因为要复制word中的内容,但是在word中的格式不是联合的, 所以要开始展览人工的将接口复制到文本文档中,并且要做相应的格式管理,所以那一个工具归属于半自动化。

    需求:
    博主在此之前有一段时间突然不想玩今日头条了,然后正好大哥想玩,就给他用了,手提式有线电话机绑定也换到了她的号码。如今突然又想要玩,就再度开了个号。新号和讯空空的,也从未怎么关怀。于是就发出了八个需求,正好能够借那么些空子学习一下自动化测试工具webdriver的中央使用:
    壹、将原今日头条的博文搬到新账号
    二、用新账号关怀原博客园的具有关怀

    四.脚本使用


    早就形成的本子文件在条件布署成功后,能够一贯使用,整个工程中国共产党有四个文本:

    • detection_ad.rb:
      可实施文件,在极端terminal中(windows下为cmd)施行命令:

      >  ruby detection_ad.rb
      

      工程就能够平日运转。

    • weburl.txt:
      那个文件用来放置待检验的网页网站,每壹行仅能放置1个网站。程序运维后,脚本会展开weburl.txt文本,并逐条对文本中的全体网站进行检验。
      当要求修改此文件名称时,须求在本子中期维修改有关代码,将weburl.txt修改成温馨须求的名号:

      web_file = "weburl.txt"
      
    • ad_file.xls:
      本条文件用于保存数据,脚本运维后甩卖得到的具备数据会全部写入这些文件中。如若急需将最终数额写入到其余名目标xls文件中,只必要修改detection_ad.rb文件中相关代码,将ad_file.xls改为团结索要的称号:

      excel_fil.write "ad_file.xls"
      

    基本操作:

    总结:     

      到今天停止基本大旨部分的思路就形成了,然后对代码进行修饰,增加日志和那几个管理,代码就做到了,贴出完毕代码。  这一个程序也不是特地复杂, 可是能够对有蒙受类似场地包车型客车提供3个缩减本人工作量的笔触。从此处如故得以看来那种混乱并且重复的难为还能够经过代码来编排一些自动化学工业具的平时多怀念,那种时候就能够让和睦的专业量收缩过多,做出了那几个软件一方面是压缩职业量,另壹方面也是张开了python的就学,一箭双雕。

      同时咱们不可能每回运转这几个程序都以通过ide来运行,最棒的章程是打成exe,供给的时候只需求双击一下。  假诺有须要张开包装功效的同校能够看下1篇作品: 

    皇家赌场 1View Code

     

    用webdriver运转浏览器登五日涯论坛

    webdriver的使用其实卓殊轻松。能够那样描述:
    1、用驱动器运维浏览器并开荒三个接连
    2、依照页面html源码的布局找到钦定的因素(开关、文本框等)
    三、对目的成分选用目标动作(点击、输入等)

    运用webdriver须要下载selenium模块浏览器驱动
    一、下载安装selenium模块,命令行:

    pip install selenium
    

    二、博主用的是chrome浏览器,所以本篇以其对应的驱动chromedriver.exe为例,百度大概google就足以找到下载链接,下载好刺探压到大四路线就可以,代码中钦定该路径。

    3、一定要保管selenium模块、浏览器驱动、浏览器都以风靡版本,以防产生不要求的bug。一般pip指令安装的都是最新版本的模块。

    抓实以上希图未来,就能够在代码里引进webdriver了,大家先用登入来打个样儿。代码要做的正是驱动运行浏览器后,get天涯论坛的主页,用driver的各个find_element方法找到账号和密码输入框,键入账号密码举办登入,有时可能必要注明。以下显示的是账号输入框的地点与质量:

    图三.账号输入框地方

    webdriver的主旨采纳:
    一、能够依赖class和id来找到成分,也能够用xpath语法和css选用器来找到成分

    driver.find_element_by_id('id')
    driver.find_element_by_class_name('classname')
    driver.find_element_by_css_selector('input[type="password"]')
    driver.find_element_by_xpath('//div[@node-type="textElDiv"]/textarea[@class="W_input"]')
    

    二、用element.click点击成分,用element.send_keys向文本框键入文字,别的动作能够用ActionChains,参考selenium之 玩转鼠标键盘操作(ActionChains)。
    三、详细表明可参照Python爬虫利器5之Selenium的用法,更加多用法参考互联网教程和文书档案。

    报到代码:

    driver = webdriver.Chrome(executable_path='../drivers/chromedriver.exe')# chrome浏览器驱动
    url='http://weibo.com/'
    driver.get(url)# get打开微博主页
    
    input_account=driver.find_element_by_id('loginname')# 找到账号输入框
    input_psw=driver.find_element_by_css_selector('input[type="password"]')# 找到密码输入框
    
    #输入账号密码并登录
    input_account.send_keys('account')
    input_psw.send_keys('password')
    
    bt_logoin=driver.find_element_by_class_name('login_btn')# 找到登录按钮
    bt_logoin.click()# 点击登录
    

    唯独上述代码在网络状态倒霉的时候会产生找不到成分的bug,那首若是因为页面还未曾加载达成形成的。
    应该将find账号输入框的代码修改为:

    # 参数10为超时时间,即最大等待时间为10秒,关于lambda就自行百度吧
    bt_logoin=WebDriverWait(driver,10).until(lambda x:x.find_element_by_id('loginname'))
    

    至于等待页面加载的别样艺术的现实性介绍,能够参照Python selenium 两种等待形式详解和WebDriverWait等装置等待时间和过期时间这两篇。

    出现验证码的景况:
    在点击了登入开关之后,有时会产出验证码。对于那种状态,大家只供给插手1个推断,假诺点击登入前边世了验证码输入框,就决断需求输入验证码,大家在调节台手动输入并send_keys到验证码输入框就可以。(验证码自动破解相比复杂,不建议在入门阶段切磋)

    拍卖验证码的代码:

    # 根据验证框的存在与否判断是否要输入验证码
    def isVerifyCodeExist(self):
        try:# 如果成功找到验证码输入框返回true
            self.driver.find_element_by_css_selector('input[name="verifycode"]')
            return True
        except:# 如果异常返回false
            return False
    
    # 输入验证码部分,如果无需输入则直接返回,否则手动输入成功后返回        
    def inputVerifyCode(self):
        input_verifycode=self.driver.find_element_by_css_selector('input[name="verifycode"]')# 验证码输入框
        bt_change=self.driver.find_element_by_css_selector('img[action-type="btn_change_verifycode"]')# 验证码图片,点击切换
        bt_logoin=self.driver.find_element_by_class_name('login_btn')# 登录按钮
        while self.isVerifyCodeExist():# 如果验证码输入框一直存在,则一直循环
            print u'请输入验证码……(输入"c"切换验证码图片)'
            verifycode=raw_input()
            if verifycode=='c':
                bt_change.click()
            else:
                input_verifycode.send_keys(verifycode)
                bt_logoin.click()
                # 点击完登录以后判断是否成功
                if self.driver.current_url.split('/')[-1]=='home':# 如果连接已经跳转到home
                    print u'登录成功'
                    break
                else:
                    print u'输入的验证码不正确'
    

    在事先的登入代码末尾调用inputVerifyCode方法就能够。

    四.设置selenium浏览器驱动driver

    • Chrome
      • 本子对应:ChromeDriver与Chrome版本的照管关系
      • driver下载:ChromeDriver - WebDriver for Chrome
    • Firefox
      • driver下载及版本对应:https://github.com/mozilla/geckodriver/releases

    依照自身的浏览器版本,选用相应的selenium浏览器驱动版本driver进行下载解压,将下载解压好的driver文件移动到/usr/bin/文件夹下就可以。

    上述四步,是linux下运作程序供给的条件安排,务必保管每一步的准确安装。

    四:使用CMD测试是不是陈设成功

      一.读取文件

        首先要因此python举行理文件件的读取,不得不说python的语法是真的简简洁,读取文件一行代码的事,然后剩下的便是依照有个别标记符,对每1行数据进行拍卖存款和储蓄。  下列是读取文件代码示例:

        f = open("C:\Users\Administrator\Desktop\api.txt", 'r', encoding='UTF-8')
        list = f.readlines()
    

    用webdriver宣布带图片的今日头条

    只要仅发表文字内容的博客园,比较简单,思路与以上同理,先找到文本框成分,用send_keys输入内容,找到'公布'开关,点击按键就能够颁发。

    # 上传文字
    def upload_txt(self,text):
        # 用xpath语法找到输入框
        input_w=self.driver.find_element_by_xpath('//div[@node-type="textElDiv"]/textarea[@class="W_input"]')
        input_w.send_keys(text)
    # 发布
    def send(self):
        # 找到发布按钮并点击
        self.driver.find_element_by_class_name('W_btn_a').click()
    

    而对于急需宣布图片的博文,大家还亟需点击图片->点击单图/多图。接着大家得以窥见目的对象不是input型的文件上传按键,input型的文件上传大家得以用send_keys直接键入文件地方,方便飞速。不过博客园那些文件上传是object型的,那不得不信赖第三方工具autoIT来对os弹窗实行一波骚操作了。

    图肆.图纸上传按键

    从上图看,能够窥见那几个object的id包蕴'swf_upbtn'那样四个字段,之后很引人侧目是三个时刻也许变化的数字串,所以大家得以用xpath的contains函数来找到它,点击那个开关之后会弹出上传文书的窗口,那些窗口就不是selenium能垄断(monopoly)的了,需求编写autoIT脚本来调整文件的上传操作,再在python代码中通过os模块调用这几个剧本。

    autoIT的装置和选用
    参考selenium二python自动化测试之利用AutoIt工具落成当和姑件上传和 selenium借用AutoIt 完成上传文件这两篇。

    自笔者的autoIT脚本代码:

    WinWait("打开","",10000);
    ControlFocus("打开", "", "Edit1");
    ControlSetText("打开" ,"", "Edit1", $CmdLine[1]);
    Sleep(1000)
    ControlClick("打开", "","Button1");
    

    上述代码实行的操作是:
    1、等待文件上传窗口的面世,最多等待十s(因为chrome浏览器的文件上传窗口标题是"展开",第叁个参数是窗口标题)
    二、将光标集中于文件地点编辑框
    3、在编辑框里键入参数(相当于大家随后会传来的地点)
    4、点击"打开"按钮
    详尽用法和表达请参阅以上两篇。

    $CmdLine[1]能够读取到命令行的第二个参数,通过那个参数大家就足以把公文地方传入。关于参数的印证和其余的完成文件上传的秘籍参考Python Selenium —— 文件上传、下载,其实极粗略。

    上传文字和图纸的方法封装如下:

    # 上传文字
    def upload_txt(self,text):
        input_w=self.driver.find_element_by_xpath('//div[@node-type="textElDiv"]/textarea[@class="W_input"]')
        input_w.send_keys(text)
        sleep(1)
    
    #运行上传图片脚步
    def upload_img_script(self,time_bef,time_after,path):# path参数需要前后带双引号
        sleep(time_bef)# 等待弹窗时间
        os.system('C:/Users/15850/Documents/GitHub/MyWorkspace/py_study/script/upload.exe ' path)
        sleep(time_after)# 等待图片加载时间
    
    # 上传文字和单图
    def upload_txt_img(self,text,img_path):
        self.upload_txt(text)# 将文字上传
        img=self.driver.find_element_by_css_selector('a[action-type="multiimage"]')# 图片按钮
        img.click()# 点击图片按钮
        sleep(1)# 等待加载其他按钮
    
        #单图/多图按钮,即上传图片按钮
        bt_uploadimg=WebDriverWait(self.driver,10).until(lambda x:x.find_element_by_xpath('//object[contains(@id,"swf_upbtn")]'))
        bt_uploadimg.click()# 点击上传按钮
    
        self.upload_img_script(1,2,img_path)
    
    # 上传文字和多图    
    def upload_txt_multiImg(self,text,img_path_list):
        self.upload_txt_img(text,img_path_list[0])# 将文字和第一张图片上传
    
        len_imgs=len(img_path_list)# 图片地址list的长度    
        bt_uploadimg=WebDriverWait(self.driver,10).until(lambda x:x.find_element_by_xpath('//li[@node-type="uploadBtn"]/div/object[contains(@id,"swf_upbtn")]'))
        for i in range(len_imgs-1):# 将剩余图片上传 
            bt_uploadimg.click()
            self.upload_img_script(1, 2,img_path_list[i 1])
    

    中间那1行正是调用了编写翻译成exe文件的上传文件的脚步,参数字符串先指明脚本路线,空1格加上path那一个参数。

    os.system('C:/Users/15850/Documents/GitHub/MyWorkspace/py_study/script/upload.exe ' path)
    

    在意path传入的字符串必须带双引号,字符串本人也亟需单引号包罗,且分隔符必须为"",如下:

    '"C:\Users\15850\Documents\GitHub\MyWorkspace\py_study\img\1.jpg"'
    
    贰.MatchData对象的分组捕获

    此地不对ruby中的正则表明式的语法进行详述,仅对其MatchData对象中的分组捕获相关的几点做轻易的印证。

    • match方法

      • 能够双向使用match方法,即正则说明式和字符串对象均能够响应match方法。match方法会将字符串参数转变为正则表明式
      • match与=~的界别:正则表明式相配后重临值差异,=~再次来到字符串相配中相配的开始地点的数字索引,而match则赶回MatchData实例:

        2.2.7 :017 > "The alphabet starts with abc" =~ /abc/
         => 25 
        2.2.7 :018 > /abc/.match("The alphabet starts with abc")
         => #<MatchData "abc"> 
        
    • MatchData对象

      • 当正则表明式通过match方法相称时,重回二个MatchData对象;当正则表明式不相配时,再次来到nil

        2.2.7 :019 > /abc/.match("abcd")
         => #<MatchData "abc"> 
        2.2.7 :020 > /abc/.match("bcd")
         => nil 
        
      • 分组捕获

        • 正则表达式通过圆括号钦命捕获(capture)。当二个字符串和形式之间开始展览正则相称测试时,常常是想利用字符串,只怕更常见的是用字符串的1有个别成功部分操作。捕获表示法让用户能够从能够相配特殊子格局的字符串中,收取和保存字符子串。
        • 从MatchData对象中收获捕获结果的2个格局是直接通过数组的艺术索引对象:0索引会重回相称的漫天字符串;从1始发以往,n的索引会基于从左侧的括号开首计数,重回第n个捕获结果。关于“从左初阶计数圆括号”的周期性,用1个例子来证实:

          a=/((a)((b)c)(d)?)/.match("abce")
              => #<MatchData "abc" 1:"abc" 2:"a" 3:"bc" 4:"b" 5:nil> 
          a[0]                => "abc"
          a[1]                => "abc" 
          a[2]                => "a" 
          a[3]                => "bc" 
          a[4]                => "b" 
          a[5]                => nil        (不匹配)
          a[6]                => nil        (超出范围)
          a[-2]               => "b" 
          

          可以一定的是,上式中,从左边起头计数的成对圆括号之间相配的结果,与结果严俊对应。


    须求出现/使用处境:

      因为集团索要将word办的接口文书档案在线化,看起来是个很好的作业,不过正是苦逼了大家那么些干活儿的,其吉林中华南理艺术高校程公司程量最大的正是参数的录入,尽管参数少也罢,有的接口动辄3三15个参数,更甚8玖拾肆个,作者手动复制了一个三四1几个的就让笔者困惑人生,作者觉的小编的人生不可能在赋值接口参数中浪费掉。在此之前也学过一些python知识,也举办过通过selenium来模拟点击,所以就萌发了3个读取文件然后通过selenium来进行表单的填写和交由,落成工具未来会省去大约十分八的职业量。 大大进步了频率,也减弱了对花招的妨害。

      上边是参数录入界面,能够清楚点击今后贰个个贴补要求费多大的力气。

    皇家赌场 2

    思路

    一、爬取原天涯论坛的博文内容,爬一条发一条
    二、文字新闻保存在list里,图片保存到本地
    三、用webdriver落成批量发送乐乎
    四、上传图片借助第一方工具autoIT

    注:
    干什么用webdriver来发新浪而不用天涯论坛开放平台的api?
    因为公布带图片的博客园的api是高级api需求创制应用并透过审查才干申请,而过审并不是足以糊弄的,供给成熟且系统的使用。

    1.安装ruby

    依照那篇小说《Ruby 安装 - Windows》安装ruby就能够,记得勾选Add Ruby executables to your PATH那一项。一样,要求ruby版本大于等于二.0。

    image.png

      2.伊始选取selenium

        selenium能够支持火狐、IE、谷歌(Google),使用的时候都亟需先下载对应的浏览器驱动,这里本身选用谷歌(Google)。首先去下载浏览器驱动,    在这一个网站下载 ,同时,贴出Chrome浏览器版本和与之相应的驱动,参考网站 

    皇家赌场 3

        下载完之后还索要开始展览布置, 一是内需去境遇变量配置,在地点网站中有介绍,2是一贯钦赐路径,小编利用的是第二种艺术,相比方便,不要遗忘导入对应的模块

        browser = webdriver.Chrome(executable_path=".chromedriver.exe")
    

     

        selenium的基本操作,这里只介绍一些以此代码中使用到的,越多API百度一下不胜多:

        browser.get("https://baidu.com")    // 访问网址
        obj = browser.find_element_by_id("ks_ka_api_id")   // 通过id查找元素
        obj1 = browser.find_element_by_xpath('//*[@id="test_form"]/input[5]') // 通过xpath查找元素
        obj2 = find_elements_by_tag_name("p") // 通过Dom来查找元素
    
        obj2.send_keys();    // 填充数据
        obj.click()    // 点击按钮
    

        在自动话的进度中运用到了下拉框的抉择,通过寻觅能够经过须臾间代码来落到实处钦赐选中,其余的办法能够由此网络教程来通晓:

        f_selet = Select(browser.find_element_by_id("ks_ka_id"))   // 下拉框对象
        f_selet.select_by_visible_text(select_text)   // 选中哪个文本
    

    成效突显动图

    Windows下景况布署

    windows下的条件计划与Linux下略有不一致,但思路是相通的。

    image.png

    参考

    1、python爬虫入门 实战(四)---爬“榜姐”话题网易及热门冲突
    2、selenium之 玩转鼠标键盘操作(ActionChains)
    3、Python爬虫利器伍之Selenium的用法
    4、Python selenium 三种等待格局详解
    5、WebDriverWait等装置等待时间和过期时间
    6、selenium python find_element_by_css_selector方法运用
    7、selenium2python自动化测试之利用AutoIt工具达成地点文件上传
    8、selenium借用AutoIt 落成上传文件

    2.安装ruby版本的selenium

    cmd中执行:

    gem install selenium-webdriver  
    

    selenium-webdriver的Github源码地址

    陆:代码示例:

    说明:
    本篇首要描述第3个供给的实现,第一个供给的落成参见python爬虫入门 实战(6)---用webdriver达成博客园批量自动关怀。

    (壹)加载库文件

    require 'rubygems'  
    require 'selenium-webdriver' 
    require 'spreadsheet'
    

    一:用途主要用来驱动浏览器实行自动化的操作。


    四.安装selenium浏览器驱动driver

    • Chrome
      • 本子对应:ChromeDriver与Chrome版本的对应关系
      • driver下载:ChromeDriver - WebDriver for Chrome
    • Firefox
      • driver下载及版本对应:https://github.com/mozilla/geckodriver/releases

    基于自身的浏览器版本,选拔相应的selenium浏览器驱动版本driver举办下载解压,将下载解压好的driver文件放在对应的浏览器安装目录下,之后须要对Windows景况变量进行安插。
    Windows下需求在系统变量的path变量中增加exe文件的职位,配置情形变量可参看那篇文章:Win7怎么着增添情形变量,注意路线中不要有普通话。

    同等,那肆步也是Windows下必备的条件安顿。但在和煦的测试进程中,由于部分安然无恙主题材料,Windows下的chrome始终不曾调通,但Firefox是足以采纳的。

    Selenium自动化测试库模拟登入

    功用体现动图

    功用体现动图

    五.总结


    到这里,大家的全体育工作程就全部到位了,大家期待达到的目的也都实现了。但此间还有一对疑团或是难点有待解决:

    • 频率难点:即便能够兑现第3方网页检测,但程序试行的速度相对不快
    • 代码并不曾包装的很好,且引进了全局变量,当这几个剧本用在十分的大型的且复杂的工程中时,极大概出现难题
    • 代码品质有待抓实
    • 是因为时间比较急,对代码中变量的称呼未有运用的很纯粹,注释也不是很显明,必要校对

    目前想到那样多,后续必要认真修正和上学。

    PS:须要设置一下Chrome的驱动,谷歌(Google)寻觅官方网址
    步骤:

    壹体化代码

    (源码已上传github:python爬虫入门实战)
    1、首要操作步骤写在weibo_transport模块中
    2、引入crawl_weibo模块用于爬取原天涯论坛数量
    3、引入upload_driver模块用于将数据发表到新账号上
    四、一个模块分别放在github项目中的crawl与weibo文件夹下

    weibo_transport模块

    # -*- coding:utf-8 -*-
    '''
    Created on 2017年6月25日
    
    @author: wycheng
    '''
    from crawl import crawl_weibo
    import upload_driver
    from lxml import html
    import requests
    
    def getContent(card):# 获取该card下微博的内容
        mblog=card['mblog']
        count_img=0# 每条微博重新计数图片数,用于发送图片的地址
    
        text= html.fromstring(mblog['text'])
        text=text.xpath('string(.)')#过滤正文中的多余标签
    
        url_img=''
        if 'pics' in mblog:#有图片的存储图片
            pics=mblog['pics']
            for pic in pics:
                url_img=pic['large']['url']
                ir = requests.get(url_img)
                if ir.status_code == 200:# 如果请求已成功
                    count_img =1# 给图片计数
                    open('../img/' str(count_img) '.jpg', 'wb').write(ir.content)# 保存在img文件夹下,发送也从这个文件夹下找
                print u'图片:' url_img
    
        scheme=card['scheme']
        created_at=mblog['created_at']
        source=mblog['source']
        reposts_count=mblog['reposts_count']
        comments_count=mblog['comments_count']
        attitudes_count=mblog['attitudes_count']
    
        return text,count_img,scheme,created_at,source,reposts_count,comments_count,attitudes_count# 其实返回的是一个list
    
    #登录
    uploader=upload_driver.Uploader()
    uploader.login('account', 'password')# 填写你的账号密码
    
    crawl_weibo=crawl_weibo.CrawlWeibo()
    # 先爬取第34页进行发布,作为范例
    # 这里的页码不是微博客户端上的页码,这个接口返回的一页只有10个card
    # 博主原微博有370 条微博,所以一共有38页
    cards=crawl_weibo.getWeibo('2622535523',34)# 第一个参数是用户id,第二个是页数
    len_cards=len(cards)
    
    for j in range(len_cards):
        index=len_cards-1-j
    
        card=cards[index]
    
        # (微博的cardtype==9,实战四也有说明,转发的微博mblog里有‘retweeted_status’这个key)
        if card['card_type']==9 and not 'retweeted_status' in card['mblog']:# 如果这是一条非转发的微博的card
            # 获取这条微博的各个数据
            content_list=getContent(card)
            text,count_img,scheme,created_at,source,reposts_count,comments_count,attitudes_count=content_list
    
            # 发送这条微博的内容到新账号
            # 拼接要发送的文本
            text=created_at u'  来自 ' source 'n' text ' n' u'转发 ' str(reposts_count) u'  评论 ' str(comments_count) u'  点赞 ' str(attitudes_count)
    
            path_list=[]# 图片地址list
            for i in range(count_img):# 根据图片总数量生成所有图片地址
                path_list.append('C:\Users\15850\Documents\GitHub\MyWorkspace\py_study\img\' str(i 1) '.jpg')
            # 上传内容
            if count_img==0:# 没有图片
                uploader.upload_txt(text)
            elif count_img==1:# 单张图片
                uploader.upload_txt_img(text, path_list[0])
            else:# 多张图片
                uploader.upload_txt_multiImg(text,path_list)
    
            uploader.send()
    

    upload_driver模块

    # -*- coding:utf-8 -*-
    '''
    Created on 2017年6月25日
    
    @author: wycheng
    '''
    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from time import sleep
    import os
    
    class Uploader:
        driver = webdriver.Chrome(executable_path='../drivers/chromedriver.exe')# chrome浏览器驱动
        # 根据验证框的存在与否判断是否要输入验证码
        def isVerifyCodeExist(self):
            try:# 如果成功找到验证码输入框返回true
                self.driver.find_element_by_css_selector('input[name="verifycode"]')
                return True
            except:# 如果异常返回false
                return False
    
        # 输入验证码部分,如果无需输入则直接返回,否则手动输入成功后返回        
        def inputVerifyCode(self):
            input_verifycode=self.driver.find_element_by_css_selector('input[name="verifycode"]')# 验证码输入框
            bt_change=self.driver.find_element_by_css_selector('img[action-type="btn_change_verifycode"]')# 验证码图片,点击切换
            bt_logoin=self.driver.find_element_by_class_name('login_btn')# 登录按钮
            while self.isVerifyCodeExist():
                print u'请输入验证码……(输入"c"切换验证码图片)'
                verifycode=raw_input()
                if verifycode=='c':
                    bt_change.click()
                else:
                    input_verifycode.send_keys(verifycode)
                    bt_logoin.click()
                    # 点击完登录以后判断是否成功
                    if self.driver.current_url.split('/')[-1]=='home':
                        print u'登录成功'
                        break
                    else:
                        print u'输入的验证码不正确'
    
        #打开微博首页进行登录的过程
        def login(self,account,password):
            self.driver.implicitly_wait(10)# 设置隐性等待时间,等待页面加载完成才会进行下一步,最多等待10秒
            url='http://weibo.com/'
            self.driver.get(url)
            #输入账号密码并登录
            WebDriverWait(self.driver,10).until(lambda x:x.find_element_by_id('loginname')).send_keys(account)
            self.driver.find_element_by_css_selector('input[type="password"]').send_keys(password)
    
            bt_logoin=self.driver.find_element_by_class_name('login_btn')
            bt_logoin.click()
    
            #如果存在验证码,则进入手动输入验证码过程
            if self.isVerifyCodeExist():
                self.inputVerifyCode()  
    
        # 上传文字
        def upload_txt(self,text):
            input_w=self.driver.find_element_by_xpath('//div[@node-type="textElDiv"]/textarea[@class="W_input"]')
            input_w.send_keys(text)
            sleep(1)
    
        #运行上传图片脚步
        def upload_img_script(self,time_bef,time_after,path):# path参数需要前后带双引号
            sleep(time_bef)# 等待弹窗时间
            os.system('C:/Users/15850/Documents/GitHub/MyWorkspace/py_study/script/upload.exe ' path)
            sleep(time_after)# 等待图片加载时间
    
        # 上传文字和单图
        def upload_txt_img(self,text,img_path):
            self.upload_txt(text)# 将文字上传
            img=self.driver.find_element_by_css_selector('a[action-type="multiimage"]')# 图片按钮
            img.click()# 点击图片按钮
            sleep(1)# 等待加载其他按钮
    
            #单图/多图按钮,即上传图片按钮
            bt_uploadimg=WebDriverWait(self.driver,10).until(lambda x:x.find_element_by_xpath('//object[contains(@id,"swf_upbtn")]'))
            bt_uploadimg.click()# 点击上传按钮
    
            self.upload_img_script(1,2,img_path)
    
        # 上传文字和多图    
        def upload_txt_multiImg(self,text,img_path_list):
            self.upload_txt_img(text,img_path_list[0])# 将文字和第一张图片上传
    
            len_imgs=len(img_path_list)# 图片地址list的长度    
            bt_uploadimg=WebDriverWait(self.driver,10).until(lambda x:x.find_element_by_xpath('//li[@node-type="uploadBtn"]/div/object[contains(@id,"swf_upbtn")]'))
            for i in range(len_imgs-1):# 将剩余图片上传 
                bt_uploadimg.click()
                self.upload_img_script(1, 2,img_path_list[i 1])
    
        # 发布
        def send(self):
            self.driver.find_element_by_class_name('W_btn_a').click()
            sleep(4)# 等待发送成功字样消失
    

    crawl_weibo模块
    参考python爬虫入门 实战(四)---爬“榜姐”话题微博及热门商讨末尾

    本文的工程指标是运用ruby编写贰个本子文件,实现对网页中第一方广告的检查评定和总结。
    系列源代码:https://github.com/vito0705/selenium_vito

    from selenium import webdriver
    
    # browser  = webdriver.Firefox()
    browser  = webdriver.Chrome()
    
    browser.get('http://www.baidu.com')
    print(browser.page_source)
    browser.close()
    

    涉及:
    一、request的骨干使用
    2、json解析
    三、用request下载图片并保存到本地
    四、用webdriver登入并发送乐乎
    5、用autoIT化解非input型的文书上传

    1.安装ruby

    能够参照那篇小说中利用rvm管理ruby的措施安装,必要ruby版本大于等于二.0,具体安装不作越多表明。

    如图展现表明已经配备成功!

    爬取原今日头条

    有关爬取搜狐的详实思路和达成能够参考笔者前边写的另1篇:
    python爬虫入门 实战(四)---爬“榜姐”话题腾讯网及火爆商量

    这里会直白引进实战肆的代码模块crawl_weibo,在那之中的getWeibo方法能够获取到钦命和讯用户的装有腾讯网的json,并领取当中的cards(叁个list数组,全体的博客园新闻都在其间)重回,该模块详细源码参见以上链接末尾。

    getWeibo方法:

    # 获取指定博主的所有微博card的list
    def getWeibo(self,id,page):#id(字符串类型):博主的用户id,page(整型):微博翻页参数
    
        url='https://m.weibo.cn/api/container/getIndex?type=uid&value=' id '&containerid=107603' id '&page=' str(page)
        response=requests.get(url)
        ob_json=json.loads(response.text)
    
        list_cards=ob_json['cards']
        return list_cards# 返回本页所有的cards
    

    第二显著我们要爬取原博客园的持有除了转载以外的今日头条的原版的书文、图片以及来自、点赞数、研讨数等其余消息。接下来先分析一下json 的组织,json的格式化推荐json.cn。

    图2.json结构

    事先教程里也说了,json便是list和dict的相互嵌套,所以只要会用list和dict,搞清楚json结构,提取数额就很轻松了。

    小编们把文字新闻提抽出来,把图片都下载到当地的二个文本夹里,以便之后发天涯论坛上传。对于图片存款和储蓄,用request来get一下图形的url,获取的回来内容用open创制二个.jpg格式的file来写入。为了上传的时候便于填写图片地址,图片按梯次编号存入项目下的img文件夹中。上传时只要求凭借图片总数按序遍历就能够

    获得和讯内容数据代码:

    def getContent(self,card):# 获取该card下微博的内容
        mblog=card['mblog']
        count_img=0# 每条微博重新计数图片数,用于发送图片的地址
    
        text= html.fromstring(mblog['text'])
        text=text.xpath('string(.)')#过滤正文中的多余标签
    
        url_img=''
        if 'pics' in mblog:#如果mblog中有键'pics',说明该条微博有图片,存储图片到本地
            pics=mblog['pics']
            for pic in pics:
                url_img=pic['large']['url']
                ir = requests.get(url_img)
                if ir.status_code == 200:# 如果请求已成功
                    count_img =1# 给图片计数
                    open('../img/' str(count_img) '.jpg', 'wb').write(ir.content)# 保存在img文件夹下,发送也从这个文件夹下找
    
    
        scheme=card['scheme']# 原微博链接
        created_at=mblog['created_at']# 原微博创建时间
        source=mblog['source']# 原微博来源,即终端
        reposts_count=mblog['reposts_count']# 原微博转发数
        comments_count=mblog['comments_count']# 原微博评论数
        attitudes_count=mblog['attitudes_count']# 原微博点赞数
    
        return text,count_img,scheme,created_at,source,reposts_count,comments_count,attitudes_count# 其实返回的是一个list
    

    将getWeibo重回的list(也正是json中的cards)中的二个card传入以上函数,就可以回到大家要求的多寡,细节见注释。通过这么些艺术大家要求表露的和讯数据现已能够爬取到了,接下去我们要登入博客园把它们披揭穿去。

    (3)网页检查测试部分

    这一部分的机能是检查评定四个网页中的全部第二方广告,找到广告的域并总结广告的数码,进一步要求分离出页面中隐藏的第一方广告。
    大家将这有个别概念为3个格局:search_ads(driver, web_url_para, sheet),那几个格局须要四个参数:

    • driver:已经创制的浏览器driver实例,如driver = Selenium::WebDriver.for :firefox
    • web_url_para:待检验网页网站url
    • sheet:已经创办的excel表单实例,如sheet = excel_fil.create_worksheet :name => "ads_show"

    接下去会从多少个模块来介绍那一局地剧情。

    from selenium import webdriver
    browser = webdriver.Chrome()
    开发银行报错:

    本文由68399皇家赌场发布于集群主机,转载请注明出处:皇家赌场:python爬虫入门 实战(伍)---用webdri

    关键词: 68399皇家赌场 Python3... Ruby &

上一篇:C#通过奥莱Db查询Oracle存款和储蓄进程

下一篇:没有了