咋看之下,split看起来是分割字符串的(一般用法),分割后返回一个字符数组。
但这里却用一个对象来接收。split分割指定字符串时,若此字符串中包含特定字符
,如 \。
则可能有转义 *** 作,
所以这里的目的是为转义,输出“。(字符串中 \“的结果是”,而不是本身\”,正则表达式用法)
这里split后的结果是去掉所有斜杠\。
1. 找到正确的登录链接,应该是:self.baseUrl + '/login/email'2. 这个request.Request(self.baseUrl + '/#signin', postdata.encode('utf-8'))没用过不清楚,所以不知道有没有带上前两个请求的cookies。我是改成:
self.opener.open(self.baseUrl + '/login/email', postdata.encode('utf-8'))这样访问的。
通常登录403问题都是:
1. 登录api不对,
2. 前后访问没有带cookies,导致token无效、验证码无效。
附上改后的,只会用requests的我,请勿喷啊~~~:
import cookielib,urllib2
import re,urllib,json
class ZhiHuSpider(object):
def __init__(self):
self.baseUrl = 'http://www.zhihu.com/'
self.captchaUrl = 'http://www.zhihu.com/captcha.gif?r='
self.cookies = cookielib.CookieJar()
self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookies))
# 获取网页xsrf值
def getXsrf(self):
html = None
html = self.opener.open(self.baseUrl).read().decode('utf-8')
xsrf_match = re.search(r'name="_xsrf" value="(.*?)"/>', html)
if xsrf_match:
return xsrf_match.group(1).strip()
# 将验证码保存在本地
def getCaptchaCode(self):
data = self.opener.open(self.captchaUrl).read()
fName = self.captchaUrl.split('/')[3].split('?')[0]
f = open(fName, 'wb')
f.write(data)
f.close()
print(u'验证码已保存在本地!请查看!')
# 模拟登录知乎
def login(self):
form = { '_xsrf': self.getXsrf(),
'email': 'email@faf.com',
'password': 'password' }
self.getCaptchaCode()
code = input(u'请输入验证码:')
form['captcha'] = code
postdata = urllib.urlencode(form)#parse.urlencode(form)
op = self.opener.open(self.baseUrl + '/login/email', postdata.encode('utf-8'))
#req = request.Request(self.baseUrl + '/#signin', postdata.encode('utf-8'))
a = op.read().decode()
a=json.loads(a)
print a,type(a)
print a['msg']
if __name__ == '__main__':
spider = ZhiHuSpider()
spider.login()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)