1. 程式人生 > >使用requests和scrapy模擬知乎登入

使用requests和scrapy模擬知乎登入

獲取登入傳遞的引數

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

使用requests模擬登入

手機端登入時候需要傳遞下面四個引數

data = {
        '_xsrf': _xsrf,
        'password': password,
        'phone_num': phonenumber,
        'captcha'
: captcha }

其中password和phone_num是密碼和使用者名稱,_xsrf和captcha_type是瀏覽器自己帶的hidden值
這裡寫圖片描述

獲取xsrf引數

由於使用者名稱和密碼已經知道,下面就定義兩個方法,分別用來獲取_xsrf和captcha_type引數,從上面的分析可知,只需要獲取網頁內容,然後通過正則表示式解析對應的內容即可獲得

獲取網頁內容

import requests
def get_xsrf():
    response = requests.get('https://www.zhihu.com')
    print(response.text)

這裡寫圖片描述
這是因為沒有配置請求頭,新增請求頭即可

header = {
    'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36',
    'Host': 'www.zhihu.com',
    'Referer': 'https://www.zhihu.com/',
}

def get_xsrf():
    response = requests.get('https://www.zhihu.com'
, headers=header) print(response.text)

此時就可以正常訪問了
這裡寫圖片描述

獲取xsrf引數

text = '<input type="hidden" name="_xsrf" value="f559db84fb92c29de2b277a48a3bdd62"/>'
response = session.get('https://www.zhihu.com', headers=header)
soup = BeautifulSoup(response.text)
crsf = soup.select('input[name="_xsrf"]')[0]['value']
print(crsf)

上面可以正確獲取到xsrf引數,所以只需要將text替換為網頁內容即可

def get_xsrf():
    response = session.get('https://www.zhihu.com', headers=header)
    soup = BeautifulSoup(response.text)
    crsf = soup.select('input[name="_xsrf"]')[0]['value']
    print(soup.select('input[name="_xsrf"]')[0]['value'])
    return crsf

獲取驗證碼

def get_captcha():
    t = str(int(time.time() * 1000))
    captcha_url = 'https://www.zhihu.com/captcha.gif?r=' + t + "&type=login"
    print(captcha_url)
    response = session.get(captcha_url, headers=header)
    with open('captcha.gif', 'wb') as f:
        f.write(response.content)
        f.close()
    from PIL import Image
    try:
        im = Image.open('captcha.gif')
        im.show()
        im.close()
    except:
        pass

    captcha = input('請輸入驗證碼: ')
    return captcha

這裡獲取驗證碼,然後人工識別,手動輸入賦值給captcha

使用requests登入

import requests
from http import cookiejar

session = requests.session()
session.cookies = cookiejar.LWPCookieJar(filename='cookies.txt')
try:
    session.cookies.load(ignore_discard=True)
except:
    print ("cookie未能載入")

def zhihu_login(username, passwd):
    login_url = 'https://www.zhihu.com/login/phone_num'
    login_data = {
        '_xsrf': get_xsrf(),
        'phone_num': username,
        'password': passwd,
        'captcha': get_captcha()
    }
    response = session.post(login_url, data=login_data, headers=header)
    print(response.text)
    session.cookies.save() # 儲存cookie

zhihu_login('手機號','密碼')

此時執行結果如下:
這裡寫圖片描述
這裡寫圖片描述
已經登入成功

判斷是否登入成功

另外,當用戶登入成功以後,可以訪問私信介面
這裡寫圖片描述
如果退出登入,或者沒有登入成功,則會跳轉到登入介面,並且返回302的狀態碼,後面會自動跳轉到https://www.zhihu.com/?next=%2Finbox,返回200狀態碼
這裡寫圖片描述

使用requests登入完整程式碼

# -*- coding: utf-8 -*-

import requests
from http import cookiejar
from bs4 import BeautifulSoup
import time

# 獲取session
session = requests.session()
# 獲取cookies
session.cookies = cookiejar.LWPCookieJar(filename='cookies.txt')
# 獲取cookie,如果之前登入成功,並且已經cookie,則可以獲取到
try:
    session.cookies.load(ignore_discard=True)
except:
    print ("cookie未能載入")

# 設定請求頭
header = {
    'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36',
    'Host': 'www.zhihu.com',
    "Referer": "https://www.zhihu.com/",
}

# 獲取xsrf
def get_xsrf():
    response = session.get('https://www.zhihu.com', headers=header)
    soup = BeautifulSoup(response.text)
    crsf = soup.select('input[name="_xsrf"]')[0]['value']
    print(soup.select('input[name="_xsrf"]')[0]['value'])
    return crsf

# 獲取驗證碼
def get_captcha():
    t = str(int(time.time() * 1000))
    captcha_url = 'https://www.zhihu.com/captcha.gif?r=' + t + "&type=login"
    print(captcha_url)
    response = session.get(captcha_url, headers=header)
    with open('captcha.gif', 'wb') as f:
        f.write(response.content)
        f.close()
    from PIL import Image
    try:
        im = Image.open('captcha.gif')
        im.show()
        im.close()
    except:
        pass

    captcha = input('請輸入驗證碼: ')
    return captcha

# 判斷是否登入成功
def is_login():
    inbox_url = 'https://www.zhihu.com/inbox'
    response = session.get(inbox_url, headers=header, allow_redirects=False)
    if response.status_code == 200:
        print('登入成功')
    else:
        print('登入失敗')

# 登入方法
def zhihu_login(username, passwd):
    login_url = 'https://www.zhihu.com/login/phone_num'
    login_data = {
        '_xsrf': get_xsrf(),
        'phone_num': username,
        'password': passwd,
        'captcha': get_captcha()
    }
    response = session.post(login_url, data=login_data, headers=header)
    print(response.text)
    session.cookies.save() # 儲存cookie



# get_captcha()
# get_xsrf()
# zhihu_login('18710840098','這裡輸入密碼')
is_login()

使用scrapy模擬登入

在正式開始前,先建立工程和spider

 scrapy startproject zhihu
 cd zhihu
 scrapy genspider zhihu www.zhihu.com

完整程式碼如下:

# -*- coding: utf-8 -*-
import scrapy
from bs4 import BeautifulSoup
import json

class ZhihuspiderSpider(scrapy.Spider):
    name = 'zhihuspider'
    allowed_domains = ['www.zhihu.com']
    start_urls = ['https://www.zhihu.com/']
    # 定義請求頭
    header = {
        # 使用手機的User-Agent
        'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36',
        'Host': 'www.zhihu.com',
        "Referer": "https://www.zhihu.com/",
    }

    def parse(self, response):
        print(response.text)
        pass

    # spider入口方法
    def start_requests(self):
        # 訪問https://www.zhihu.com/login/phone_num登入頁面,在do_login回撥中處理
        return [scrapy.Request('https://www.zhihu.com/login/phone_num', headers=self.header, callback=self.do_login)]

    def do_login(self, response):
        response_text = response.text
        soup = BeautifulSoup(response.text)
        # 解析獲取xsrf
        xsrf = soup.select('input[name="_xsrf"]')[0]['value']
        if xsrf:
            login_data = {
                '_xsrf': xsrf,
                'phone_num': '手機號',
                'password': '密碼',
                'captcha': ''
            }
            # 由於登入需要驗證碼,因此需要先獲取驗證碼,在do_login_after_captcha回撥獲取驗證碼,封裝傳遞的login_data引數
            import time
            t = str(int(time.time() * 1000))
            captcha_url = 'https://www.zhihu.com/captcha.gif?r=' + t + "&type=login"
            yield scrapy.Request(captcha_url, headers=self.header, meta={'login_data': login_data},
                                 callback=self.do_login_after_captcha)


    def do_login_after_captcha(self, response):
        # 獲取驗證碼操作
        with open('captcha.gif', 'wb') as f:
            f.write(response.body)
            f.close()
        from PIL import Image
        try:
            im = Image.open('captcha.gif')
            im.show()
            im.close()
        except:
            pass

        captcha = input('請輸入驗證碼: ')

        # 登入
        login_data = response.meta.get("login_data", {})
        login_data['captcha'] = captcha
        login_url = 'https://www.zhihu.com/login/phone_num'
        # FormRequest可以完成表單提交,在check_login回撥中驗證登入是否成功
        return [scrapy.FormRequest(
            url=login_url,
            formdata=login_data,
            headers=self.header,
            callback=self.check_login
        )]

    def check_login(self, response):
        #驗證登入是否成功
        text_json = json.loads(response.text)
        if "msg" in text_json and text_json["msg"] == "登入成功":
            for url in self.start_urls:
                yield scrapy.Request(url, dont_filter=True, headers=self.header)

此時結果response.text中的內容儲存到本地網頁,效果如下:
這裡寫圖片描述

程式碼下載

相關推薦

使用requestsscrapy模擬登入

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

菜鳥寫Python實戰:Scrapy完成登入並儲存cookies檔案用於請求他頁面(by Selenium)

一、前言 現在知乎的登入請求越來越複雜了,通過f12調出瀏覽器網路請求情況分析request引數,似乎不再簡單可知了,因為知乎很多請求引數都字元加密顯示了,如下圖,我們很難再知道發起請求時要傳遞什麼引數給它。 二、思路 我們知道知乎一些內容是需要登入才能看到,因

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

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

scrapy 爬取登入認證部分(採用cookie登入

scrapy 爬蟲,為非同步io框架;因此此處選擇,先用requests請求,儲存cookie檔案,然後scrapy爬取前,在入口處載入cookie。 * 登入,儲存cookie方法見前兩節,此處展示的是scrapy讀取cookie * 首先要明確,

怎麽及時掌握/把握深度學習的發展動向狀態?()

ref com 深度學習 掌握 http 發展 targe 狀態 tar https://www.zhihu.com/question/65646397 機器學習 知乎專欄 https://www.zhihu.com/topic/19559450/hot怎麽及時掌握/把握深

python 模擬登錄,包含驗證碼(轉)

mozilla log 5.0 color att pos head one 成功 #!/usr/bin/env python3 # -*- coding: utf-8 -*- ‘‘‘ Required - requests (必須) - pillow (可選) Info

登入出現Miss argument grant_type 無法成功登入解決方法

 知乎的模擬登入,出現Miss argument grant_type 無法成功登入, 根據網上的說法,需要進行chrome版本降級,要使用用Chrome 60版本,chromedriver2.3( 1. chrome瀏覽器降到60版本,下載地址: https://www.s

scrapy 登陸

參考 https://github.com/zkqiang/Zhihu-Login # -*- coding: utf-8 -*- import scrapy import time import re import base64 import hmac import hashlib import jso

requests scrapy 在不同的爬蟲應用中,各自有什麼優勢?

equests 是一個http框架,可以用來做爬蟲scrapy 是一個專業的爬蟲框架我是個python新手,研究怎麼爬人家網站,朋友推薦我學requests,果然看了下文件,幾分鐘就能開始爬了但是我看scrapy 這個爬蟲框架,被很多人喜歡,我想這個東西一定有他的獨特之處,

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

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

登入以及改版後的登入(小知識點)

1. 關於cookie和session 2. 英文驗證碼登入知乎(零碎知識點...喔喔...自己怕忘隨意整理一下, 有點亂) ---判斷驗證碼是否存在時, 請求的網址相對路徑為圖中:path(captcha?lang=en 請求的是英文的驗證碼) ---圖中的{

Requests Scrapy 新增動態IP代理

Requests import requests # 要訪問的目標頁面 targetUrl = "http://test.abuyun.com/proxy.php" #targetUrl = "ht

scrapy模擬登入cookie登入

模擬登入# -*- coding: utf-8 -*- import scrapy from scrapy import cmdline #from scrapy.spiders import CrawlSpider import scrapy from scrap

selenium 模擬登入微博

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

Python-requests-模擬登入

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

Python3 模擬登入requests

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

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

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

通過scrapy,從模擬登入開始爬取的問答資料

這篇文章將講解如何爬取知乎上面的問答資料。 首先,我們需要知道,想要爬取知乎上面的資料,第一步肯定是登入,所以我們先介紹一下模擬登入: 先說一下我的思路: 1.首先我們需要控制登入的入口,重寫start_requests方法。來控制到這個入口之後,使用

Scrapy基礎(十四)————模擬登陸

odin cookie page 表單 word sca -a 實例 登錄限制 #-*-coding:utf-8 -*-__author__ = "ruoniao"__date__ = "2017/5/31 20:59" 之前我們通過爬取伯樂在線的文章,伯樂在線對爬取沒有

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

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