1. 程式人生 > >requests登入知乎新版

requests登入知乎新版

#coding:utf-8
#__author__='wang'
import time,json,base64

'''
requests登陸知乎流程:
requests登入知乎流程:
1>想到去抓包,檢視使用者名稱,密碼錶單資料的提交地址,也就是POST請求將表單資料提交的地址。
經過檢視是:https://www.zhihu.com/api/v3/oauth/sign_in。
2>通過抓取上述登入地址,在其請求的Content欄位中,發現POST到伺服器的地址不只包含使用者名稱
,密碼,還有timestamp, lang, client_id, signature等表單資料。所以,需要知道每
一個表單資料的特點,而特點我們從資料在每次登入時是否變化來查詢資料的規律。
3>經過多次登入的觀察,這些表單資料中,只有timestamp,signature是變化的,其它的值 都是不變的。 4>通過JS發現signature欄位的值,是由多個欄位組合加密而成,其實timestamp時間戳是核心 ,每次根據時間戳的變化,生成不同的signature值。 5>考慮到signature的加密過程較為複雜,所以直接將瀏覽器登入成功後的時間戳timestamp 和簽名signature複製到請求資料中,然後進行登入。 6>表單資料填充完畢,傳送POST請求時,出現了"缺少驗證碼票據的錯誤(capsion_ticket)", 經過分析,驗證碼票據是為獲取驗證碼而提供的一種驗證方式,而抓包工具中關於驗證碼的請求有 兩次。一次獲取的是:{'show_captcha': true},而同時請求的第二次獲取的是: {'img_base64': 'Rfadausifupoauerfae'}。
7>經過分析,{'show_captcha': true}是獲取驗證碼的關鍵資訊,在抓包資訊中,發現第一次 請求的響應中的Set-Cookie中,包含了capsion_ticket驗證碼票據資訊。 8>再次模擬登入,又出現了"ERR_XX_AUTH_TOKEN"錯誤資訊,而它出現在我們根據驗證碼票據獲 取驗證碼圖片時。我們從抓包資訊中,檢視關於captcha?lang=cn的請求資訊,發現在請求頭中 有這樣一個欄位:Authorization: oauth ce30dasjfldhjfadsfasdfad。所以將其在 headers中進行配置。 ''' import requests try
: import cookielib except Exception,e: import http.cookiejar as cookielib session =requests.Session() session.cookies= cookielib.LWPCookieJar(filename = 'requests_coo.txt') try: session.cookies.load(ignore_discard=True,ignore_expires=True) print 'cookie資訊載入成功' except Exception,e: print "cookie資訊載入失敗" headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0)  Gecko/20100101 Firefox/50.0','HOST':'www.zhihu.com','Referer': 'https://www.zhihu.com/signin?next=%2F','Authorization': 'oauth c3cef7c66a1843f8b3a9e6a1e3160e20'} def zhihu_login(account,password,captcha): #登陸之前先拿驗證碼資料 # is_captcha = parse_captcha() # if is_captcha: # print '你有驗證碼,我不登陸' # # is_captcha =parse_captcha() # else: # print '沒有驗證碼,我登陸' post_url='https://www.zhihu.com/api/v3/oauth/sign_in' post_data={ 'client_id':'c3cef7c66a1843f8b3a9e6a1e3160e20', 'grant_type':'password', 'timestamp':'1515398025518', 'source':'com.zhihu.web', 'signature':'30b129980d00e5efb09f16b0334bf4e8601b060b', 'username':account, 'password':password, 'captcha':captcha, 'lang':'en', 'ref_source':'homepage', 'utm_source':'' } response = session.post(post_url,data=post_data,headers= headers,verify=False) session.cookies.save(ignore_expires=True,ignore_discard=True) #如果直接登入會報一個異常“缺少驗證碼票據”,而驗證碼票據的獲取是通過向 https://www.zhihu.com/api/v3/oauth/captcha?lang=cn地址傳送get請求之後, 伺服器會將驗證碼票據放入set-cookie中進行返回 def parse_captcha(): response = session.get('https://www.zhihu.com/api/v3/oauth/ captcha?lang=en',headers=headers,verify= False) show_captcha=response.json()['show_captcha'] if show_captcha: print '有驗證碼' #有驗證碼,就再一次向https://www.zhihu.com/api/v3/oauth/captcha ?lang=en傳送put請求,用於向伺服器索引當前的驗證碼的圖片地址 response = session.put('https://www.zhihu.com/api/v3/oauth/ captcha?lang=en',headers=headers,verify=False) try: img=json.loads(response.content)['img_base64'] except Exception,e: print '獲取img_base64的值失敗,原因:'%e else: print '成功獲取加密後的圖片地址' #將加密後的圖片進行解密,同時儲存到本地 img = img.encode('utf-8') img_data = base64.b64decode(img) with open('zhihu_captcha.GIF','wb') as f: f.write(img_data) captcha = raw_input('請輸入識別的驗證碼:') #將驗證碼繼續傳送post請求和伺服器端進行對比是否正確 data = {'input_text':captcha} response = session.post('https://www.zhihu.com/api/v3/oauth/ captcha?lang=en',data = data,headers=headers,verify=False) try: yanzheng_result = json.loads(response.content)['success'] except Exception,e: print '關於驗證碼的post請求響應失敗,原因:{}'.format(e) else: if yanzheng_result: zhihu_login('****','*****,captcha) else: print '是錯誤的驗證碼' # return True else: print '沒有驗證碼' zhihu_login('*****','******',captcha='') parse_captcha() #SSLError(SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed(_ssl.c:661))requests庫在訪問http://協議時,由於證書認證失敗, 無法訪問相應的服務這個時候可以通過verify=False設定禁止證書認證的過程。urllib2 在訪問https://的時候也會只有這種異常出現 # zhihu_login('15518325965','[email protected]') def get_index_page(): response = session.get('https://www.zhihu.com',headers=headers, verify = False) with open('index.html','w') as f: f.write(response.content) print '獲取資訊成功' # get_index_page()

相關推薦

requests登入新版

#coding:utf-8 #__author__='wang' import time,json,base64 ''' requests登陸知乎流程: requests登入知乎流程: 1>想到去抓包,檢視使用者名稱,密碼錶單資料的提交地址,也就是POST請求將表單資

python requests登入

這裡用python模擬登入知乎,並確定登入的情況:class ZhiHu(object): headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0)'

Python3 模擬登入requests

# -*- coding: utf-8 -*- """ 知乎登入分為兩種登入 一是手機登入 API : https://www.zhihu.com/login/phone_num 二是郵箱登入 API : https://www.zhihu.c

selenium 模擬登入和微博

sleep https epo element select selenium clas .com -c pip install selenium __author__ = ‘admin‘ __date__ = 2017 / 11 / 3 from selenium im

爬蟲入門到精通-headers的詳細講解(模擬登入

直接開始案例吧。 本次我們實現如何模擬登陸知乎。 1.抓包 首先開啟知乎登入頁 知乎 - 與世界分享你的知識、經驗和見解 注意開啟開發者工具後點擊“preserve log”,密碼記得故意輸入錯誤,然後點選登入   我們很簡單的就找到了 我們需要的請

Scrapy Selenium實戰:Selenium登入儲存cookies後訪問需要登入頁面

Scrapy Selenium實戰:Selenium登入知乎儲存cookies後訪問需要登入頁面 安裝 chromedriver 新建爬蟲 zhihu.py 獲取瀏覽器真實的User-Agent 執行驗證

爬蟲入門系列(三):用 requests 構建 API

爬蟲入門系列目錄: 在爬蟲系列文章 優雅的HTTP庫requests 中介紹了 requests 的使用方式,這一次我們用 requests 構建一個知乎 API,功能包括:私信傳送、文章點贊、使用者關注等,因為任何涉及使用者操作的功能都需要登入後才操作,所以在閱讀這篇文章前建議先了解

selenium模擬登入

Selenium是一個用於Web應用程式測試的工具。Selenium測試直接執行在瀏覽器中,就像真正的使用者在操作一樣。支援的瀏覽器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。這個工具的主

Python 爬蟲-模擬登入-爬取拉勾網職位資訊

用Python寫爬蟲是很方便的,最近看了xlzd.me的文章,他的文章寫的很到位,提供了很好的思路。因為他的文章部分程式碼省略了。下面是基於他的文章的三個程式碼片段: 基於Python3,Python2的話需要修改下input輸入函式和print的用法。 爬取豆瓣電影top250 爬取拉勾網職位資訊 模擬

python爬蟲scrapy框架——人工識別登入倒立文字驗證碼和數字英文驗證碼(2)

import scrapy import re import json class ZhihuSpider(scrapy.Spider): name = 'zhihu' allowed_domains = ['www.zhihu.com'] start_urls = ['http

[Python]網路爬蟲(三):使用cookiejar管理cookie 以及 模擬登入

大家好哈,上一節我們研究了一下爬蟲的異常處理問題,那麼接下來我們一起來看一下Cookie的使用。 為什麼要使用Cookie呢? Cookie,指某些網站為了辨別使用者身份、進行session跟蹤而儲存在使用者本地終端上的資料(通常經過加密) 比如說有些網站需要登入後才

Python爬蟲倒立文字驗證碼登入

引言 本文解析了知乎倒立文字驗證碼的原理,人工識別倒立文字所在位置後組織報文成功登入。 原理 關於登入的基本原理可參考Python爬蟲之模擬知乎登入,只不過這篇文章中登入的驗證碼為“數字英文”模式,而當前登入時是“點選倒立文字”模式,所以主要記錄這部分。

Python 模擬登入

前言 前天看到一個爬取了知乎50多萬評論的帖子, 羨慕的同時也想自己來嘗試一下。看看能不能獲取一些有價值的資訊。 必備知識點 下面簡單的來談談我對常見的防爬蟲的一些技巧的理解。 headers 現在很多伺服器都對爬蟲進行了限制,有一個

python爬蟲scrapy框架——人工識別登入倒立文字驗證碼和數字英文驗證碼

import requests try: import cookielib except: import http.cookiejar as cookielib import re import time def get_xsrf(): # 獲取xsrf code res

python--python3爬蟲之模擬登入

程式碼在python3環境下測試通過: from bs4 import BeautifulSoup import requests url = 'http://www.zhihu.com' login_url = url+'/login/email' captcha_

Python3下模擬登入

程式碼: # -*- coding:UTF-8 -*- import requests , time import hmac ,json from bs4 import BeautifulSoup from hashlib import sha1 def get_

Python-requests-模擬登入

繼續我的python爬蟲旅程,開始寫部落格的時候,說一天一篇,真的只是動動嘴皮子,做起來還真的難,其實是自己給自己找理由… 不管怎樣,今天來更新一篇,寫個知乎的模擬登入,感覺最開始學習爬蟲的時候,大家都期盼著可以寫那種需要登入的網站,或者有各種驗證碼的,那時

新版登入request登入(2)(類程式設計)

接上一篇,用類重構了程式碼,方法是一致的,但是看起來更整潔些。 不多說了,上程式碼: #! /usr/local/bin python3.6 """ @Time : 2018/4/17 20:00 @Author : ysj @Site :

使用requests和scrapy模擬登入

獲取登入傳遞的引數 可以看到,這裡當登入的時候,是傳遞紅色部分標註出來的四個引數的,並且訪問的是https://www.zhihu.com/login/phone_num地址,但是這裡驗證碼需要使用者點選倒立的字,目前我還沒有辦法,但是可以使用手機端登入看

python爬蟲項目(新手教程)之requests方式)

ror eas 點擊 elif 原因 ffffff 文章 重點 F12 -前言 之前一直用scrapy與urllib姿勢爬取數據,最近使用requests感覺還不錯,這次希望通過對知乎數據的爬取為 各位爬蟲愛好者和初學者更好的了解爬蟲制作的準備過程以及requests請求方