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匹配关键词,也可以使用正则表达式,看你觉得哪一种的逻辑好理解了。

原文地址:https://www.cnblogs.com/mengqi-S/p/6730822.html