python登錄知乎
1. 怎樣用python設計一個爬蟲模擬登陸知乎
知乎現在登錄貌似每次都會有密碼了,修改如下:
import requests
from xtls.util import BeautifulSoup
INDEX_URL = 'xxx
LOGIN_URL = 'xxx'
CAPTCHA_URL = 'xxx'
def gen_time_stamp():
return str(int(time.time())) + '%03d' % random.randint(0, 999)
def login(username, password, oncaptcha):
session = requests.session()
_xsrf = BeautifulSoup(session.get(INDEX_URL).content).find('input', attrs={'name': '_xsrf'})['value']
data = {
'_xsrf': _xsrf,
'email': username,
'password': password,
'remember_me': 'true',
'captcha': oncaptcha(session.get(CAPTCHA_URL + gen_time_stamp()).content)
}
resp = session.post(LOGIN_URL, data)
if 2 != resp.status_code / 100 or u"登陸成功" not in resp.content:
raise Exception('captcha error.')
return session
其中,oncaptcha為一個回調函數(需要自己實現的),接受的參數為驗證碼的二進制內容,返回的為驗證碼內容。
P.S.你可以自己做識別驗證碼,或者手動輸入,其中最簡單的oncaptcha為:
def oncaptcha(data):
with open('captcha file save path', 'wb') as fp:
fp.write(data)
return raw_input('captcha : ')
2. 怎樣用Python設計一個爬蟲模擬登陸知乎
給你一個例子,可以看看:
import requests
import time
import json
import os
import re
import sys
import subprocess
from bs4 import BeautifulSoup as BS
class ZhiHuClient(object):
"""連接知乎的工具類,維護一個Session
2015.11.11
用法:
client = ZhiHuClient()
# 第一次使用時需要調用此方法登錄一次,生成cookie文件
# 以後可以跳過這一步
client.login("username", "password")
# 用這個session進行其他網路操作,詳見requests庫
session = client.getSession()
"""
# 網址參數是賬號類型
TYPE_PHONE_NUM = "phone_num"
TYPE_EMAIL = "email"
loginURL = r"http://www.hu.com/login/{0}"
homeURL = r"http://www.hu.com"
captchaURL = r"http://www.hu.com/captcha.gif"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate",
"Host": "www.hu.com",
"Upgrade-Insecure-Requests": "1",
}
captchaFile = os.path.join(sys.path[0], "captcha.gif")
cookieFile = os.path.join(sys.path[0], "cookie")
def __init__(self):
os.chdir(sys.path[0]) # 設置腳本所在目錄為當前工作目錄
self.__session = requests.Session()
self.__session.headers = self.headers # 用self調用類變數是防止將來類改名
# 若已經有 cookie 則直接登錄
self.__cookie = self.__loadCookie()
if self.__cookie:
print("檢測到cookie文件,直接使用cookie登錄")
self.__session.cookies.update(self.__cookie)
soup = BS(self.open(r"http://www.hu.com/").text, "html.parser")
print("已登陸賬號: %s" % soup.find("span", class_="name").getText())
else:
print("沒有找到cookie文件,請調用login方法登錄一次!")
# 登錄
def login(self, username, password):
"""
驗證碼錯誤返回:
{'errcode': 1991829, 'r': 1, 'data': {'captcha': '請提交正確的驗證碼 :('}, 'msg': '請提交正確的驗證碼 :('}
登錄成功返回:
{'r': 0, 'msg': '登陸成功'}
"""
self.__username = username
self.__password = password
self.__loginURL = self.loginURL.format(self.__getUsernameType())
# 隨便開個網頁,獲取登陸所需的_xsrf
html = self.open(self.homeURL).text
soup = BS(html, "html.parser")
_xsrf = soup.find("input", {"name": "_xsrf"})["value"]
# 下載驗證碼圖片
while True:
captcha = self.open(self.captchaURL).content
with open(self.captchaFile, "wb") as output:
output.write(captcha)
# 人眼識別
print("=" * 50)
print("已打開驗證碼圖片,請識別!")
subprocess.call(self.captchaFile, shell=True)
captcha = input("請輸入驗證碼:")
os.remove(self.captchaFile)
# 發送POST請求
data = {
"_xsrf": _xsrf,
"password": self.__password,
"remember_me": "true",
self.__getUsernameType(): self.__username,
"captcha": captcha
}
res = self.__session.post(self.__loginURL, data=data)
print("=" * 50)
# print(res.text) # 輸出腳本信息,調試用
if res.json()["r"] == 0:
print("登錄成功")
self.__saveCookie()
break
else:
print("登錄失敗")
print("錯誤信息 --->", res.json()["msg"])
def __getUsernameType(self):
"""判斷用戶名類型
經測試,網頁的判斷規則是純數字為phone_num,其他為email
"""
if self.__username.isdigit():
return self.TYPE_PHONE_NUM
return self.TYPE_EMAIL
def __saveCookie(self):
"""cookies 序列化到文件
即把dict對象轉化成字元串保存
"""
with open(self.cookieFile, "w") as output:
cookies = self.__session.cookies.get_dict()
json.mp(cookies, output)
print("=" * 50)
print("已在同目錄下生成cookie文件:", self.cookieFile)
def __loadCookie(self):
"""讀取cookie文件,返回反序列化後的dict對象,沒有則返回None"""
if os.path.exists(self.cookieFile):
print("=" * 50)
with open(self.cookieFile, "r") as f:
cookie = json.load(f)
return cookie
return None
def open(self, url, delay=0, timeout=10):
"""打開網頁,返回Response對象"""
if delay:
time.sleep(delay)
return self.__session.get(url, timeout=timeout)
def getSession(self):
return self.__session
if __name__ == '__main__':
client = ZhiHuClient()
# 第一次使用時需要調用此方法登錄一次,生成cookie文件
# 以後可以跳過這一步
# client.login("username", "password")
# 用這個session進行其他網路操作,詳見requests庫
session = client.getSession()
3. 怎樣用Python設計一個爬蟲模擬登陸知乎
兩種方法:
1.帶cookielib和urllib2
import urllib2
import urllib
import cookielib
def login():
email = raw_input("請輸入用戶名:")
pwd = raw_input("請輸入密碼:") data={"email":email,"password":pwd}
post_data=urllib.urlencode(data) cj=cookielib.CookieJar()
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))headers
={"User-agent":"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1"}website =
raw_input('請輸入網址:')req=urllib2.Request(website,post_data,headers)content=opener.open(req)print
content.read()
2.使用selenium
import selenium import webdriver
browser=webdriver.Firefox()
browser.get("Url")
browser.find_element_by_id(" ").sendkey("username")
browser.find_element_by_id(" ").sendkey("pass")
browser.find_element_by_id(" ").click()
其實我這個最簡單了,用的python3,requests, 只需要驗證一次,就會保存cookies,下次登錄使用cookies登錄。
第一步、打開首頁獲取_xref值,驗證圖片 第二步、輸入賬號密碼 第三步、看是否需要驗證、要則下載驗證碼圖片,手動輸入
第四步、判斷是否登錄成功、登錄成功後獲取頁面值。
4. 如何利用python登錄知乎頁面
import requests
from bs4 import BeautifulSoup
s = requests.Session()
r = s.post('http://www.hu.com/login',
data={'_xsrf': BeautifulSoup(s.get('http://www.hu.com/').content).find(type='hidden')['value'],
'email': 'email', 'password': 'password', 'rememberme': 'y'})
print(r.text)
請善用第三方庫。
5. 怎樣用Python設計一個爬蟲模擬登陸知乎
import requestsimport timeimport jsonimport osimport reimport sysimport subprocessfrom bs4 import BeautifulSoup as BS class ZhiHuClient(object): """連接知乎的工具類,維護一個Session 2015.11.11 用法: client = ZhiHuClient() # 第一次使用時需要調用此方法登錄一次,生成cookie文件 # 以後可以跳過這一步 client.login("username", "password") # 用這個session進行其他網路操作,詳見requests庫 session = client.getSession() """ # 網址參數是賬號類型 TYPE_PHONE_NUM = "phone_num" TYPE_EMAIL = "email" loginURL = r"http://www.hu.com/login/{0}" homeURL = r"http://www.hu.com" captchaURL = r"http://www.hu.com/captcha.gif" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Encoding": "gzip, deflate", "Host": "www.hu.com", "Upgrade-Insecure-Requests": "1", } captchaFile = os.path.join(sys.path[0], "captcha.gif") cookieFile = os.path.join(sys.path[0], "cookie") def __init__(self): os.chdir(sys.path[0]) # 設置腳本所在目錄為當前工作目錄 self.__session = requests.Session() self.__session.headers = self.headers # 用self調用類變數是防止將來類改名 # 若已經有 cookie 則直接登錄 self.__cookie = self.__loadCookie() if self.__cookie: print("檢測到cookie文件,直接使用cookie登錄") self.__session.cookies.update(self.__cookie) soup = BS(self.open(r"http://www.hu.com/").text, "html.parser") print("已登陸賬號: %s" % soup.find("span", class_="name").getText()) else: print("沒有找到cookie文件,請調用login方法登錄一次!") # 登錄 def login(self, username, password): """ 驗證碼錯誤返回: {'errcode': 1991829, 'r': 1, 'data': {'captcha': '請提交正確的驗證碼 :('}, 'msg': '請提交正確的驗證碼 :('} 登錄成功返回: {'r': 0, 'msg': '登陸成功'} """ self.__username = username self.__password = password self.__loginURL = self.loginURL.format(self.__getUsernameType()) # 隨便開個網頁,獲取登陸所需的_xsrf html = self.open(self.homeURL).text soup = BS(html, "html.parser") _xsrf = soup.find("input", {"name": "_xsrf"})["value"] # 下載驗證碼圖片 while True: captcha = self.open(self.captchaURL).content with open(self.captchaFile, "wb") as output: output.write(captcha) # 人眼識別 print("=" * 50) print("已打開驗證碼圖片,請識別!") subprocess.call(self.captchaFile, shell=True) captcha = input("請輸入驗證碼:") os.remove(self.captchaFile) # 發送POST請求 data = { "_xsrf": _xsrf, "password": self.__password, "remember_me": "true", self.__getUsernameType(): self.__username, "captcha": captcha } res = self.__session.post(self.__loginURL, data=data) print("=" * 50) # print(res.text) # 輸出腳本信息,調試用 if res.json()["r"] == 0: print("登錄成功") self.__saveCookie() break else: print("登錄失敗") print("錯誤信息 --->", res.json()["msg"]) def __getUsernameType(self): """判斷用戶名類型 經測試,網頁的判斷規則是純數字為phone_num,其他為email """ if self.__username.isdigit(): return self.TYPE_PHONE_NUM return self.TYPE_EMAIL def __saveCookie(self): """cookies 序列化到文件 即把dict對象轉化成字元串保存 """ with open(self.cookieFile, "w") as output: cookies = self.__session.cookies.get_dict() json.mp(cookies, output) print("=" * 50) print("已在同目錄下生成cookie文件:", self.cookieFile) def __loadCookie(self): """讀取cookie文件,返回反序列化後的dict對象,沒有則返回None""" if os.path.exists(self.cookieFile): print("=" * 50) with open(self.cookieFile, "r") as f: cookie = json.load(f) return cookie return None def open(self, url, delay=0, timeout=10): """打開網頁,返回Response對象""" if delay: time.sleep(delay) return self.__session.get(url, timeout=timeout) def getSession(self): return self.__session if __name__ == '__main__': client = ZhiHuClient() # 第一次使用時需要調用此方法登錄一次,生成cookie文件 # 以後可以跳過這一步 # client.login("username", "password") # 用這個session進行其他網路操作,詳見requests庫 session = client.getSession()
6. 怎樣用Python設計一個爬蟲模擬登陸知乎
登錄很簡單,其實上面很多答案的很多內容都是可以去掉的。簡化到最後奉上以下代碼。(是手機號碼登錄的,想要郵箱的話改一下url和參數就可以了)
#encoding=utf8import cookielibimport urllib2import urlliburl_start = r'https://www.hu.com/topic/19556498/questions?page='cj = cookielib.CookieJar()opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))opener.addheaders = [('User-agent','Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 Iceweasel/38.3.0')]def login():
username = ''
password = ''
cap_url = 'hcom/captcha.gif?r=1466595391805&type=login'
cap_content = urllib2.urlopen(cap_url).read()
cap_file = open('/root/Desktop/cap.gif','wb')
cap_file.write(cap_content)
cap_file.close()
captcha = raw_input('capture:')
url = 'u.com/login/phone_num'
data = urllib.urlencode({"phone_num":username,"password":password,"captcha":captcha})
print urllib2.urlopen(url,data).read()
if __name__=="__main__":
login()
7. python爬蟲登錄知乎後怎樣爬取數據
模擬登錄
很多網站,比如知乎、微博、豆瓣,都需要登錄之後,才能瀏覽某些內容。所以想要爬取這類網站,必須先模擬登錄。比較簡單的方式是利用這個網站的 cookie。cookie 相當於是一個密碼箱,裡面儲存了用戶在該網站的基本信息。在一次登錄之後,網站會記住你的信息,把它放到cookie里,方便下次自動登錄。所以,要爬取這類網站的策略是:先進行一次手動登錄,獲取cookie,然後再次登錄時,調用上一次登錄得到的cookie,實現自動登錄。
動態爬取
在爬取知乎某個問題的時候,需要將滑動滑鼠滾輪到底部,以顯示新的回答。靜態的爬取方法無法做到這一點,可以引入selenium庫來解決這一問題。selenium庫模擬人瀏覽網站、進行操作,簡單易懂。