知乎圖片爬蟲


好久沒寫csdn博客了,覺得不應該把這個博客荒廢了,那就繼續寫吧。
這回寫寫知乎爬蟲,主要是寫模擬登錄知乎,以及爬知乎圖片。

本篇文章分為兩個部分:
1. 模擬登錄知乎
2. 爬取知乎某個問題下的所有回答里面的照片。

1. 模擬登錄知乎

首先我們打開知乎

我們采用chrome瀏覽器自帶的開發者工具進行抓包。
按F12打開開發者工具,選擇Network,然后篩選XHR,如圖所示

接着填入賬號密碼,進行點擊登錄記住點了登錄之后,要及時按暫停,不然就跳轉到登陸后的頁面了!抓到的數據如下圖

可以看到知乎模擬登錄的過程是向https://www.zhihu.com/login/phone_num 這個網址post提交

_xsrf:154ccc9a95fa9f8c7612608e2fd07aa5
password:密碼
captcha_type:cn
remember_me:true
phone_num:賬號

其中_xsrf是一個動態的參數,我們打開任意一個知乎的頁面,比如http://www.zhihu.com,然后查看源代碼,都可以找到_xsrf這個參數

同時,我們觀察一下post提交的網址:https://www.zhihu.com/login/phone_num ,結尾是 phone_num
這里說明一下,因為我這里使用手機號登錄的,所以提交網址時這個。
如果使用郵箱登錄的,post提交的網址就是https://www.zhihu.com/login/email
且提交的數據中phone_num就成為email了。

有時候登錄知乎會遇到驗證碼,驗證碼是個很討厭的東西,如果是簡單的4字驗證碼還好,如果是這種

對不起,我講不下去了!尼瑪知乎的驗證碼升級了!!!
所以我直接發之前的代碼吧,說不定還能用。。。
—5分鍾后更新—
^_^腳本還能用!模擬登錄的時候驗證碼沒有那么變態~~不過既然代碼發出來了,我就不繼續講了。有空再填坑

#-*- coding=utf-8 -*- 
"""
知乎圖片下載器
"""

import requests
import re
import json
import time
from PIL import Image
import cStringIO
import cookielib
import urllib
import os

api_url='https://www.zhihu.com/node/QuestionAnswerListV2'
login_url='https://www.zhihu.com/login/'
topic_url='https://www.zhihu.com/question/'


headers={
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'
}

session=requests.Session()
session.headers=headers
session.cookies = cookielib.LWPCookieJar(filename='cookies')
try:
session.cookies.load(ignore_discard=True)
except:
print u"未登陸過,需先登錄"


def get_xsrf(url="http://www.zhihu.com"):
'''''_xsrf 是一個動態變化的參數'''
global session
index_url = url
index_page = session.get(index_url)
html = index_page.content
pattern = r'name="_xsrf" value="(.*?)"'
_xsrf = re.findall(pattern, html)
return _xsrf[0]


def ImageScale(url,session=None):
if session==None:
session=requests.Session()
file = cStringIO.StringIO(session.get(url).content)
img = Image.open(file)
img.show()


def get_captcha():
global session
t=str(int(time.time()*1000))
captcha_url='https://www.zhihu.com/captcha.gif?r=%s&type=login'%t
print captcha_url
ImageScale(captcha_url,session)
print u'請輸入驗證碼:'
yzm=raw_input()
return yzm

def isLogin():
global session
url = "https://www.zhihu.com/settings/profile"
login_code = session.get(url, allow_redirects=False).status_code
if int(x=login_code) == 200:
return True
else:
return False

def login(email,passwd):
global session
isemail=re.search('@',email)
if isemail:
loginurl=login_url+'email'
data={'_xsrf':get_xsrf()
,'password':passwd
,'remember_me':'true'
,'email':email}
else:
loginurl=login_url+'phone_num'
data={'_xsrf':get_xsrf()
,'password':passwd
,'remember_me':'true'
,'phone_num':email}
try:
login_page=session.post(loginurl,data=data)
login_code=login_page.content
print login_page.status
print login_code
except:
data['captcha']=get_captcha()
login_page=session.post(loginurl,data=data)
login_code=json.loads(login_page.content)
print login_code['msg']
session.cookies.save()


def get_pic_from_topic(id,offset):
global session
topicurl=topic_url+str(id)
_xsrf=get_xsrf(topicurl)
pic_re=re.compile('data-actualsrc="(.*?)"')
inner_data={"url_token":id
,"pagesize":10
,"offset":offset
}
data={'method':'next'
,'params':json.dumps(inner_data)
}
session.headers['Referer']=topicurl
session.headers['Host']='www.zhihu.com'
session.headers['Origin']='https://www.zhihu.com'
session.headers['X-Xsrftoken']=_xsrf
js_data=session.post(api_url,data=data)
dat=json.loads(js_data.content)['msg']
pictures=[]
for d in dat:
pics=pic_re.findall(d)
pictures.extend(pics)
return pictures

def downloader(url,path):
try:
filename=url.split('/')[-1]
save=os.path.join(path,filename)
print u'開始下載 ',filename
urllib.urlretrieve(url,filename=save)
except Exception,e:
print u'下載出錯,錯誤信息為:'
print e


if __name__=='__main__':
email='知乎賬號'
passwd='知乎密碼'
is_login=isLogin()
if not is_login:
login(email,passwd)
offset=0
pictures=[]
print u"""####################\n# 知乎圖片下載器 #\n####################
"""

print u"請輸入知乎問題id,比如https://www.zhihu.com/question/52049909,id就是52049909"
id=input()
print u'=====開始解析======'
while 1:
print u"+++++正在解析第%d頁+++++"%(offset/10+1)
pics=get_pic_from_topic(id,offset)
if len(pics)==0:
print u"解析完畢,共找到%d張圖片"%len(pictures)
break
pictures.extend(pics)
offset+=10
print u"=====開始下載圖片====="
basepath=os.path.abspath('.')
savepath=os.path.join(basepath,str(id))
if not os.path.exists(savepath):
os.mkdir(savepath)
for pic in pictures:
downloader(pic,savepath)
print u"=====下載完畢====="

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: