本文目錄一覽:
- 1、如何用python寫爬蟲 知乎
- 2、怎樣用Python設計一個爬蟲模擬登陸知乎
- 3、python 爬蟲框架哪個好 知乎
- 4、如何使用python爬取知乎數據並做簡單分析
- 5、Python爬取知乎與我所理解的爬蟲與反爬蟲
如何用python寫爬蟲 知乎
學習
基本的爬蟲工作原理
基本的http抓取工具,scrapy
Bloom Filter: Bloom Filters by Example
如果需要大規模網頁抓取,你需要學習分散式爬蟲的概念。其實沒那麼玄乎,你只要學會怎樣維護一個所有集群機器能夠有效分享的分散式隊列就好。最簡單的實現是python-rq:
rq和Scrapy的結合:darkrho/scrapy-redis · GitHub
後續處理,網頁析取(grangier/python-goose · GitHub),存儲(Mongodb)
怎樣用Python設計一個爬蟲模擬登陸知乎
給你一個例子,可以看看:
import requests
import time
import json
import os
import re
import sys
import subprocess
from bs4 import BeautifulSoup as BS
class ZhiHuClient(object):
“””連接知乎的工具類,維護一個Session
2015.11.11
用法:
client = ZhiHuClient()
# 第一次使用時需要調用此方法登錄一次,生成cookie文件
# 以後可以跳過這一步
client.login(“username”, “password”)
# 用這個session進行其他網路操作,詳見requests庫
session = client.getSession()
“””
# 網址參數是賬號類型
TYPE_PHONE_NUM = “phone_num”
TYPE_EMAIL = “email”
loginURL = r”{0}”
homeURL = r””
captchaURL = r””
headers = {
“User-Agent”: “Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36”,
“Accept”: “text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8”,
“Accept-Encoding”: “gzip, deflate”,
“Host”: “”,
“Upgrade-Insecure-Requests”: “1”,
}
captchaFile = os.path.join(sys.path[0], “captcha.gif”)
cookieFile = os.path.join(sys.path[0], “cookie”)
def __init__(self):
os.chdir(sys.path[0]) # 設置腳本所在目錄為當前工作目錄
self.__session = requests.Session()
self.__session.headers = self.headers # 用self調用類變數是防止將來類改名
# 若已經有 cookie 則直接登錄
self.__cookie = self.__loadCookie()
if self.__cookie:
print(“檢測到cookie文件,直接使用cookie登錄”)
self.__session.cookies.update(self.__cookie)
soup = BS(self.open(r””).text, “html.parser”)
print(“已登陸賬號: %s” % soup.find(“span”, class_=”name”).getText())
else:
print(“沒有找到cookie文件,請調用login方法登錄一次!”)
# 登錄
def login(self, username, password):
“””
驗證碼錯誤返回:
{‘errcode’: 1991829, ‘r’: 1, ‘data’: {‘captcha’: ‘請提交正確的驗證碼 :(‘}, ‘msg’: ‘請提交正確的驗證碼 :(‘}
登錄成功返回:
{‘r’: 0, ‘msg’: ‘登陸成功’}
“””
self.__username = username
self.__password = password
self.__loginURL = self.loginURL.format(self.__getUsernameType())
# 隨便開個網頁,獲取登陸所需的_xsrf
html = self.open(self.homeURL).text
soup = BS(html, “html.parser”)
_xsrf = soup.find(“input”, {“name”: “_xsrf”})[“value”]
# 下載驗證碼圖片
while True:
captcha = self.open(self.captchaURL).content
with open(self.captchaFile, “wb”) as output:
output.write(captcha)
# 人眼識別
print(“=” * 50)
print(“已打開驗證碼圖片,請識別!”)
subprocess.call(self.captchaFile, shell=True)
captcha = input(“請輸入驗證碼:”)
os.remove(self.captchaFile)
# 發送POST請求
data = {
“_xsrf”: _xsrf,
“password”: self.__password,
“remember_me”: “true”,
self.__getUsernameType(): self.__username,
“captcha”: captcha
}
res = self.__session.post(self.__loginURL, data=data)
print(“=” * 50)
# print(res.text) # 輸出腳本信息,調試用
if res.json()[“r”] == 0:
print(“登錄成功”)
self.__saveCookie()
break
else:
print(“登錄失敗”)
print(“錯誤信息 —“, res.json()[“msg”])
def __getUsernameType(self):
“””判斷用戶名類型
經測試,網頁的判斷規則是純數字為phone_num,其他為email
“””
if self.__username.isdigit():
return self.TYPE_PHONE_NUM
return self.TYPE_EMAIL
def __saveCookie(self):
“””cookies 序列化到文件
即把dict對象轉化成字元串保存
“””
with open(self.cookieFile, “w”) as output:
cookies = self.__session.cookies.get_dict()
json.dump(cookies, output)
print(“=” * 50)
print(“已在同目錄下生成cookie文件:”, self.cookieFile)
def __loadCookie(self):
“””讀取cookie文件,返回反序列化後的dict對象,沒有則返回None”””
if os.path.exists(self.cookieFile):
print(“=” * 50)
with open(self.cookieFile, “r”) as f:
cookie = json.load(f)
return cookie
return None
def open(self, url, delay=0, timeout=10):
“””打開網頁,返回Response對象”””
if delay:
time.sleep(delay)
return self.__session.get(url, timeout=timeout)
def getSession(self):
return self.__session
if __name__ == ‘__main__’:
client = ZhiHuClient()
# 第一次使用時需要調用此方法登錄一次,生成cookie文件
# 以後可以跳過這一步
# client.login(“username”, “password”)
# 用這個session進行其他網路操作,詳見requests庫
session = client.getSession()
python 爬蟲框架哪個好 知乎
1、Scrapy:是一個為了抓取網站數據,提取數據結構性數據而編寫的應用框架,可以應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中,用這個框架可以輕鬆爬下來各種信息數據。
2、Pyspider:是一個用Python實現的功能強大的網路爬蟲系統,能在瀏覽器界面上進行腳本的編寫,功能的調度和爬取結果的實時查看,後端使用常用的資料庫進行抓取結構的存儲,還能定時設置任務與任務優先順序等。
3、Crawley:可以高速抓取對應網站內容,支持關係和非關係資料庫,數據可以導出為json、xml等。
4、Portia:是一個開源可視化爬蟲工具,可以讓您在不需要任何編程知識的情況下抓取網站,簡單地註解您感興趣的頁面,創建一個蜘蛛來從類似的頁面抓取數據。
5、Newspaper:可以用來提取新聞、文章和內容分析,使用多線程,支持10多種編程語言。
6、Beautiful Soup:是一個可以從HTML或者xml文件中提取數據的Python庫,它能通過你喜歡的轉換器實現慣用的文檔導航,查找,修改文檔的方式;同時幫你節省數小時甚至數天的工作時間。
7、Grab:是一個用於創建web刮板的Python框架,藉助Grab,您可以創建各種複雜的網頁抓取工具,從簡單的五行腳本到處理數萬個網頁的複雜非同步網站抓取工具。Grab提供一個api用於執行網路請求和處理接收到的內容。
8、Cola:是一個分散式的爬蟲框架,對於用戶來說,只需要編寫幾個特定的函數,而無需關注分散式運行的細節,任務會自動分配到多台機器上,整個過程對用戶是透明的。
如何使用python爬取知乎數據並做簡單分析
一、使用的技術棧:
爬蟲:python27 +requests+json+bs4+time
分析工具: ELK套件
開發工具:pycharm
數據成果簡單的可視化分析
1.性別分布
0 綠色代表的是男性 ^ . ^
1 代表的是女性
-1 性別不確定
可見知乎的用戶男性頗多。
二、粉絲最多的top30
粉絲最多的前三十名:依次是張佳瑋、李開復、黃繼新等等,去知乎上查這些人,也差不多這個排名,說明爬取的數據具有一定的說服力。
三、寫文章最多的top30
四、爬蟲架構
爬蟲架構圖如下:
說明:
選擇一個活躍的用戶(比如李開復)的url作為入口url.並將已爬取的url存在set中。
抓取內容,並解析該用戶的關注的用戶的列表url,添加這些url到另一個set中,並用已爬取的url作為過濾。
解析該用戶的個人信息,並存取到本地磁碟。
logstash取實時的獲取本地磁碟的用戶數據,並給elsticsearchkibana和elasticsearch配合,將數據轉換成用戶友好的可視化圖形。
五、編碼
爬取一個url:
解析內容:
存本地文件:
代碼說明:
* 需要修改獲取requests請求頭的authorization。
* 需要修改你的文件存儲路徑。
源碼下載:點擊這裡,記得star哦!https : // github . com/forezp/ZhihuSpiderMan六、如何獲取authorization
打開chorme,打開https : // www. zhihu .com/,
登陸,首頁隨便找個用戶,進入他的個人主頁,F12(或滑鼠右鍵,點檢查)七、可改進的地方
可增加線程池,提高爬蟲效率
存儲url的時候我才用的set(),並且採用緩存策略,最多只存2000個url,防止內存不夠,其實可以存在redis中。
存儲爬取後的用戶我說採取的是本地文件的方式,更好的方式應該是存在mongodb中。
對爬取的用戶應該有一個信息的過濾,比如用戶的粉絲數需要大與100或者參與話題數大於10等才存儲。防止抓取了過多的殭屍用戶。
八、關於ELK套件
關於elk的套件安裝就不討論了,具體見官網就行了。網站:https : // www . elastic . co/另外logstash的配置文件如下:
從爬取的用戶數據可分析的地方很多,比如地域、學歷、年齡等等,我就不一一列舉了。另外,我覺得爬蟲是一件非常有意思的事情,在這個內容消費升級的年代,如何在廣闊的互聯網的數據海洋中挖掘有價值的數據,是一件值得思考和需不斷踐行的事情。
Python爬取知乎與我所理解的爬蟲與反爬蟲
關於知乎驗證碼登陸的問題,用到了Python上一個重要的圖片處理庫PIL,如果不行,就把圖片存到本地,手動輸入。
通過對知乎登陸是的抓包,可以發現登陸知乎,需要post三個參數,一個是賬號,一個是密碼,一個是xrsf。
這個xrsf隱藏在表單裡面,每次登陸的時候,應該是伺服器隨機產生一個字元串。所有,要模擬登陸的時候,必須要拿到xrsf。
用chrome (或者火狐 httpfox 抓包分析)的結果:
所以,必須要拿到xsrf的數值,注意這是一個動態變化的參數,每次都不一樣。
拿到xsrf,下面就可以模擬登陸了。
使用requests庫的session對象,建立一個會話的好處是,可以把同一個用戶的不同請求聯繫起來,直到會話結束都會自動處理cookies。
注意:cookies 是當前目錄的一個文件,這個文件保存了知乎的cookie,如果是第一個登陸,那麼當然是沒有這個文件的,不能通過cookie文件來登陸。必須要輸入密碼。
這是登陸的函數,通過login函數來登陸,post 自己的賬號,密碼和xrsf 到知乎登陸認證的頁面上去,然後得到cookie,將cookie保存到當前目錄下的文件裡面。下次登陸的時候,直接讀取這個cookie文件。
這是cookie文件的內容
以下是源碼:
運行結果:
反爬蟲最基本的策略:
爬蟲策略:
這兩個都是在http協議的報文段的檢查,同樣爬蟲端可以很方便的設置這些欄位的值,來欺騙伺服器。
反爬蟲進階策略:
1.像知乎一樣,在登錄的表單裡面放入一個隱藏欄位,裡面會有一個隨機數,每次都不一樣,這樣除非你的爬蟲腳本能夠解析這個隨機數,否則下次爬的時候就不行了。
2.記錄訪問的ip,統計訪問次數,如果次數太高,可以認為這個ip有問題。
爬蟲進階策略:
1.像這篇文章提到的,爬蟲也可以先解析一下隱藏欄位的值,然後再進行模擬登錄。
2.爬蟲可以使用ip代理池的方式,來避免被發現。同時,也可以爬一會休息一會的方式來降低頻率。另外,伺服器根據ip訪問次數來進行反爬,再ipv6沒有全面普及的時代,這個策略會很容易造成誤傷。(這個是我個人的理解)。
通過Cookie限制進行反爬蟲:
和Headers校驗的反爬蟲機制類似,當用戶向目標網站發送請求時,會再請求數據中攜帶Cookie,網站通過校驗請求信息是否存在Cookie,以及校驗Cookie的值來判定發起訪問請求的到底是真實的用戶還是爬蟲,第一次打開網頁會生成一個隨機cookie,如果再次打開網頁這個Cookie不存在,那麼再次設置,第三次打開仍然不存在,這就非常有可能是爬蟲在工作了。
反爬蟲進進階策略:
1.數據投毒,伺服器在自己的頁面上放置很多隱藏的url,這些url存在於html文件文件裡面,但是通過css或者js使他們不會被顯示在用戶看到的頁面上面。(確保用戶點擊不到)。那麼,爬蟲在爬取網頁的時候,很用可能取訪問這個url,伺服器可以100%的認為這是爬蟲乾的,然後可以返回給他一些錯誤的數據,或者是拒絕響應。
爬蟲進進階策略:
1.各個網站雖然需要反爬蟲,但是不能夠把百度,谷歌這樣的搜索引擎的爬蟲給幹了(幹了的話,你的網站在百度都說搜不到!)。這樣爬蟲應該就可以冒充是百度的爬蟲去爬。(但是ip也許可能被識破,因為你的ip並不是百度的ip)
反爬蟲進進進階策略:
給個驗證碼,讓你輸入以後才能登錄,登錄之後,才能訪問。
爬蟲進進進階策略:
圖像識別,機器學習,識別驗證碼。不過這個應該比較難,或者說成本比較高。
參考資料:
廖雪峰的python教程
靜覓的python教程
requests庫官方文檔
segmentfault上面有一個人的關於知乎爬蟲的博客,找不到鏈接了
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/237909.html