zoukankan      html  css  js  c++  java
  • python模拟登陆豆瓣——简单方法

    学爬虫有一段时间了,前面没有总结又重装了系统,导致之前的代码和思考都没了。。所以还是要及时整理总结备份。下面记录我模拟登陆豆瓣的方法,方法一登上了豆瓣,方法二重定向到了豆瓣中“我的喜欢”列表,获取了第一页上我喜欢的帖子标题。

    方法一:使用requests库和cookies登陆

    1. 先正常登录一下豆瓣,然后使用火狐浏览器的httpfox插件获得post选项中的cookies,将cookies的内容分复制下来,保存为一个.txt文件
    2. 然后将txt中的内容用以下代码处理成字典,以便之后使用
      复制代码
       1 import re
       2 pattern = re.compile('(.*?)/.*?') #只需要提取cookies的前两项cookie sent,value就行了
       3 fr = open('dealwithcookies.txt','r') #dealwithcookies是把网站上的cookies复制粘贴进去的文件
       4 l = []
       5 for item in fr.readlines():
       6     item = str(item)
       7     item = pattern.search(item).group(1) 
       8 #第七行使用item = re.search(pattern).group(1)会报错‘TypeError: expected string or buffer’,使用item = pattern.search(item).group(1) 就不会有这个错误
       9     l.append(item)
      10 fr.close()
      11 cookies = {}
      12 for i in l:
      13     key, value = i.split('	',1) #每行有多个‘	’,只分开第一个
      14     cookies[key] = value
      复制代码
    3. 用以下代码模拟登陆豆瓣:
      import requests
      s=requests.get(testurl, cookies=cookies)
    4. 此时就能登陆了!

    问题:cookies必须手动获取吗?还在找解决方法

    方法二:使用requests.post直接带上用户名/密码/headers等信息登陆豆瓣,因为豆瓣有时需要填写验证码,因此我先登陆一遍,使用豆瓣转到的带有验证码的网址将验证码下载到本地,手动输入验证码后,将需要post的data加上验证码信息再post。

    代码:

    复制代码
    # -*- encoding:utf-8 -*-
    import requests
    import urllib2
    import re
    import urllib
    from bs4 import BeautifulSoup
    loginUrl = 'https://www.douban.com/accounts/login'
    formdata = {'form_email':'144XXXXX530@qq.com',
                'form_password':'XXXXX',
                'redir':'https://www.douban.com/people/67249180/likes/'}
    headers = {"User-Agent":'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0'}
    r = requests.post(loginUrl,data=formdata,headers=headers)
    page = r.text
    print r.url  #此时page是需要填写验证码再进行登陆的界面
    soup = BeautifulSoup(page,'html.parser')
    captchaAddr = soup.find('img',id='captcha_image')['src']
    #利用正则表达式获取captcha的ID
    reCaptchaID = r'<input type="hidden" name="captcha-id" value="(.*?)"/'
    captchaID = re.findall(reCaptchaID,page)
    #print captchaID
    #保存到本地
    urllib.urlretrieve(captchaAddr,"captcha.jpg")
    captcha = raw_input('please input the captcha:')
    
    formdata['captcha-solution'] = captcha
    formdata['captcha-id'] = captchaID
    r = requests.post(loginUrl,data = formdata,headers = headers) #获取验证码以后再提交一遍
    print r.url
    page = r.text
    
    if r.url == 'https://www.douban.com/people/67249180/likes/':
        soup = BeautifulSoup(page,'html.parser')
        result = soup.findAll('div',class_='title')
        #print result
        for item in result:
            print item.find('a').get_text()
    复制代码

    其中字典的键值都是通过网页源代码获得的。

    使用BeautifulSoup匹配关键词,也可以使用正则表达式,看你觉得哪一种的逻辑好理解了。

  • 相关阅读:
    windowsCE常用编译参数 及编译器列表
    摘抄System Architecture for Native Device Drivers
    django+vue学习系列
    FreeTextBox的ToolbarButton整理
    FreeTextBox实现机制
    Server的Transfer和Response的Redirect
    FTB2.0和CuteEditor的一些问题
    ASP.NET跨应用程序进行登录的解决
    testFTB2.0
    Rainbow分页解决方案
  • 原文地址:https://www.cnblogs.com/mengqi-S/p/6730822.html
Copyright © 2011-2022 走看看