两个问题:
- 如何获得数据?
- 浏览器打开网页
- 等待加载完网页
- 找到数据位置
- 如何实时检测?(While(True))循环体解决
其实python模拟键盘鼠标点击也是有办法的,它可以是应用无关的,比如https://www.cnblogs.com/fanghao/p/8453207.html,也可以是应用有关的,比如selenium
注意在微博上,网页使用的是js触发html,所以禁用js以后就会出现一个空的html网页,这是我们不想见到的。那么怎么解决?两个办法,一是访问手机版、2是使用chromedriver进行模拟登陆,把chromedriver放在工程根目录下,就可以模拟chrome了。
用Python打开浏览器,
from selenium import webdriver
from time import sleep
url= 'https://weibo.com/1784190495/GeX0iBWOA?type=comment'
def start_chrome():
driver = webdriver.Chrome(executable_path='./chromedriver')
driver.start_client()
return driver
def find_info():
#css.selector
sel = 'span > span.line.S_line1 > span > em:nth-child(2)'
elems = driver.find_elements_by_css_selector(sel)
return [int(el.text) for i in elems[1,3]]
while True:
driver = start_chrome()
driver.get(url)
sleep(10) #等待页面加载完毕
info = find_info()
#[123,456,789]
rep, comm,like = info
if rep > 70000:
print('你关注的微博的转发量已经超过了 ' + str(rep))
print(f'你关注的微博的转发量已经超过{rep}')
#这是3.6的后续版本的一种特性,无需转换变量,直接代入进字符串||file.zhibo.tv/images/rich/rich1.png
break
else:
print('Not happening')
sleep(1200)
print('Done')
练习:微博话题数据提醒
当微博上话题 #奥斯卡# 的讨论数破370万时,print 出来
奥斯卡话题页面:
https://s.weibo.com/weibo/%2523%25E5%25A5%25A5%25E6%2596%25AF%25E5%258D%25A1%2523&Refer=STopic_box
提示
- 问题拆解提示
- 该问题可以拆解为以下若干子问题:
- 1.如何自动访问页面?
- 2.如何从页面中获取需要的信息?
- 3.如何持续监测?
- 问题解决提示
- 1.利用 selenium库中的 webdriver,自动化地完成打开浏览器、访问指定网址等一系列操作。
- 2.先利用 css 选择器定位页面中的元素位置,然后利用 webdriver 中的 find_elements_by_css_selector 函数,来获取相应的元素内容。
- 3.利用 while True 来进行持续监测。
代码
# Windows版的代码请在这下载:https://video.mugglecode.com/net4_practice.py
# 以下为Mac/Linux/可在麻瓜编程在线运行的代码:
# coding:utf-8
import time
from selenium import webdriver
# 利用webdriver开启chrome浏览器
def start_chrome():
# windows系统下,executable_path='./chromedriver.exe'
driver = webdriver.Chrome(executable_path='./chromedriver')
driver.start_client()
return driver
# 访问页面,并获取需要的信息
def get_info(driver, url):
# 访问页面
driver.get(url)
# 等待响应6秒
time.sleep(6)
# 利用chrome中的css选择器,获取到如下定位字符串
sel = "#pl_common_searchTop > div.search_topic > div.m_topic > div.small_pic > div > p > span:nth-child(2)"
elems = driver.find_elements_by_css_selector(sel)
# 通过页面检查,获取的结果只有一个,所以直接用elems[0].text
# 此时获取的内容是“讨论363万”,利用replace函数,将“讨论”两个字删掉
result = elems[0].text.replace("讨论","")
return result
url = "https://s.weibo.com/weibo/%2523%25E5%25A5%25A5%25E6%2596%25AF%25E5%258D%25A1%2523&Refer=STopic_box"
driver = start_chrome()
target = "370万"
# 每隔1200秒,监测一次
while True:
result = get_info(driver, url)
if result >= target:
print(f'微博话题“奥斯卡”的讨论量已经达到{result}')
break
else:
print(f'微博话题“奥斯卡”的讨论量还未突破{target}')
time.sleep(1200)
print("Done!")
网友评论