知乎 captcha.找gif 知乎是什么时候

HttpClient4.4.1模拟登录知乎 - CSDN博客
HttpClient4.4.1模拟登录知乎
HttpClient4.4.1模拟登录知乎
一,登录要Post的表单数据是什么
这部分可以使用Wireshark工具来抓包就可以了,发现需要以下数据:
“_xsrf” = xxxx(这是一个变动的数据,需要先活取获取知乎首页源码来获得)
“email” = 邮箱
“password” = 密码
“rememberme” = “true”
“captcha” = 验证码(知乎有两种验证码,你们可以去看,我使用的是数字字符的那种验证码)
获取_xsrf数据:
String xsrfValue = responseHtml.split("&input type=\"hidden\" name= \"_xsrf\" value=\"")[1].split("\"/&")[0];
responseHtml是首页的源码,根据网页的组织形式,把_xsrf数据分割出来。
二,我的登录代码
RequestConfig requestConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD_STRICT).build()
CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(requestConfig).build()
HttpGet getHomePage = new HttpGet("/")
//填充登陆请求中基本的参数
CloseableHttpResponse response = httpClient.execute(getHomePage)
String responseHtml = EntityUtils.toString(response.getEntity())
String xsrfValue = responseHtml.split("&input type=\"hidden\" name=\"_xsrf\" value=\"")[1].split("\"/&")[0]
System.out.println("_xsrf:" + xsrfValue)
response.close()
List&NameValuePair& valuePairs = new LinkedList&NameValuePair&()
valuePairs.add(new BasicNameValuePair("_xsrf" , xsrfValue))
valuePairs.add(new BasicNameValuePair("email", 用户名))
valuePairs.add(new BasicNameValuePair("password", 密码))
valuePairs.add(new BasicNameValuePair("rememberme", "true"))
//获取验证码
HttpGet getCaptcha = new HttpGet("/captcha.gif?r=" + System.currentTimeMillis() + "&type=login")
CloseableHttpResponse imageResponse = httpClient.execute(getCaptcha)
FileOutputStream out = new FileOutputStream("/tmp/zhihu.gif")
byte[] bytes = new byte[8192]
while ((len = imageResponse.getEntity().getContent().read(bytes)) != -1) {
out.write(bytes,0,len)
out.close()
Runtime.getRuntime().exec("eog /tmp/zhihu.gif")
//请用户输入验证码
System.out.print("请输入验证码:")
Scanner scanner = new Scanner(System.in)
String captcha = scanner.next()
valuePairs.add(new BasicNameValuePair("captcha", captcha))
//完成登陆请求的构造
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(valuePairs, Consts.UTF_8)
HttpPost post = new HttpPost("/login/email")
post.setEntity(entity)
httpClient.execute(post)
HttpGet g = new HttpGet("/question/following")
CloseableHttpResponse r = httpClient.execute(g)
System.out.println(EntityUtils.toString(r.getEntity()))
} catch (IOException e) {
e.printStackTrace()
} finally {
httpClient.close()
} catch (IOException e) {
e.printStackTrace()
此处要注意开头的RequestConfig,我一开始是没有设置cookie这方面的额内容的,结果一直提示有cookie错误,所以查看了HttpClient手册,上面提到了选择Cookie策略,通过这种方法设置一个全局的Cookie策略,
RequestConfig requestConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD_STRICT).build()
CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(requestConfig).build()
本文已收录于以下专栏:
相关文章推荐
目录模拟登陆的原因
如何模拟登陆
实战demo模拟登陆的原因很多网站,我们是无法直接获得服务器返回的数据,需要输入用户名及密码才能看到数据。如我们登陆人人网时,网站网址http://www.renre...
@Component
Login  extends
BaseJobs {
    SimpleDateFormat
本例使用httpclient 3.0.jar
import mons.httpclient.C
import org.apach...
我最开始玩的是红警,那时候一般只造一个兵营和一个机械厂,然后疯狂点兵,等着1个1个慢慢造出来(我只打电脑)。后来接触星际了,开始非常的不习惯,因为它没有一个固定的界面,可以造各种单位,而是要先选取一个...
不同学校的教务系统设计应该会有不同,这里就只针对我的学校。本文主要讲作为纯小白连返回码302都还不懂的我是怎么一步步整的。
我打算用的是java。
因为模拟登录这块以前都没做过,就简单百度了下,找...
java.io.BufferedR
java.io.FileOutputS
本篇文章主要是讲解如何模拟登陆CSDN,使用的工具是HttpClient+Jsoup
其中HttpClient主要是负责发送请求,而Jsoup主要是解析HTML
第3章 HTTP状态管理
最初的HTTP被设计成以状态、请求/应答为导向的协议,它被制作成是没有特殊条款的,以便在状态会话中能交换逻辑关系请求/应答。HTTP协议越来越受欢迎和被采用,越来越多的系统会...
1.6.终止请求
在一些情况下,由于目标服务器的高负载或客户端有很多同时的请求发出,那么 HTTP 请求会在预期的时间内执行失败。 这时,有必要过早地中止请求,解除在 I/O 执行中的线程锁。 Ht...
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)分享一个利用Python爬虫模拟知乎登录的实例- Python教程-PHP中文网QQ群微信公众号还没有收藏分享一个利用Python爬虫模拟知乎登录的实例在爬虫过程中,有些页面在登录之前是被禁止抓取的,这个时候就需要模拟登陆了,下面这篇文章主要给大家介绍了利用爬虫模拟知乎登录的方法教程,文中介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。前言对于经常写爬虫的大家都知道,有些页面在登录之前是被禁止抓取的,比如知乎的话题页面就要求用户登录才能访问,而 “登录” 离不开 HTTP 中的
技术。登录原理Cookie 的原理非常简单,因为 HTTP 是一种无状态的协议,因此为了在无状态的 HTTP 协议之上维护状态,让服务器知道当前是和哪个客户在打交道,Cookie 技术出现了 ,Cookie 相当于是服务端分配给客户端的一个标识。浏览器第一次发起 HTTP 请求时,没有携带任何 Cookie 信息服务器把 HTTP 响应,同时还有一个 Cookie 信息,一起返回给浏览器浏览器第二次请求就把服务器返回的 Cookie 信息一起发送给服务器服务器收到HTTP请求,发现请求头中有Cookie字段, 便知道之前就和这个用户打过交道了。实战应用用过知乎的都知道,只要提供用户名和密码以及验证码之后即可登录。当然,这只是我们眼中看到的现象。而背后隐藏的技术细节就需要借助浏览器来挖掘了。现在我们就用 ome 来查看当我们填完表单后,究竟发生了什么?(如果已经登录的,先退出)首先进入知乎的登录页面 /#signin ,打开 Chrome 的开发者工具条(按 F12)先尝试输入一个错误的验证码观察浏览器是如何发送请求的。从浏览器的请求可以发现几个关键的信息登录的 URL 地址是 登录需要提供的表单数据有4个:用户名(email)、密码(password)、验证码(captcha)、_xsrf。获取验证码的URL地址是 _xsrf 是什么?如果你对CSRF(跨站请求伪造)攻击非常熟悉的话,那么你一定知道它的作用,xsrf是一串伪随机数,它是用于防止跨站请求伪造的。它一般存在网页的 form 表单标签中,为了证实这一点,可以在页面上搜索 “xsrf”,果然,_xsrf在一个隐藏的 input 标签中摸清了浏览器登录时所需要的数据是如何获取之后,那么现在就可以开始写代码用 Python 模拟浏览器来登录了。登录时所依赖的两个第三方库是 requests 和 BeautifulSoup,先pip install beautifulsoup4==4.5.3
pip install requests==2.13.0http.cookiejar 模块可用于自动处理HTTP Cookie,LWPCookieJar 对象就是对 cookies 的封装,它支持把 cookies 保存到文件以及从文件中加载。而 session 对象 提供了 Cookie 的持久化,连接池功能,可以通过 session 对象发送请求首先从cookies.txt 文件中加载 cookie信息,因为首次运行还没有cookie,所有会出现 LoadError 异常。from http import cookiejar
session = requests.session()
session.cookies = cookiejar.LWPCookieJar(filename='cookies.txt')
session.cookies.load(ignore_discard=True)
except LoadError:
print(&load cookies failed&)获取 xsrf前面已经找到了 xsrf 所在的标签,,利用 BeatifulSoup 的 find 方法可以非常便捷的获取该值def get_xsrf():
response = session.get(&&, headers=headers)
soup = BeautifulSoup(response.content, &html.parser&)
xsrf = soup.find('input', attrs={&name&: &_xsrf&}).get(&value&)
return xsrf获取验证码验证码是通过 /captcha.gif 接口返回的,这里我们把验证码图片下载保存到当前目录,由人工识别,当然你可以用第三方支持库来自动识别,比如 pytesser。def get_captcha():
把验证码图片保存到当前目录,手动识别验证码
t = str(int(time.time() * 1000))
captcha_url = '/captcha.gif?r=' + t + &&type=login&
r = session.get(captcha_url, headers=headers)
with open('captcha.jpg', 'wb') as f:
f.write(r.content)
captcha = input(&验证码:&)
return captcha登录一切参数准备就绪之后,就可以请求登录接口了。def login(email, password):
login_url = '/login/email'
'email': email,
'password': password,
'_xsrf': get_xsrf(),
&captcha&: get_captcha(),
'remember_me': 'true'}
response = session.post(login_url, data=data, headers=headers)
login_code = response.json()
print(login_code['msg'])
for i in session.cookies:
session.cookies.save()请求成功后,session 会自动把 服务端的返回的cookie 信息填充到 session.cookies 对象中,下次请求时,客户端就可以自动携带这些cookie去访问那些需要登录的页面了。auto_login.py 示例代码# encoding: utf-8
# !/usr/bin/env python
作者:liuzhijun
import time
from http import cookiejar
import requests
from bs4 import BeautifulSoup
headers = {
&Host&: &&,
&Referer&: &/&,
'User-Agent': 'Mozilla/5.0 (M Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.;
# 使用登录cookie信息
session = requests.session()
session.cookies = cookiejar.LWPCookieJar(filename='cookies.txt')
print(session.cookies)
session.cookies.load(ignore_discard=True)
print(&还没有cookie信息&)
def get_xsrf():
response = session.get(&&, headers=headers)
soup = BeautifulSoup(response.content, &html.parser&)
xsrf = soup.find('input', attrs={&name&: &_xsrf&}).get(&value&)
return xsrf
def get_captcha():
把验证码图片保存到当前目录,手动识别验证码
t = str(int(time.time() * 1000))
captcha_url = '/captcha.gif?r=' + t + &&type=login&
r = session.get(captcha_url, headers=headers)
with open('captcha.jpg', 'wb') as f:
f.write(r.content)
captcha = input(&验证码:&)
return captcha
def login(email, password):
login_url = '/login/email'
'email': email,
'password': password,
'_xsrf': get_xsrf(),
&captcha&: get_captcha(),
'remember_me': 'true'}
response = session.post(login_url, data=data, headers=headers)
login_code = response.json()
print(login_code['msg'])
for i in session.cookies:
session.cookies.save()
if name == 'main':
email = &xxxx&
password = &xxxxx&
login(email, password)【相关推荐】1.2. 3. 4.
5. 以上就是分享一个利用Python爬虫模拟知乎登录的实例的详细内容,更多请关注php中文网其它相关文章!共3篇685点赞收藏分享:.&猜你喜欢PHP中文网:独家原创,永久免费的在线,php技术学习阵地!
All Rights Reserved | 皖B2-QQ群:关注微信公众号你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
平时逛知乎,上班的时候看到一些好的答案,不过由于答案太长,没来得及看完,所以自己写了个python脚本,把自己想要的答案抓取下来,并且推送到kindle上,下班后用kindle再慢慢看。 平时喜欢的内容也可以整理成电子书抓取下来,等周末闲时看。
添加了模拟登陆知乎的模块,自动获取自己的关注的问题id,然后把这些问题的所有答案抓取下来推送到kindle
# -*-coding=utf-8-*-
__author__ = 'Rocky'
# -*-coding=utf-8-*-
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import smtplib
from email import Encoders, Utils
import urllib2
import time
import sys
from bs4 import BeautifulSoup
from email.Header import Header
reload(sys)
sys.setdefaultencoding('utf-8')
class GetContent():
def __init__(self, id):
# 给出的第一个参数 就是你要下载的问题的id
# 比如 想要下载的问题链接是
# 那么 就输入 python zhihu.py
id_link = &/question/& + id
self.getAnswer(id_link)
def save2file(self, filename, content):
# 保存为电子书文件
filename = filename + &.txt&
f = open(filename, 'a')
f.write(content)
def getAnswer(self, answerID):
url = host + answerID
user_agent = &Mozilla/5.0 ( MSIE 9.0; Windows NT 6.1; Trident/5.0)&
# 构造header 伪装一下
header = {&User-Agent&: user_agent}
req = urllib2.Request(url, headers=header)
resp = urllib2.urlopen(req)
print &Time out. Retry&
time.sleep(30)
# try to switch with proxy ip
resp = urllib2.urlopen(req)
# 这里已经获取了 网页的代码,接下来就是提取你想要的内容。 使用beautifulSoup 来处理,很方便
bs = BeautifulSoup(resp)
print &Beautifulsoup error&
return None
title = bs.title
# 获取的标题
filename_old = title.string.strip()
print filename_old
filename = re.sub('[\/:*?&&&|]', '-', filename_old)
# 用来保存内容的文件名,因为文件名不能有一些特殊符号,所以使用正则表达式过滤掉
self.save2file(filename, title.string)
detail = bs.find(&div&, class_=&zm-editable-content&)
self.save2file(filename, &\n\n\n\n--------------------Detail----------------------\n\n&)
# 获取问题的补充内容
if detail is not None:
for i in detail.strings:
self.save2file(filename, unicode(i))
answer = bs.find_all(&div&, class_=&zm-editable-content clearfix&)
for each_answer in answer:
self.save2file(filename, &\n\n-------------------------answer %s via
-------------------------\n\n& % k)
for a in each_answer.strings:
# 循环获取每一个答案的内容,然后保存到文件中
self.save2file(filename, unicode(a))
index = index + 1
smtp_server = ''
from_mail = ''
password = 'yourpassword'
to_mail = ''
# send_kindle=MailAtt(smtp_server,from_mail,password,to_mail)
# send_kindle.send_txt(filename)
# 调用发送邮件函数,把电子书发送到你的kindle用户的邮箱账号,这样你的kindle就可以收到电子书啦
print filename
class MailAtt():
def __init__(self, smtp_server, from_mail, password, to_mail):
self.server = smtp_server
self.username = from_mail.split(&@&)[0]
self.from_mail = from_mail
self.password = password
self.to_mail = to_mail
# 初始化邮箱设置
def send_txt(self, filename):
# 这里发送附件尤其要注意字符编码,当时调试了挺久的,因为收到的文件总是乱码
self.smtp = smtplib.SMTP()
self.smtp.connect(self.server)
self.smtp.login(self.username, self.password)
self.msg = MIMEMultipart()
self.msg['to'] = self.to_mail
self.msg['from'] = self.from_mail
self.msg['Subject'] = &Convert&
self.filename = filename + &.txt&
self.msg['Date'] = Utils.formatdate(localtime=1)
content = open(self.filename.decode('utf-8'), 'rb').read()
# print content
self.att = MIMEText(content, 'base64', 'utf-8')
self.att['Content-Type'] = 'application/octet-stream'
# self.att[&Content-Disposition&] = &filename=\&%s\&& %(self.filename.encode('gb2312'))
self.att[&Content-Disposition&] = &filename=\&%s\&& % Header(self.filename, 'gb2312')
# print self.att[&Content-Disposition&]
self.msg.attach(self.att)
self.smtp.sendmail(self.msg['from'], self.msg['to'], self.msg.as_string())
self.smtp.quit()
if __name__ == &__main__&:
sub_folder = os.path.join(os.getcwd(), &content&)
# 专门用于存放下载的电子书的目录
if not os.path.exists(sub_folder):
os.mkdir(sub_folder)
os.chdir(sub_folder)
id = sys.argv[1]
# 给出的第一个参数 就是你要下载的问题的id
# 比如 想要下载的问题链接是
# 那么 就输入 python zhihu.py
# id_link=&/question/&+id
obj = GetContent(id)
# obj.getAnswer(id_link)
# 调用获取函数
print &Done&
#######################################
添加了新功能,模拟知乎登陆,自动获取自己关注的答案,制作成电子书并且发送到kindle
# -*-coding=utf-8-*-
__author__ = 'Rocky'
import requests
import cookielib
import json
import time
from getContent import GetContent
agent='Mozilla/5.0 (Windows NT 5.1; rv:33.0) Gecko/ Firefox/33.0'
headers={'Host':'',
'Referer':'',
'User-Agent':agent}
session=requests.session()
session.cookies=cookielib.LWPCookieJar(filename=&cookies&)
session.cookies.load(ignore_discard=True)
print &Cookie can't load&
def isLogin():
url='/settings/profile'
login_code=session.get(url,headers=headers,allow_redirects=False).status_code
print login_code
if login_code == 200:
return True
return False
def get_xsrf():
r=session.get(url,headers=headers,allow_redirects=False)
txt=r.text
result=re.findall(r'&input type=\&hidden\& name=\&_xsrf\& value=\&(\w+)\&/&',txt)[0]
return result
def getCaptcha():
r=(time.time()*1000)
url='/captcha.gif?r='+str(r)+'&type=login'
image=session.get(url,headers=headers)
f=open(&photo.jpg&,'wb')
f.write(image.content)
def Login():
xsrf=get_xsrf()
print xsrf
print len(xsrf)
login_url='/login/email'
'_xsrf':xsrf,
'password':'*',
'remember_me':'true',
'email':'*'
content=session.post(login_url,data=data,headers=headers)
login_code=content.text
print content.status_code
#this line important ! if no status, if will fail and execute the except part
#print content.status
if content.status_code != requests.codes.ok:
print &Need to verification code !&
getCaptcha()
#print &Please input the code of the captcha&
code=raw_input(&Please input the code of the captcha&)
data['captcha']=code
content=session.post(login_url,data=data,headers=headers)
print content.status_code
if content.status_code==requests.codes.ok:
print &Login successful&
session.cookies.save()
#print login_code
session.cookies.save()
print &Error in login&
return False
def focus_question():
url='/question/following'
content=session.get(url,headers=headers)
print content
pile(r'&a class=&question_link& href=&/question/(\d+)& target=&_blank& data-id')
id_list=p.findall(content.text)
pile(r'&input type=\&hidden\& name=\&_xsrf\& value=\&(\w+)\&/&')
result=re.findall(pattern,content.text)[0]
print result
for i in id_list:
focus_id.append(i)
url_next='/node/ProfileFollowedQuestionsV2'
end_page=500
xsrf=re.findall(r'&input type=\&hidden\& name=\&_xsrf\& value=\&(\w+)\&',content.text)[0]
while offset & end_page:
#para='{&offset&:20}'
#print para
print &page: %d& %offset
params={&offset&:offset}
params_json=json.dumps(params)
'method':'next',
'params':params_json,
'_xsrf':xsrf
#注意上面那里 post的data需要一个xsrf的字段,不然会返回403 的错误,这个在抓包的过程中一直都没有看到提交到xsrf,所以自己摸索出来的
offset=offset+page
headers_l={
'Host':'',
'Referer':'/question/following',
'User-Agent':agent,
'Origin':'',
'X-Requested-With':'XMLHttpRequest'
s=session.post(url_next,data=data,headers=headers_l)
#print s.status_code
#print s.text
msgs=json.loads(s.text)
msg=msgs['msg']
for i in msg:
id_sub=re.findall(p,i)
for j in id_sub:
id_list.append(j)
print &Getting Error &
return id_list
def main():
if isLogin():
print &Has login&
print &Need to login&
list_id=focus_question()
for i in list_id:
obj=GetContent(i)
#getCaptcha()
if __name__=='__main__':
sub_folder=os.path.join(os.getcwd(),&content&)
#专门用于存放下载的电子书的目录
if not os.path.exists(sub_folder):
os.mkdir(sub_folder)
os.chdir(sub_folder)
完整代码请猛击这里:
要回复文章请先或
不想默默无闻  2种方式:
    1) 我们在浏览器输入正确的账号和密码、验证码后。登录成功,记住我的登录信息是这个。我们接下来,写代码访问的时候在cookie中提交这个就可以了。过期时间是1个月。这个cookie中包含的信息是加密的,我们可以看到有个时间戳,保存的是登陆成功的时间。导致的问题,知乎后端肯定是会检查这个时间戳的,因此1个月后我们还要去正确登陆一下获取正确的cookie。这是值得我们学习的技巧,防爬策略,如果没有这个时间戳,就可以一直访问了,不用再登录。
    2)类似,只是这次我们使用代码来,获取验证码,然后人工识别,输入正确的验证码,登录。同样1个月后我们还要去重新获取一下正确的cookie值。
# coding=utf-8
import sys
import urllib
import urllib2
import cookielib
import time
reload(sys)
sys.setdefaultencoding('utf-8')
# 创建一个cookie实例
cookie = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
headers = {'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.25 Safari/537.36'
picture = opener.open(
'/captcha.gif?r=%s&type=login' % int(round(time.time() * 1000))).read()
local = open('captcha.gif', 'wb')
local.write(picture)
local.close()
captcha = raw_input('请输入验证码:')
data = {'_xsrf': '你的xsrf,可以在浏览器cookie中找到,不知道干吗用的',
'password': 'xxxx',
'captcha': captcha,
'phone_num': 'xxxxx'
req = urllib2.Request(
'/login/phone_num', urllib.urlencode(data), headers)
res = opener.open(req)
print(res.read().decode('unicode-escape').encode('utf-8'))
for c in cookie:
print('%s--%s' % (c.name, c.expires))
c.expires =
for c in cookie:
print('%s--%s' % (c.name, c.expires))
req = urllib2.Request('/', headers=headers)
res = opener.open(req)
print(res.read())
阅读(...) 评论()

我要回帖

更多关于 视频转gif知乎 的文章

 

随机推荐