需求:模擬登陸知乎,由於知乎首頁須要登陸才能夠查看,因此想爬知乎上的內容首先須要登陸,那麼問題來了,怎麼用python進行模擬登陸以及會遇到哪些問題?html
前期準備:python
環境:ubuntu,python2.7web
須要的包:requests包、正則表達式包正則表達式
安裝requests:pip install requests,關於requests的介紹能夠看官方介紹:http://cn.python-requests.org/zh_CN/latest/user/quickstart.html , 以及 http://cuiqingcai.com/2556.html 講的也很好,簡單明瞭ubuntu
requests包實際上是代替了urllib2,而且提供了大量簡潔好用的方法調用。session
注意:經過Chrome Devtool能夠看到知乎登陸的URL是:https//www.zhihu.com/login/email,使用郵箱進行登陸。app
登陸的方式爲POST,須要的參數有四個分別是:_xsrf、password、remember_me和email,除了第一個都很好理解,那麼第一個參數是什麼?python2.7
XSRF爲跨站請求僞造(Cross-site request forgery),經過蒐集資料,在大神的博客裏找到有相應資料,http://cuiqingcai.com/2076.html ,說的也很清楚,有興趣能夠查看。這個參數目的就是爲了防範XSRF攻擊而設置的一個hash值,每次訪問主頁都會生成這樣一個惟一的字符串。那麼怎麼獲取這個參數的值,通過對知乎首頁(https://www.zhihu.com)的代碼查看能夠看到有一個隱藏的標籤:post
那麼就好解決了,直接在爬下來的網頁內容中用正則表達式去匹配就OK了。ui
代碼:
import requests import re def getContent(url):
#使用requests.get獲取知乎首頁的內容 r = requests.get(url)
#request.get().content是爬到的網頁的所有內容 return r.content
#獲取_xsrf標籤的值 def getXSRF(url):
#獲取知乎首頁的內容 content = getContent(url)
#正則表達式的匹配模式 pattern = re.compile('.*?<input type="hidden" name="_xsrf" value="(.*?)"/>.*?')
#re.findall查找全部匹配的字符串 match = re.findall(pattern, content) xsrf = match[0]
#返回_xsrf的值 return xsrf
#登陸的主方法 def login(baseurl,email,password):
#post須要的表單數據,類型爲字典 login_data = { '_xsrf': getXSRF(baseurl), 'password': password, 'remember_me': 'true', 'email': email, }
#設置頭信息 headers_base = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Encoding': 'gzip, deflate, sdch', 'Accept-Language': 'en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4,zh-TW;q=0.2', 'Connection': 'keep-alive', 'Host': 'www.zhihu.com', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36', 'Referer': 'http://www.zhihu.com/', } #使用seesion登陸,這樣的好處是能夠在接下來的訪問中能夠保留登陸信息 session = requests.session()
#登陸的URL baseurl += "/login/email"
#requests 的session登陸,以post方式,參數分別爲url、headers、data content = session.post(baseurl, headers = headers_base, data = login_data)
#成功登陸後輸出爲 {"r":0,
#"msg": "\u767b\u9646\u6210\u529f"
#} print content.text
#再次使用session以get去訪問知乎首頁,必定要設置verify = False,不然會訪問失敗 s = session.get("http://www.zhihu.com", verify = False) print s.text.encode('utf-8')
#把爬下來的知乎首頁寫到文本中 f = open('zhihu.txt', 'w') f.write(s.text.encode('utf-8'))
url = "http://www.zhihu.com" #進行登陸,將星號替換成你的知乎登陸郵箱和密碼便可 login(url,"******@***.com","************")
最後,就成功把知乎首頁的內容抓取下來了!下一步能夠進行分析和篩選了。