python 模拟用户登陆豆瓣小组,删除小组内自己发起的帖子
2017-04-30 23:02
483 查看
python 模拟用户登陆豆瓣小组,删除小组内自己发起的帖子
昨天登陆了一下两三年没登陆过的豆瓣账号,看到高中时候发起的逗逼话题。没有管理员权限,花了一个小时,手动删除了几百条回复后,终于成功删除了一个话题。。。。首先是开发环境,我是在windows下
burpsuite,抓包工具,当然也可用其它工具
firefox,为了方便使用burpsuite,所以选择火狐浏览器
python2.7,beautifulsoup+html5lib,虽然正则表达式或者lxml性能会好很多
本节内容是先模拟用户登陆,需要保存用户的cookie
import re import urllib,urllib2 import cookielib from bs4 import BeautifulSoup #登陆页面的url login_url = 'https://www.douban.com/login?source=group' cookie = cookielib.CookieJar() handler = urllib2.HTTPCookieProcessor(cookie) opener = urllib2.build_opener(handler)
点击登陆按钮后,在burpsuite抓包后,参数为
所以需要提交的参数有,source,redir,form_eamil,form_password,captcha-solution,captcha-id,login。要知道,并不是所有的参数都是必须的,并且,每一次抓到的部分参数也是不同的,比如redir,以及captcha-solution和captcha-id,有时候登陆时并不需要验证验证码。下面是构造的提交数据:
data = { 'source' : 'None', #登陆后,跳转到豆瓣小组,若是豆瓣同城的话,则是https://www.douban.com/location 'redir' : 'https://www.douban.com/group', #邮箱 'form_email' : 'xxxxxxx', #密码 'form_password' : 'xxxxxx' }
在上面的data中我并没有设置验证码,因为有时登陆并不需要提交验证码登陆,所以我们需要判断,登陆页面是否需要验证码
login_page = opener.open(login_url).read() #beautifulsoup对象 login_bsObj = BeautifulSoup(login_page,'html5lib')
此时我们可以使用开发者工具查看元素
发现,如果有验证码的话,我们可以直接从页面中获取captcha-id,和验证码图片
#验证码输入框 captcha_input = login_bsObj.find("input",{"name":"captcha-id"}) #如果不需要验证码,则captcha_input 为None,若不为空,则获取captcha_id和验证码图片 if captcha_input: captcha_id = captcha_input.get("value") data['captcha-id'] = captcha_id captcha_img = login_bsObj.find("img",{"class":"captcha_image"}) img_src = img.get("src") """ 之前有考虑过使用pytesseract识别验证码,但是只是简单的识别的话,效果不太好,基本识别出来的验证码全错,所以使用将图片保存到本地的方式,自己打开识别后,接收输入的验证码 """ #下载图片到本地,保存为test.jpg urllib.urlretrieve(img_src,'test.jpg') #此处需要打开下载的图片,识别出验证码,手动输入 captcha_solution = raw_input("please input code:") data['captcha-solution'] = captcha_solution
顺便把抓到的headers加上去,
headers = { 'Host' : 'www.douban.com', 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0', 'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language' : 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3', 'Content-Type' : 'application/x-www-form-urlencoded', 'Content-Length' : None, 'Connetion' : 'close', 'Referer' : 'https://www.douban.com/login', 'Upgrade-Insecure-Requests' : 1 } values = urllib.urlencode(data) #Content-Length 的值等于values 字符串的长度 headers['Content-Length'] = len(values) #此处的url为form表单提交的url,可以通过login_bsObj获取到form表单的action属性得到url,这儿就直接写了,因为基本上通用 url = 'https://accounts.douban.com/login' request = urllib2.Request(url,values,headers=headers) #登陆后的豆瓣小组页面 group_page = opener.open(request) group_bsObj = BeautifulSoup(group_page.read(),'html5lib') print group_page.geturl() print group_bsObj.form
测试登陆成功后,打印豆瓣小组页面的个人表格部分,如图所示
特别需要注意的地方是,根据你选择在哪一个页面进行豆瓣账号的登陆,相应的data中的source,redir以及headers中Host,Referer也会发生改变,并且登陆后跳转的页面也会发生改变,我这儿的data和headers是为了我登陆后直接跳转到https://www.douban.com/group/explore页面,所以login_url=’https://www.douban.com/login?source=group‘。并且设置为相应的 data和headers。这些值大部分都可以通过beautifulsoup在页面中获取到。根据我前几次的失败经验来看,若是对应的值错误,很有可能登陆失败,抛出404错误。
。。。。
————————-分割线——————————————————–
以上,写上面这一点东西花了大概两个多小时,主要是为了让代码变得好看一点,比如说取有意义的变量名,怎么让代码更简洁,能少一行是一行,哪些行不能少。
对每一步进行测试,写注释,但是限于水平原因,很多地方依然没讲清楚,我也没有什么写博客的经验。轻喷
虽然后面的部分我也完成了,但是对应的代码修改还没有完成,而且我还要思考一下,关于执行删除帖子的回复的操作时候,使用哪一种方式更好,我当时是直接分析源代码得出对应的参数值,以及url页面,但是还可以通过渲染动态网页来达到效果。
明天继续更新。嗯
对了,还有我的参考书
用python写网络爬虫
python网络数据采集
还有刚刚才开始看的电子书
还有豆瓣阅读的电子书(编写高质量代码:改善python程序的91个建议)
废话略多,支持正版,嗯,就这样。
相关文章推荐
- Python模拟用户登陆网站
- python实战系列之模拟用户密码登陆系统(一)
- Python模拟用户自动登陆网易126邮箱
- Python使用装饰器模拟用户登陆验证功能示例
- Discuz!论坛教程之如何禁止/允许用户删除自己发布的帖子
- python模拟登陆后用户访问网站
- 学习MVC3(二)——创建自己的第一个网页:实现用户登陆(2)
- 删除共享登陆用户信息||无权访问共享资源解决方法
- HttpURLConnection模拟用户登陆
- srping security3.0(一)----登陆不能抛出自己定义的异常,用户不存在异常,用户尝试登陆次数过多,回到登陆之前访问的页面
- 删除共享登陆用户信息||无权访问共享资源解决方法
- 工作时候自己写的一个用户采集python
- 代码模拟用户登陆
- 网站与discuz的论坛进行整合,实现用户同步注册,单点登陆,同步删除用户,同步修改用户密码
- mysql 5.x.x版本,如何删除匿名用户登陆
- 数据库还原后无法登陆的问题?因为选定的用户拥有对象,无法删除
- C# : WebRequest发起Http Post请求模拟登陆并cookie处理示例
- 2008删除没有数据库用户映射的登录及该登陆对应的作业
- 如何才能保证自己的资源文件(图片,xml配置文件等)不被用户删除呢?
- PHP 模拟登陆MSN并获得用户信息