背景介绍
- 我是二房东(整租下一套房子), 现欲将其中的房间分租出去,以分担房租, 所以会在豆瓣网等平台发帖子,
发帖子
是个寻找和发现的过程还可以接受,在脚本上,可以看到我已经发了16个帖子了,脚本的主要功能是:更新
帖子内容或顶帖到前面展示
, 这是个很无聊很机械的动作, 所以写了这个脚本来解决更新
和顶帖
的问题
收益
- 比手动操作快
- 成就感很强, 哈哈
使用说明
- 以下代码经过win10, python3.6 测试通过验证
- 由于其中涉及到个人登录, 隐去了登录相关的信息
- 网站的xpath路径在目前测试通过, 若源网站修改, 则不能及时更新
- 发贴标题和内容严重简化,不保证可以通过豆瓣平台的验证, 请参考豆瓣网的发贴规则,这里不做介绍的
中间的坑
- chrome.exe是谷歌的浏览器, 和chromedrive.exe是谷歌浏览器的接口,这是两个文件, 两个都要下载到电脑本地,且版本要一致, 怎么选? 参考这个文章
- 若出现验证码 我没有进行识别, 需要手动进行输入,在每个可能需要出现验证码的地方,都给出了10秒或20秒的倒计时.
整个脚本如下:
# -*- coding: utf-8 -*-
# -*- coding=gbk -*-
from time import sleep
import random
from selenium import webdriver
# 标题list
title_list = [
'有房出租',
]
# 内容list
content_list = [
'''有房出租,不限男女'''
]
# 回应内容list,
message = [
'up, up....'
]
# 以上三个全部为list,目的在于,你可以多写几个, 发贴时从中随机取出一个写入平台
# 登录模块的xpath
login_xpath = {
'login_url': "https://www.douban.com/accounts/login?source=group", # 登录网站
'user': "//input[@id='email']", # 用户名框
'pwd': "//input[@id='password']", # 密码框
'ver_code': '//*[@id="captcha_image"]', # 验证码,未用到
'ver_code_input': '//*[@id="captcha_field"]', # 验证码框, 未用到
'login': "//input[@class='btn-submit']",
}
# 这是写贴页面的三个要素:标题,内容,提交
douban_seeds = {
'title_input': "//textarea[@class='group-editor-input']",
'content_input': "//div[@class='notranslate public-DraftEditor-content']",
'submit': "//div[@class='group-editor-submit-group']/a[2]",
}
# 这是顶贴页面的多个要素
respond_xpath = {
'group': "//div[@class='global-nav-items']/ul/li[6]",
'my_send': "//div[@class='info']/p/a[1]",
'blog_list': "//table[@class='olt']/tbody/tr[{i}]/td[@class='title']/a",
'edit': "//span[@class='fleft']/a",
'my_answer': "//textarea[@id='last']",
'submit': "//span[@class='bn-flat-hot rr js-verify-account']/input",
}
class RespondMessage:
def __init__(self, *args, **kwargs):
self.user = kwargs.get('user')
self.pwd = kwargs.get('pwd')
self.title_list = title_list
self.content_list = content_list
self.message = message
self.login_xpath = login_xpath
self.respond_xpath = respond_xpath
self.douban_seeds = douban_seeds
# 尤其要注意这个路径的问题
self.driver_path = 'D:\\chromedriver.exe'
self.browser = webdriver.Chrome(self.driver_path)
def get_rand(self):
"""
随机取出标题和内容
"""
title = random.choice(self.title_list)
content = random.choice(self.content_list)
return title, content
def _login(self):
"""
登录页面
"""
self.browser.get(self.login_xpath.get('login_url'))
self.browser.find_element_by_xpath(
self.login_xpath.get('user')).send_keys(self.user)
sleep(1)
self.browser.find_element_by_xpath(
self.login_xpath.get('pwd')).send_keys(self.pwd)
# 下面的20秒倒计时是为了让你有时间去写入验证码,若没有出现验证码,则无视就好,不用注释掉, 除了时间方面, 其它不影响代码执行
for i in reversed(range(20)):
print(i+1)
sleep(1)
self.browser.find_element_by_xpath(self.login_xpath.get('login')).click()
return self.browser
def respond_message(self, is_refresh=1):
"""
is_refresh = 1 为顶贴模式
is_refresh = 0 为更新贴子内容模式
"""
# 获取登录的页面
browser = self._login()
# 跳转到指定的页面
browser.find_element_by_xpath(self.respond_xpath.get('group')).click()
browser.find_element_by_xpath(self.respond_xpath.get('my_send')).click()
# 到达指定的列表面
for i in range(1, 16):
browser.find_element_by_xpath(
self.respond_xpath.get('blog_list').format(i=i)).click()
if is_refresh == 0:
browser.find_element_by_xpath(
self.respond_xpath.get('edit')).click()
self.update_blog()
elif is_refresh == 1:
self.writer_message()
browser.back()
self.close()
def update_blog(self):
"""
更新贴子逻辑
"""
title, content = self.get_rand()
title_input = self.browser.find_element_by_xpath(
self.douban_seeds.get('title_input'))
title_input.clear()
title_input.send_keys(title)
content_input = self.browser.find_element_by_xpath(
self.douban_seeds.get('content_input'))
content_input.clear()
content_input.send_keys(content)
for i in reversed(range(10)):
print(i+1)
sleep(1)
submit = self.browser.find_element_by_xpath(
self.douban_seeds.get('submit')).click()
sleep(3)
self.browser.back()
def writer_message(self):
"""
顶贴逻辑
"""
mes = random.choice(self.message)
self.browser.find_element_by_xpath(
self.respond_xpath.get('my_answer')).send_keys(mes)
for i in reversed(range(10)):
print(i+1)
sleep(1)
submit = self.browser.find_element_by_xpath(
self.respond_xpath.get('submit')).click()
sleep(3)
self.browser.back()
def close(self):
"""
关闭窗口
"""
self.browser.close()
if __name__ == "__main__":
user = 'user'
pwd = 'pwd'
res_message = RespondMessage(user=user, pwd=pwd)
res_message.respond_message(is_refresh=1)
刷新两天后, 房子租出去了,哈哈