博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python爬虫个人记录(四)利用Python在豆瓣上写一篇日记
阅读量:5112 次
发布时间:2019-06-13

本文共 7556 字,大约阅读时间需要 25 分钟。

涉及关键词:requests库 requests.post方法 cookies登陆

version 1.5(附录):使用post方法登陆豆瓣,成功! 缺点:无法获得登陆成功后的cookie,要使用js等方法来获得cookie,放弃

versoin 2.0(附录):  使用selenium模拟浏览器登陆豆瓣,使用浏览器自动加载js,并成功获取cookies,可以为后来浏览使用,可行,成功!

 

一、目的分析

利用cookie登陆豆瓣,并写一篇日记 

二、步骤分析

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 Requestcookies = {
'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()['
Hello Douban
']>>> 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&note_id=636142544&note_title=test_2&note_text=hello2&author_tags=&note_privacy=P

ck=BsJH  是cookie中的一个值 

note_id=636142544(估计是用户id,直接照抄)

note_id=636142544&note_title=test_2&note_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 = cookies47 )48 print(ret.text[:300])49 print(ret.cookies.get_dict())
View Code

测试结果

 

大功告成!

五、总结分析

1、这次使用cookie登陆免去了验证码麻烦,下次希望能研究验证码的破解

2、cookie的使用时间有限,隔一段时间就要更换

3、requests对https的限制挺严格的,需要加入verify=False,并且要屏蔽警告信息

  #使用requests打开https时会产生warming,加上这句屏蔽

  requests.packages.urllib3.disable_warnings()

 

附录(一)

vesion 1.5

import requestsfrom lxml import etreeimport 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_cookiedef get_token(html,xrule):    '''    处理登录后页面的html    :param html:    :return: 获取csrftoken    '''       selector = etree.HTML(html)    token = selector.xpath(xrule)[0]    #print(token)    return tokendef 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 cookieif __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 1.5

vesion 2.0

from selenium import webdriverBase_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'是passwordbrowser.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 mebrowser.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()
vesion 2.0

 

 

 

 

转载于:https://www.cnblogs.com/Undo-self-blog/p/7482270.html

你可能感兴趣的文章
linux中启动与终止lnmp的脚本
查看>>
gdb中信号的处理[转]
查看>>
LeetCode【709. 转换成小写字母】
查看>>
如何在Access2007中使用日期类型查询数据
查看>>
Jzoj4757 树上摩托
查看>>
CF992E Nastya and King-Shamans(线段树二分+思维)
查看>>
第一个Java Web程序
查看>>
树状数组_一维
查看>>
如果没有按照正常的先装iis后装.net的顺序,可以使用此命令重新注册一下:
查看>>
linux install ftp server
查看>>
嵌入式软件设计第8次实验报告
查看>>
算法和数据结构(三)
查看>>
Ubuntu下的eclipse安装subclipse遇到没有javahl的问题...(2天解决了)
查看>>
alter database databasename set single_user with rollback IMMEDIATE 不成功问题
查看>>
Repeater + Resources 列表 [原创][分享]
查看>>
WCF揭秘——使用AJAX+WCF服务进行页面开发
查看>>
【题解】青蛙的约会
查看>>
IO流
查看>>
mybatis调用存储过程,获取返回的游标
查看>>
设计模式之装饰模式(结构型)
查看>>