python selenium批量在豆瓣租房上 发帖子

版权声明:诸葛老刘所有 https://blog.csdn.net/weixin_39791387/article/details/85003672

背景介绍

  • 我是二房东(整租下一套房子), 现欲将其中的房间分租出去,以分担房租, 所以会在豆瓣网等平台发帖子, 发帖子是个寻找和发现的过程还可以接受,在脚本上,可以看到我已经发了16个帖子了,脚本的主要功能是:更新帖子内容或顶帖到前面展示, 这是个很无聊很机械的动作, 所以写了这个脚本来解决更新顶帖的问题

收益

  • 比手动操作快
  • 成就感很强, 哈哈

使用说明

  • 以下代码经过win10, python3.6 测试通过验证
  • 由于其中涉及到个人登录, 隐去了登录相关的信息
  • 网站的xpath路径在目前测试通过, 若源网站修改, 则不能及时更新
  • 发贴标题和内容严重简化,不保证可以通过豆瓣平台的验证, 请参考豆瓣网的发贴规则,这里不做介绍的

中间的坑

  • chrome.exe是谷歌的浏览器, 和chromedrive.exe是谷歌浏览器的接口,这是两个文件, 两个都要下载到电脑本地,且版本要一致, 怎么选? 参考这个文章

整个脚本如下:

# -*- 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)

猜你喜欢

转载自blog.csdn.net/weixin_39791387/article/details/85003672
今日推荐