Python模擬登錄

一、登錄的基本原理

模擬登錄是指使用程序模擬用戶的行為來進行登錄。登錄有通用的原理,但是因為每個網站可能有不同的驗證機制,因此模擬登錄的具體實現方式各有不同。

通用的登錄原理是:向伺服器發送登錄請求,服務端返回一個登錄成功後的Cookie。在後續的請求中,需要該Cookie才能夠獲得登錄後的頁面內容。


import requests

login_url = "http://www.example.com/login"
data = {
    "username": "myusername",
    "password": "mypassword"
}
session = requests.Session()
response = session.post(login_url, data=data)

二、GET與POST請求的區別

Get和Post都是HTTP請求方法,使用GET和POST請求都可以發送數據。兩者的區別在於:

  • 數據位置:GET請求的數據在URL中,POST請求的數據在HTTP請求的Body中。
  • 數據長度限制:GET請求的數據長度限制,取決於瀏覽器或伺服器限制;POST請求的數據長度限制,取決於伺服器限制。
  • 請求對象:GET請求的請求對象是無狀態的,也就是說,兩次相同的GET請求返回的數據是相同的;POST請求的請求對象是有狀態的,同一個POST請求的數據不同,返回的數據也會不同。

三、編寫爬蟲模擬登錄示例

下面以西刺免費代理IP為例,演示使用Python模擬登錄篩選高匿代理IP,並將其存入MongoDB的方法。

西刺網站登錄的流程

首先,登錄西刺網站需要輸入用戶名和密碼,並且需要輸入驗證碼。但是,由於驗證碼可能無法識別,因此我們可以使用已經登錄成功的賬號獲取登錄後頁面的Cookie,直接使用該Cookie發送請求即可。

代碼示例


import random
import re
import time
import requests
import pymongo

class XiciSpider(object):
    def __init__(self, proxy_type='高匿', page_num=10):
        self.proxy_type = proxy_type
        self.page_num = page_num
        self.session = requests.Session()
        self.session.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"}
        self.base_url = "https://www.xicidaili.com/nt/{}"

        self.conn = pymongo.MongoClient("mongodb://localhost:27017/")
        self.db = self.conn["proxies"]
        self.collection = self.db["xici"]

        self.cookies = self.get_cookies()

    def get_cookies(self):
        url = "https://www.xicidaili.com/nt/"
        response = self.session.get(url)
        cookies = response.cookies
        return cookies

    def get_proxy_list(self):
        proxy_list = []
        for page in range(1,self.page_num+1):
            url = self.base_url.format(page)
            response = self.session.get(url, cookies=self.cookies)
            text = response.text
            pattern = re.compile(r'<tr class.*?(.*?).*?(.*?).*?(.*?).*?(.*?).*?', re.S)
            items = re.findall(pattern, text)
            for item in items:
                if item[3] == self.proxy_type:
                    proxy = {
                        "ip": item[0],
                        "port": item[1],
                        "protocol": item[2],
                        "proxy_type": item[3],
                    }
                    proxy_list.append(proxy)
            time.sleep(random.uniform(1, 2))
        return proxy_list

    def check_proxy(self, proxy):
        url = "http://icanhazip.com/"
        proxies = {
            "http": "http://{}:{}".format(proxy['ip'], proxy['port']),
            "https": "https://{}:{}".format(proxy['ip'], proxy['port']),
        }
        try:
            response = requests.get(url, proxies=proxies, timeout=5)
            if response.ok:
                return True
            else:
                return False
        except requests.exceptions.RequestException:
            return False

    def save_to_mongo(self, proxy_list):
        for proxy in proxy_list:
            if self.check_proxy(proxy):
                print("驗證通過:{}:{} {}".format(proxy['ip'], proxy['port'], proxy['protocol']))
                self.collection.update_one({"ip": proxy['ip']}, {"$set": proxy}, upsert=True)
            else:
                print("驗證失敗:{}:{}".format(proxy['ip'], proxy['port']))

    def run(self):
        proxy_list = self.get_proxy_list()
        self.save_to_mongo(proxy_list)

if __name__ == '__main__':
    spider = XiciSpider()
    spider.run()

四、小結

模擬登錄是Web爬蟲的基礎知識之一,對於具有登錄機制的網站,模擬登錄可以獲取更多的數據。Python中有很多Web框架和網路庫可以使用,有了基本的理論知識和實踐技能,可以調用這些強大的工具進行更高效的數據爬取。

原創文章,作者:RZFV,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/150119.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
RZFV的頭像RZFV
上一篇 2024-11-07 09:49
下一篇 2024-11-07 09:49

相關推薦

  • Python中引入上一級目錄中函數

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

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

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

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

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

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

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

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

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

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

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

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

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

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

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

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

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

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

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

    編程 2025-04-29

發表回復

登錄後才能評論