zoukankan      html  css  js  c++  java
  • Python爬虫个人记录(四)利用Python在豆瓣上写一篇日记

    涉及关键词: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&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 = cookies
    47                     )
    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 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 1.5

    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()
    vesion 2.0


  • 相关阅读:
    使用部分函数时并未include其所在头文件,但是能编译成功且能运行,为什么?
    ubuntu开发机所需工具,做个记录,不断补充
    c cpp编程用到的系统边角与其拾遗
    几个递进的make file
    可以用命令行控制eclipse断点增加删除、远程调试创建与启动的插件
    Mac 从睡眠恢复后没有声音的问题
    [netty4][netty-handler]netty之idle handler处理
    《将博客搬至CSDN》
    python2与python3中__metacalss__的不同用法
    python3 type和object的关系
  • 原文地址:https://www.cnblogs.com/Undo-self-blog/p/7482270.html
Copyright © 2011-2022 走看看