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库模拟人浏览网站、进行操作,简单易懂。