用webdriver实现批量自动发微博,通过Python实现一

作者: 网络编程  发布:2019-08-29

  2.开端使用selenium

    selenium能够帮助火狐、IE、Google,使用的时候都供给先下载对应的浏览器驱动,这里自个儿选用谷歌(Google)。首先去下载浏览器驱动,    在那一个网站下载 ,相同的时候,贴出Chrome浏览器版本和与之相应的驱动,仿效网站 

图片 1

    下载完事后还亟需实行配置, 一是亟需去境遇变量配置,在上头网站中有介绍,二是直接钦赐路径,小编利用的是第几种情势,比较便利,不要忘记导入对应的模块

    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)   // 选中哪个文本

参考

1、python爬虫入门 实战(四)---爬“榜姐”话题天涯论坛及火热批评
2、selenium之 玩转鼠标键盘操作(ActionChains)
3、Python爬虫利器五之Selenium的用法
4、Python selenium 二种等待方式详解
5、WebDriverWait等装置等待时间和过期时间
6、selenium python find_element_by_css_selector方法运用
7、selenium2 python自动化测量试验之利用AutoIt工具实现本和姑件上传
8、selenium借用AutoIt 完成上传文件

  1.读取文件

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

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

完全代码

(源码已上传github:python爬虫入门实战)
1、首要操作步骤写在weibo_transport模块中
2、引入crawl_weibo模块用于爬取原知乎数量
3、引入upload_driver模块用于将数据公布到新账号上
4、3个模块分别位居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爬虫入门 实战(四)---爬“榜姐”话题天涯论坛及火热商酌末尾

总结:     

  到现行反革命甘休基本主题部分的思路就做到了,然后对代码实行修饰,增添日志和足够管理,代码就完事了,贴出实当代码。  这几个顺序亦非特意复杂, 可是能够对有碰着类似情况的提供二个精减自身专门的学业量的笔触。从此处还可以够看看这种混乱并且重复的麻烦依旧得以透过代码来编排一些自动化学工业具的日常多斟酌,这种时候就能够让本身的职业量减弱过多,做出了那些软件一方面是缩减职业量,另一方面也是开展了python的上学,一箭双雕。

  同不时候大家不可能每一遍运转这几个程序都以经过ide来运维,最棒的主意是打成exe,须要的时候只要求双击一下。  假诺有亟待实行李包裹装成效的同窗能够看下一篇小说: 

图片 2View Code

 

思路

1、爬取原微博的博文内容,爬一条发一条
2、文字消息保存在list里,图片保存到地面
3、用webdriver实现批量出殡和埋葬今日头条
4、上传图片借助第三方工具autoIT

注:
为啥用webdriver来发今日头条而不用博客园开放平台的api?
因为揭橥带图片的天涯论坛的api是高档api供给创设应用并透过核实技艺申请,而过审并不是足以糊弄的,须求成熟且系统的运用。

需求应运而生/使用情况:

  因为集团索要将word办的接口文书档案在线化,看起来是个很好的工作,可是正是苦逼了小编们这么些干活儿的,其黑龙江中华南理教院程集团程量最大的就是参数的录入,倘诺参数少也罢,有的接口动辄三叁十八个参数,更甚八九13个,作者手动复制了三个三肆12个的就让笔者不敢相信 无法相信人生,作者觉的自家的人生无法在赋值接口参数中浪费掉。从前也学过好几python知识,也实践过通过selenium来模拟点击,所以就萌发了八个读取文件然后通过selenium来开展表单的填充和交给,达成工具现在会省掉差非常的少百分之八十的专业量。 大大提升了功用,也减弱了对手段的伤害。

  上面是参数录入分界面,能够明白点击以往贰个个贴补必要费多大的劲头。

图片 3

本篇目录:
1.思路
2.爬取原和讯
3.用webdriver运营浏览器登入和讯
4.用webdriver发表带图片的新浪
5.完好无损代码
6.作用显示动图
7.参考

兑现进程:

  下边介绍一下贯彻进度及思路,因为要复制word中的内容,不过在word中的格式不是统一的, 所以要实行人工的将接口复制到文本文书档案中,何况要做相应的格式管理,所以这些工具归属于半自动化。


爬取原微博

关于爬取博客园的详尽思路和促成能够参照笔者前边写的另一篇:
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传入以上函数,就可以回到大家供给的数量,细节见注释。通过那几个法子大家必要公布的乐乎数量已经能够爬取到了,接下去大家要登陆微博把它们披暴露去。

图1.封面而已


本文由金沙澳门官网发布于网络编程,转载请注明出处:用webdriver实现批量自动发微博,通过Python实现一

关键词: 金沙澳门官网

上一篇:的多版本共存,python人生从此处开始
下一篇:没有了