涉及关键词:requests库 requests.post方法 cookies登陆
version 1.5(附录):使用post方法登陆豆瓣,成功! 缺点:无法获得登陆成功后的cookie,要使用js等方法来获得cookie,放弃
versoin 2.0(附录): 使用selenium模拟浏览器登陆豆瓣,使用浏览器自动加载js,并成功获取cookies,可以为后来浏览使用,可行,成功!
一、目的分析
利用cookie登陆豆瓣,并写一篇日记
https://www.douban.com/note/636142594/
二、步骤分析
1、使用浏览器登陆豆瓣,得到并分析cookie
2、使用cookie模拟登陆豆瓣(使用账号密码登陆也可以,需要验证码,cookie的时效一般就几天)
3、分析浏览器写日记行为,在python中模拟post行为
4、源码及测试
三、scrapy shell 模拟登陆
1、使用浏览器登陆豆瓣,在fidder中获得cookie
cookie中有许多项(并不是全部需要),经过一条条测试,发现只要包含'dbcl2'就能登录
2、打开scrapy shell 测试登陆
模拟浏览器User-Agent和cookies
$ scrapy shell ... from scrapy import Request cookies = {'dbcl2':'"164753551:kjyoTNgwwII"'} headers={'User-Agent':'Mozilla/5.0'} req = Request('https://www.douban.com/mine/', headers=headers,cookies = cookies) fetch(req) #使用浏览器检查元素得到xpath(方法参考爬虫(一)(二))(日记内容权限未自己可见,若可看见日记内容便模拟登陆成功) >>> response.xpath('//*[@id="note_636142594_short"]').extract() ['<div class="note" id="note_636142594_short">Hello Douban</div>'] >>> response.xpath('//*[@id="note_636142594_short"]/text()').extract() ['Hello Douban'] >>>
得到日记内容,可见模拟登陆成功,cookie可用
四、python 写豆瓣日记
1、使用浏览器写日记,并在fidder中观察行为
发现浏览器进行了POST https://www.douban.com/note/create HTTP/1.1的行为
post 的内容是ck=BsJH¬e_id=636142544¬e_title=test_2¬e_text=hello2&author_tags=¬e_privacy=P
ck=BsJH 是cookie中的一个值
note_id=636142544(估计是用户id,直接照抄)
note_id=636142544¬e_title=test_2¬e_text=hello2(标题,以及内容)
另外三个参数不重要,使用默认就行
2、使用python模拟post行为
#post 所需要的参数
requests.post(url = url,data = data,headers=headers,verify=False,cookies = cookies)
五、源码及测试
源码
1 import requests 2 ### 1、首先登陆任何页面,获取cookie 3 4 #使用requests打开https时会产生warming,加上这句屏蔽 5 requests.packages.urllib3.disable_warnings() 6 7 headers = dict() 8 headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.3387.400 QQBrowser/9.6.11984.400' 9 10 cookies = dict() 11 cookies = {#'ll':'"118201"', 12 #'bid':'PUWFXi53MHA', 13 #'_ga':'GA1.2.1759080547.1501749204', 14 #'__yadk_uid':'rjmLGzYjJuHI5lHNHJX3lOgBAltgb5Xy', 15 #'gr_user_id':'16c2c492-9e32-4af2-9c35-230e8d43db06', 16 #'ps':'y', 17 #'_pk_ref.100001.8cb4':'%5B%22%22%2C%22%22%2C1504529257%2C%22https%3A%2F%2Faccounts.douban.com%2Flogin%3Fredir%3Dhttps%253A%252F%252Fwww.baidu.com%252Flink%253Furl%253DEh3nGSbWZ6S0P2OQc7QHrEzCkdwJewBLjFnBpRTRwKv4QwoLScCwKCSh9iQFeDAx%2526wd%253D%2526eqid%253D8191d1c1000627560000000359ad43f4%22%5D', 18 #'ap':'1', 19 #'_vwo_uuid_v2':'57D26B154CE7E363177CFD5F35F06F34|e63fa1bfe4c07598b6454ae2a97166cb', 20 'dbcl2':'"164753551:kjyoTNgwwII"' 21 #'ck':'osar', 22 #'_pk_id.100001.8cb4':'70e88acbc88cb16d.1501749196.11.1504530290.1504527380.', 23 #'_pk_ses.100001.8cb4':'*', 24 #'push_noty_num':'0', 25 #'push_doumail_num':'0', 26 #'__utma':'30149280.1759080547.1501749204.1504529257.1504530054.20', 27 #'__utmb':'30149280.5.10.1504530054', 28 #'__utmc':'30149280', 29 #'__utmz':'30149280.1504530054.20.16.utmcsr', 30 #'__utmv':'30149280.16475' 31 } 32 33 data = {'ck':'BsJH', 34 'note_id':'636142544', 35 'note_title':'HelloPython', 36 'note_text':'HelloPython' 37 #'author_tags':'', 38 #'note_privacy':'P' 39 } 40 url = 'https://www.douban.com/note/create' 41 #注意访问https链接时要加上verify=False参数,否则回报错 42 ret = requests.post(url = url, 43 data = data, 44 headers=headers, 45 verify=False, 46 cookies = cookies 47 ) 48 print(ret.text[:300]) 49 print(ret.cookies.get_dict())
测试结果
大功告成!
五、总结分析
1、这次使用cookie登陆免去了验证码麻烦,下次希望能研究验证码的破解
2、cookie的使用时间有限,隔一段时间就要更换
3、requests对https的限制挺严格的,需要加入verify=False,并且要屏蔽警告信息
#使用requests打开https时会产生warming,加上这句屏蔽
requests.packages.urllib3.disable_warnings()
附录(一)
vesion 1.5
import requests from lxml import etree import time #使用requests打开https时会产生warming,加上这句屏蔽 requests.packages.urllib3.disable_warnings() def get_github_html(url): ''' 这里用于获取登录页的html,以及cookie :param url: https://github.com/login :return: 登录页面的HTML,以及第一次的cookei ''' response = requests.get(url,verify=False) first_cookie = response.cookies.get_dict() return response.text,first_cookie def get_token(html,xrule): ''' 处理登录后页面的html :param html: :return: 获取csrftoken ''' selector = etree.HTML(html) token = selector.xpath(xrule)[0] #print(token) return token def gihub_login(url,cookie): ''' 这个是用于登录 :param url: https://github.com/session :param token: csrftoken :param cookie: 第一次登录时候的cookie :return: 返回第一次和第二次合并后的cooke ''' data={ "source":"movie", "redir":"https://movie.douban.com/chart", "form_email":"***********", "form_password":"***********", "login":u'登录', "remember":"on" } response = requests.post(url,data=data,cookies=cookie,verify=False) print(response.status_code) print(response.url) print(response.cookies.get_dict()) cookie2 = response.cookies.get_dict() #这里注释的解释一下,是因为之前github是通过将两次的cookie进行合并的 #现在不用了可以直接获取就行 cookie.update(cookie2) print(cookie) #print(response.text) return cookie if __name__ == '__main__': Base_URL = "https://movie.douban.com/?_t_t_t=0.6509884103763016" Login_URL = "https://www.douban.com/accounts/login" html,cookie = get_github_html(Base_URL) print(cookie) #xrule = '//*[@id="login"]/form/div[1]/input[2]/@value' #token = get_token(html,xrule) #print(token) time.sleep(3) cookie2 = gihub_login(Login_URL,cookie) time.sleep(3) response = requests.get("https://www.douban.com/mine/",verify=False,cookies=cookie2) print(response.cookies.get_dict()) print(response.url,response.status_code) #print(response.text)
vesion 2.0
from selenium import webdriver Base_URL = "https://movie.douban.com/?_t_t_t=0.6509884103763016" Login_URL = "https://www.douban.com/accounts/login" browser = webdriver.Firefox() browser.get('https://movie.douban.com/') cookies = browser.get_cookies() #print(cookies) #打开网址 browser.get('https://www.douban.com/accounts/login') #browser.maximize_window()#窗口最大化,可有可无,看情况 #输入账户密码 #我请求的页面的账户输入框的'id'是username和密码输入框的'id'是password browser.find_element_by_id('email').clear() browser.find_element_by_id('email').send_keys(u'***********') browser.find_element_by_id('password').clear() browser.find_element_by_id('password').send_keys(u'***********') #remember me browser.find_element_by_id('remember').click() #输入完用户密码当然就是提交了,通过'name'为login来找到提交按钮 browser.find_element_by_name('login').click() #print(browser.current_url) if browser.current_url =='https://www.douban.com/accounts/login': #输入账户密码 #我请求的页面的账户输入框的'id'是username和密码输入框的'id'是password browser.find_element_by_id('email').clear() browser.find_element_by_id('email').send_keys(u'***********') browser.find_element_by_id('password').clear() browser.find_element_by_id('password').send_keys(u'***********') captcha_field = input("请输入验证码:") captcha_field = str(captcha_field) browser.find_element_by_id('captcha_field').clear() browser.find_element_by_id('captcha_field').send_keys(captcha_field) #remember me browser.find_element_by_id('remember').click() #输入完用户密码当然就是提交了,通过'name'为login来找到提交按钮 browser.find_element_by_name('login').click() browser.get("https://www.douban.com/mine/") cookies2 = browser.get_cookies() print(browser.current_url) print(cookies2) #浏览器退出 browser.quit()