一般来说分三种:
* 给公众号发送特定文字
* 普通的网页点击
* 授权的网页点击
我这里给出前两种的解决方案。
普通的网页点击:
1. 建议通过浏览器或者Wireshark分析消息的交互。
2. 之后通过requests模拟。
由于没有具体的网址,我没有办法给出具体的代码。
给公众号发送特定的问题:
1. 建议使用Python的微信API(pip install itchat)
2. 由于没有提供Python版本,我这里给出兼容的解决方案
#coding=utf8
import threading
import itchat
SIGN_IN_MP_DICT = {
u'学校微信公众号': u'学校签到口令',
u'公司微信公众号': u'公司签到口令', }
def get_day(timeGap):
return int(time.strftime('%y%m%d', time.localtime(time.time() + timeGap)))
NEXT_SIGN_DATE = get_day(60*60*24)
def sign_in_thread():
''' 签到线程
如果尚未到需要签到的日期,则继续循环
如果到了需要签到的日期,则完成两个公众号的签到,并更新日期
'''
while 1:
if get_day <NEXT_SIGN_DATE:
time.sleep(30)
else:
for k, v in SIGN_IN_MP_DICT.items():
itchat.send(msg=v,
toUserName=itchat.search_mps(name=k)[0]['UserName'])
NEXT_SIGN_DATE = get_day(60*60*24)
itchat.auto_login(True)
# 测试是否存在特定公众号
for mpName in SIGN_IN_MP_DICT.keys():
mpList = itchat.search_mps(name=mpName)
if len(mpList) != 1:
print(u'没有检测到公众号“%s”,请检查名称')
break
else:
signInThread = threading.Thread(target=sign_in_thread)
signInThread.setDaemon(True)
signInThread.start()
itchat.run()
最近想买个行车记录仪,经常在在什么值得买上搜索信息,感觉浪费的时间比较多,就想用Python写个自动搜索的功能。另外,什么值得买已经很久没有签到了,刚开始玩的时候台天天签到,乐此不疲。现在已经很久没有签到了,既然我是码农,当然得实现自动化哈。
1.实现自动登录;
2.实现自动签到;
3.实现搜索功能;
requests库应该就能实现这些功能,但是需要解析页面,我这些需求简单,没有性能要求,因此采用简单的selenium库模拟浏览器操作实现这个需求。
selenium、BeautifulSoup
关于selenium的使用在 Python爬取煎蛋妹子图 里有介绍。
遇到的坑:
1.点击登录按钮后,弹出登录框,后续无法找到用户名、密码的element。
开始以为是点击登录后,马上就去获取这个element,此时登录框还没有弹出来,因此延迟了3秒(这个问题在模拟登录百度时碰到过)。依旧不能解决。问题原因就是没有获取到当前登录框的handle,因此获取所有的window_handle,然后切换到当前的,debug发现是始终只有一个handle。
其实什么值得买的登录框是一个frame,需要采用switch_to.frame方法定位到当前frame。
搜索只处理了搜索结果的第一页,如果需要更多的数据,处理分页即可。
以上三个方法即实现了三个功能需求,但是我想要每天自动实现登录、签到功能,同时搜索‘行车记录仪’处理结果能够发送到手机。实现搜索结果发送到手机,自然想到了 itchat 这个库。另外使用 apscheduler 实现了定时任务。
下面开始列遇到的坑:
1.签到时
写的时候没注意,捕获异常写了EOFrror,导致签到过后,后续不会发送微信消息。EOFrror是意味着它发现了一个不期望的文件尾时会抛出的异常,因此这里不会捕获到。
修改成:
#输入帐号browser.find_element_by_xpath('//input[@name="empcode"]').send_keys('帐号')
#输入密码
browser.find_element_by_xpath('//input[@class="pass-word"]').send_keys('密码')
#点击签到
browser.find_element_by_xpath('//span[@class="kq-onwork"]').click()