您的位置:首页 > 编程语言 > Python开发

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个建议)

废话略多,支持正版,嗯,就这样。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: