爬蟲實現免登入


近來身邊很多人問,爬蟲怎么實現免登入,這邊介紹幾種方法。

1、scrapy的FormRequest模塊

2、requests的post實現免登入

3、selenium實現自動化登入過程

 

接下來,我們來實現http://oursteps.com.au/的免登入

 

我們先說前兩種的情況,使用scrapy和requests的模擬登入

打開瀏覽器,輸入http://www.oursteps.com.au/bbs/portal.php回車

定義好請求的地址,使用fiddler抓包抓取到網頁登入輸入的信息

 

 

 

 

然后我們就知道他們的用戶名和密碼的鍵對應的是username、password

 

其實很簡單就是我們需要請求這個接口地址http://www.oursteps.com.au,加上用戶名和密碼參數,並設置對應的頭部配置好ua信息,然后進行請求

 

scrapy的FormRequest,跳過新建scrapy工程以及新建爬蟲的步驟了,直接干代碼,上面的注釋非常詳細了

# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request,FormRequest

class LoginSpider(scrapy.Spider):
    name = 'login'
    allowed_domains = ['oursteps.com.au']
        #這個默認的起點網址可以不用,因為我們下面配置了start-requests的方法,他們的功能類似,都是去爬第一個起始的網址
    #start_urls = ['http://oursteps.com.au/']
        #這個header可以是任何瀏覽器的頭文件,用於偽裝
    header = {
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0"
    }

    #里面的查詢地址最好是使用在fidder里面看見的地址,cookiejar設為真,parse是用一個回調函數,執行爬取信息之后對應的操作
    def start_requests(self):
        return [Request("http://www.oursteps.com.au/", meta={"cookiejar": 1}, callback=self.parse)]

    #發送一個post請求,數據是字典格式的,發送完了之后執行另外一個回調函數
    def parse(self, response):
        data = {
            "username": "your username",
            "password": "your password",
        }

        print("ready to login")
        # 通過FormRequest.from_response()進行登陸
        return [FormRequest.from_response(response,
                                          # 設置cookie信息
                                          meta={"cookiejar": response.meta["cookiejar"]},
                                          # 設置headers信息模擬成瀏覽器
                                          headers=self.header,
                                          # 設置post表單中的數據
                                          formdata=data,
                                          # 設置回調函數,此時回調函數為next()
                                          callback=self.next,
                                          )]

#回調函數,直接把返回的頁面保存下來
    def next(self,response):
        data=response.body
        #注意是二進制格式
        f=open("E:/temp/ourstep/a.html","wb")
        f.write(data)
        f.close()
#登錄成功了之后,再跳轉到另外一個頁面去,記住帶着cookie的狀態
        yield Request("http://www.oursteps.com.au/bbs/portal.php?mod=article&aid=82186",callback=self.next2,meta={"cookiejar": True})

#保存新頁面的內容
    def next2(self,response):
        data=response.body
        f = open("E:/temp/ourstep/b.html", "wb")
        f.write(data)
        f.close()
View Code

 

requests的模擬登入代碼

# -*- coding: utf-8 -*-
import requests
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
    }
data = {
            "username": "your username",
            "password": "your password",
        }
url ='http://www.oursteps.com.au/'
session = requests.Session()
session.post(url,headers = headers,data = data)
# 登錄后,我們需要獲取另一個網頁中的內容
response = session.get('http://www.oursteps.com.au/bbs/portal.php?mod=article&aid=82186',headers = headers)
print(response.status_code)
print(response.text)

f = open("E:/temp/ourstep/c.html", "wb")
f.write(response.text.encode("utf-8"))
f.close()
View Code

 

執行結果:a.html是登入的情況,b.html和c.html都是使用登入的cookie進行相關頁面打開

a.html,看到a.html的xww123說明已經登入進來了

 

 

 

b.html

 

 

 

 

c.html

 

 

 

selenium模擬手動登入,輸入用戶名密碼,代碼如下:

# coding:utf-8
from selenium import webdriver
import re,time,urllib2
from random import choice
from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions
import time

option = ChromeOptions()
# option.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = Chrome(options=option,executable_path='E:\seop\chrome_80\chromedriver')
time.sleep(5)

driver.get('http://www.oursteps.com.au/bbs/portal.php')
driver.maximize_window()
driver.find_element_by_xpath("//*[@id=\"ls_username\"]").send_keys("your username")
driver.find_element_by_xpath("//*[@id=\"ls_password\"]").send_keys("your password")
driver.find_element_by_xpath("//*[@id=\"lsform\"]/div/div/table/tbody/tr[2]/td[3]/button").click()

time.sleep(5)
driver.quit()

 

使用selenium登入效果如下,如果登入別的頁面,在登入后直接driver.get("頁面url")就可以

 

 

 

以上三種,都可以實現免登入的效果。

ps:

還有一種就是使用requests,使用cookie登入,就需要把登入的cookie保存下來,然后帶上cookie直接請求這個url就可以,這個和post方法類似,就不做介紹啦。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM