知乎抓圖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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:08
下一篇 2024-12-12 12:08

相關推薦

  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智慧、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29

發表回復

登錄後才能評論