python模擬登錄豆瓣——簡單方法

學爬蟲有一段時間了,前面沒有總結又重裝了系統,致使以前的代碼和思考都沒了。。因此仍是要及時整理總結備份。下面記錄我模擬登錄豆瓣的方法,方法一登上了豆瓣,方法二重定向到了豆瓣中「個人喜歡」列表,獲取了第一頁上我喜歡的帖子標題。html

方法一:使用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('\t',1) #每行有多個‘\t’,只分開第一個
    14     cookies[key] = value
    複製代碼

     

  3. 用如下代碼模擬登錄豆瓣:
    import requests
    s=requests.get(testurl, cookies=cookies)

     

  4. 此時就能登錄了!

問題:cookies必須手動獲取嗎?還在找解決方法瀏覽器

方法二:使用requests.post直接帶上用戶名/密碼/headers等信息登錄豆瓣,由於豆瓣有時須要填寫驗證碼,所以我先登錄一遍,使用豆瓣轉到的帶有驗證碼的網址將驗證碼下載到本地,手動輸入驗證碼後,將須要post的data加上驗證碼信息再post。cookie

代碼:app

複製代碼
# -*- 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()
複製代碼

其中字典的鍵值都是經過網頁源代碼得到的。post

使用BeautifulSoup匹配關鍵詞,也可使用正則表達式,看你以爲哪種的邏輯好理解了。網站

相關文章
相關標籤/搜索