数据采集实战:如何自动化运营微博?
【项目目标】
1.掌握 Selenium 自动化测试工具,以及元素定位的方法
2.学会编写微博自动化功能模块:加关注,写评论,发微博
【Selenium 自动化测试工具】
1.通过 id 定位:我们可以使用 find_element_by_id() 函数。比如我们想定位 id=loginName 的元素,就可以使用 browser.find_element_by_id(“loginName”)。
2.通过 name 定位:我们可以使用 find_element_by_name() 函数,比如我们想要对 name=key_word 的元素进行定位,就可以使用 browser.find_element_by_name(“key_word”)。
3.通过 class 定位:可以使用 find_element_by_class_name() 函数。
4.通过 tag 定位:使用 find_element_by_tag_name() 函数。
5.通过 link 上的完整文本定位:使用 find_element_by_link_text() 函数。
6.通过 link 上的部分文本定位:使用 find_element_by_partial_link_text() 函数。有时候超链接上的文本很长,我们通过查找部分文本内容就可以定位。
7.通过 XPath 定位:使用 find_element_by_xpath() 函数。使用 XPath 定位的通用性比较好,因为当 id、name、class 为多个,或者元素没有这些属性值的时候,XPath 定位可以帮我们完成任务。
8.通过 CSS 定位:使用 find_element_by_css_selector() 函数。CSS 定位也是常用的定位方法,相比于 XPath 来说更简洁。
在我们获取某个元素之后,就可以对这个元素进行操作了,对元素进行的操作包括:
1.清空输入框的内容:使用 clear() 函数;
2.在输入框中输入内容:使用 send_keys(content) 函数传入要输入的文本;
3.点击按钮:使用 click() 函数,如果元素是个按钮或者链接的时候,可以点击操作;
4.提交表单:使用 submit() 函数,元素对象为一个表单的时候,可以提交表单;
【代码实现】
# 登录微博 def weibo_login(username, password): # 打开微博登录页 browser.get('https://passport.weibo.cn/signin/login') browser.implicitly_wait(5) time.sleep(1) # 填写登录信息:用户名、密码 browser.find_element_by_id("loginName").send_keys(username) browser.find_element_by_id("loginPassword").send_keys(password) time.sleep(1) # 点击登录按钮 browser.find_element_by_id("loginAction").click() time.sleep(1) # 获取短信验证 browser.find_element_by_xpath("//div[@class='my-btn-box']/a").click() time.sleep(1) ver_code = int(input("请输入验证码:")) browser.find_element_by_xpath("//div[@class='m-td']/span/input").send_keys(ver_code) time.sleep(1) browser.find_element_by_xpath("//div[@class='my-btn-box']/a").click() time.sleep(1)
需要说明的是,你需要填写自己的微博用户名和密码(对应 username 和 password)。
【微博自动化运营:加关注,写评论,发微博】
# 关注用户 def add_follow(uid): browser.get('https://m.weibo.cn/u/' + uid) time.sleep(1) browser.find_element_by_xpath("//div[@callback='follow()']").click() time.sleep(1) # 选择分组 browser.find_element_by_xpath("//a[@class='m-btn m-btn-white m-btn-text-black']").click() time.sleep(1)
1.如何找到用户的 UID
点击任何一个微博用户,查看他的 URL 链接,比如链接是https://weibo.com/u/5020181423 ,那么 u 后面的数字 5020181423 即为用户的 UID
2.使用 XPath 定位元素定位
如何找到“关注”这个按钮的元素标识?在 Chrome 浏览器中,在“关注”按钮用鼠标右键点击,选择“检查”查看这个元素对应的代码。
然后在选择分组时,点击取消按钮
# 发微博 def post_weibo(content): # 跳转到用户的首页 browser.get('https://m.weibo.cn/') browser.implicitly_wait(5) # 点击右上角的发布按钮 browser.find_element_by_xpath("//div[@class='lite-iconf lite-iconf-releas']").click() # 在弹出的文本框中输入内容 browser.find_element_by_xpath("//span[@class='m-wz-def']/textarea").send_keys(content) time.sleep(1) # 点击发布按钮 browser.find_element_by_xpath("//a[@class='m-send-btn']").click() time.sleep(1) # 评论微博 def add_comment(weibo_url, content): browser.get(weibo_url) browser.implicitly_wait(5) # 点击评论区 browser.find_element_by_xpath("//div[@class='box-left m-box-col m-box-center-a']").click() time.sleep(1) # 写评论 browser.find_element_by_xpath("//div[@class='textarea-box']/textarea[1]").send_keys(content) time.sleep(2) # 点击发送按钮 browser.find_element_by_xpath("//button[@class='btn-send']").click() time.sleep(1)
【项目总结】
通过实战对使用 Selenium WebDriver 更有了解,包括如何定位指定的元素,对元素进行各种操作等。同时使用了 implicitly_wait 函数以及 time.sleep() 函数让浏览器和程序等待一段时间,完成数据加载之后再进行后续的操作,这样就避免了数据没有加载完,导致获取不到指定元素的情况。通过三个模块(加关注、写评论、发微博)的编写,了解如何使用工具完成自动化的操作。