感觉有一段时间没有发博客了,今天1024,发一篇福利吧。贴吧签到机,利用selenium模拟浏览器登录,然后根据你关注的贴吧进行签到。

1.首先需要安装python2.7,Chrome浏览器,selenium,lxml

过程略

2.要上代码了

具体实现过程:

  1. 登录
  2. 获取访问贴吧的地址
  3. 写个for循环逐个访问并签到

2.1首先要解决登录问题

我把代码都封装在一个类里面了凑合着看吧

其中需要输入的url就是自己登陆了百度贴吧以后的地址,例如下面图中的这个地址栏点击,复制进去就行了

贴吧签到 python脚本 贴吧签到神器_贴吧签到 python脚本

import time
from selenium import webdriver
from lxml import etree

class tiebaSpider():
    def __init__(self,url):
        '''
        初始化
        :param url: 
        '''
        self.url=url
        driver = webdriver.Chrome()
        self.driver=driver
        driver.delete_all_cookies()
        driver.get(url)
        html = driver.page_source
        self.html=html
        time.sleep(1)
        selector = etree.HTML(html)
        self.selector=selector

    def logIn(self,useName,passWord):
        '''
        登录模块,需要用户名和密码
        :param useName:
        :param passWord:
        :return:
        '''
        driver=self.driver
        time.sleep(2)
        driver.find_element_by_xpath('//*[@id="com_userbar"]/ul/li[4]/div/a').click()
        time.sleep(2)
        driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__footerULoginBtn"]').click()
        time.sleep(2)
        driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__userName"]').send_keys(useName)
        time.sleep(2)
        driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__password"]').send_keys(passWord)
        time.sleep(2)
        driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__submit"]').click()
        time.sleep(2)

2.2获取需要访问的贴吧

def getList1(self):
        '''
        获取关注的贴吧的地址列表
        :return: 
        '''
        button = self.driver.find_element_by_xpath('//*[@id="forum_group_wrap"]/span/span[1]')
        time.sleep(3)
        button.click()
        time.sleep(3)
        html = self.driver.page_source
        selector = etree.HTML(html)
        tiebaList = selector.xpath("//div[@id='forum_group_wrap']/a/@href") + selector.xpath(
            '//*[@id="forumscontainer"]//a/@href')
        print len(tiebaList)
        return ['http://tieba.baidu.com'+ url for url in set(tiebaList) if url != '#']

获取贴吧地址的方法,我们可以写的灵活点,把这个方法看做是一个接口,具体实现是调用别的方法,修改代码的时候可以很容易的修改,
比如:我这里有2个获取贴吧列表的方法,我只需把self.getList1()改成return self.getList2()
为什么这么做呢,主要是我觉得我们关注的贴吧一般都是固定,贴吧的地址也是固定的,所以我写了个方法把贴吧的地址直接爬取到本地,需要的时候更新一下就好,下次可以直接从本地读取地址而不需要再爬取地址了。

def getBaList(self):
        '''
        这里是获取贴吧地址的方法,返回的是一个列表
        这里发现我写的这个方法,又调用了另一个方法,这其实是一种灵活的写法,
        因为可以把这个方法看做是一个接口,具体实现是调用别的方法,修改代码的时候可以很容易的修改,
        比如:我这里有2个获取贴吧列表的方法,我只需把self.getList1()改成return self.getList2()
        :return:
        '''
        return self.getList1()
        # return self.getList2()

    def getList1(self):
        '''
        获取关注的贴吧的地址列表
        :return:
        '''
        button = self.driver.find_element_by_xpath('//*[@id="forum_group_wrap"]/span/span[1]')
        time.sleep(3)
        button.click()
        time.sleep(3)
        html = self.driver.page_source
        selector = etree.HTML(html)
        tiebaList = selector.xpath("//div[@id='forum_group_wrap']/a/@href") + selector.xpath(
            '//*[@id="forumscontainer"]//a/@href')
        print len(tiebaList)
        return ['http://tieba.baidu.com'+ url for url in set(tiebaList) if url != '#']

    def getList2(self):
        l=[]
        with open('tiebaList.txt','r') as f:
            for line in f:
                l.append(line.strip())
        return l

    def saveBaList(self):
        '''
        把关注的贴吧地址列表保存到本地,这样就用每次都爬取地址了
        :return:
        '''
        with open('tiebaList.txt','w') as f:
            for list in self.getList1():
                f.write( list+'\n')

2.3遍历贴吧地址点击签到

这个就很简单了

def signIn(self):
        '''
        循环贴吧地址,签到
        :return:
        '''
        driver=self.driver
        tiebaList = self.getBaList()
        time.sleep(2)
        for tiebaUrl in tiebaList:
            driver.get(tiebaUrl)
            time.sleep(2)
            driver.find_element_by_xpath('//*[@id="signstar_wrapper"]/a').click()
            time.sleep(2)

3完整代码

#coding=utf-8
import time
from selenium import webdriver
from lxml import etree


class tiebaSpider():
    def __init__(self,url):
        '''
        初始化
        :param url:
        '''
        self.url=url
        driver = webdriver.Chrome()
        self.driver=driver
        driver.delete_all_cookies()
        driver.get(url)
        html = driver.page_source
        self.html=html
        time.sleep(1)
        selector = etree.HTML(html)
        self.selector=selector

    def logIn(self,useName,passWord):
        '''
        登录模块,需要用户名和密码
        :param useName:
        :param passWord:
        :return:
        '''
        driver=self.driver
        time.sleep(2)
        driver.find_element_by_xpath('//*[@id="com_userbar"]/ul/li[4]/div/a').click()
        time.sleep(2)
        driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__footerULoginBtn"]').click()
        time.sleep(2)
        driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__userName"]').send_keys(useName)
        time.sleep(2)
        driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__password"]').send_keys(passWord)
        time.sleep(2)
        driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__submit"]').click()
        time.sleep(2)

    def signIn(self):
        '''
        循环贴吧地址,签到
        :return:
        '''
        driver=self.driver
        tiebaList = self.getBaList()
        time.sleep(2)
        for tiebaUrl in tiebaList:
            driver.get(tiebaUrl)
            time.sleep(2)
            driver.find_element_by_xpath('//*[@id="signstar_wrapper"]/a').click()
            time.sleep(2)

    def getBaList(self):
        '''
        这里是获取贴吧地址的方法,返回的是一个列表
        这里发现我写的这个方法,又调用了另一个方法,这其实是一种灵活的写法,
        因为可以把这个方法看做是一个接口,具体实现是调用别的方法,修改代码的时候可以很容易的修改,
        比如:我这里有2个获取贴吧列表的方法,我只需把self.getList1()改成return self.getList2()
        :return:
        '''
        # return self.getList1()
        return self.getList2()

    def getList1(self):
        '''
        获取关注的贴吧的地址列表
        :return:
        '''
        button = self.driver.find_element_by_xpath('//*[@id="forum_group_wrap"]/span/span[1]')
        time.sleep(3)
        button.click()
        time.sleep(3)
        html = self.driver.page_source
        selector = etree.HTML(html)
        tiebaList = selector.xpath("//div[@id='forum_group_wrap']/a/@href") + selector.xpath(
            '//*[@id="forumscontainer"]//a/@href')
        print len(tiebaList)
        return ['http://tieba.baidu.com'+ url for url in set(tiebaList) if url != '#']

    def getList2(self):
        l=[]
        with open('tiebaList.txt','r') as f:
            for line in f:
                l.append(line.strip())
        return l

    def saveBaList(self):
        '''
        把关注的贴吧地址列表保存到本地,这样就用每次都爬取地址了
        :return:
        '''
        with open('tiebaList.txt','w') as f:
            for list in self.getList1():
                f.write( list+'\n')

    def close(self):
        '''
        关掉浏览器
        :return:
        '''
        self.driver.quit()


def main():
    spider = tiebaSpider('http://tieba.baidu.com/home/main?id=7b9be5b08fe69fb3e9a39ee58f8ce9b1bc6f40&fr=userbar&red_tag=n3342692588')
    spider.logIn('账号','密码')
    spider.signIn()
    spider.close()


if __name__ == '__main__':
    main()