感觉有一段时间没有发博客了,今天1024,发一篇福利吧。贴吧签到机,利用selenium模拟浏览器登录,然后根据你关注的贴吧进行签到。
1.首先需要安装python2.7,Chrome浏览器,selenium,lxml
过程略
2.要上代码了
具体实现过程:
- 登录
- 获取访问贴吧的地址
- 写个for循环逐个访问并签到
2.1首先要解决登录问题
我把代码都封装在一个类里面了凑合着看吧
其中需要输入的url就是自己登陆了百度贴吧以后的地址,例如下面图中的这个地址栏点击,复制进去就行了
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()