【爬蟲】python requests模擬登陸知乎

需求:模擬登陸知乎,由於知乎首頁須要登陸才能夠查看,因此想爬知乎上的內容首先須要登陸,那麼問題來了,怎麼用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","************")

 

最後,就成功把知乎首頁的內容抓取下來了!下一步能夠進行分析和篩選了。

相關文章
相關標籤/搜索