首先,我们来获取数据找点感觉。python3中urllib和urllib2合并为了urllib一个库,当然若要考虑兼容,也可以这么写:
try:
from
urllib2 import request
except:
from urllib import
request
resp =
request.urlopen(r'http://www.google.com.hk/')
print(resp)
当然这段代码通常得不到想要的结果,原因嘛,哈哈。我就是无聊来这么一发而已。
然后我们也不打算用这个库,毕竟技术需要为项目服务。好了,直接开始。
知乎采用HTTPS协议,但目前似乎并不完全是,那我们就边用边抓好了。
(1)正常登陆,使用fiddler查看浏览器生成的网页数据请求信息:
Fiddler抓取到的登陆数据
可以看到登陆网址为https://www.zhihu.com/login/phone_num,若使用邮箱登陆则后缀为login/email,登陆请求为post方法,这里的header信息需要以dict传递。然后我们再看webform提交的信息如下:
webform表单
这里需要得到两个数据,分别是captcha和_xsrf,也就是验证码和反盗链。其中验证码地址,使用chrome工具查看登陆页面如下:
captcha地址
所以,我们只需如此这般~
t = str(int(time.time()*1000))
captcha_url = 'http://www.zhihu.com/captcha.gif?r=' + t +
"&type=login"
r = requests.session.get(captcha_url,
headers=headers)
得到验证码返回的response,可以使用pillow等库进行图像识别,当然对于复杂的验证码可能还需要训练识别模型,在这里同上,我们只求最快,将验证码写入文件手动输入:
with open('captcha.jpg', 'wb') as f:
f.write(r.content)
f.close()
captcha = input("please
input the captcha:")
有一个小技巧是每次输入之前,调用os模块将图片打开,程序员应该懒一点……
接下来处理反盗链,这里直接get知乎首页,进行解析如下:
response = requests.session.get('http://www.zhihu.com',
headers=headers, verify=False).text
soup =
BeautifulSoup(response,
"html.parser")
xsrf = soup.find('input', {'name': '_xsrf'})['value']
通常抓取到页面信息,需要写下来或者打印出来,以便分析该如何进行提取。同样的,
with
open(“soup”,"wb")
as f:
f.write(soup.encode())
f.close()
至此,我们拥有信息:
headers = { 'Connection':
'keep-alive','Accept-Encoding':
'gzip, deflate,
br','Accept-Language':
'Accept-Language:
zh-CN,zh;q=0.8','User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/53.0.2785.101
Safari/537.36','X-Requested-With':
'XMLHttpRequest','Host':
'www.zhihu.com','Referer':
'https://www.zhihu.com/',}
login_data = {
'remember_me':
'true'
'password':''
'phone_num':''
'_xsrf':xsrf
'captcha':captcha
}
responsed =
request.session.post("https://www.zhihu.com/login/phone_num",headers=headers,
data=login_data),
到这里,可以打印responsed的json数据,查看登陆结果:
if 0 ==
responed.json()['r']:
print("login successfully!") # print(responed.text)
else:
print("login failed!")
登陆成功返回json数据
至此,我们伪装登陆成功。饿死自己是不道德的,我去吃饭,周末决定出去浪,回头再继续更新维持登陆和获取信息。
另,不小心居然又长了一岁,最初写爬虫的目的也有了变化,所以接下来会调整策略,进行完整爬取而不是特定寻找某人,并且用得到的数据进行推荐演化,当然那是以后的事情了。
再吐槽一句,新浪博客添加源代码这么费劲,还是我打开的方式不对呢?