近來身邊很多人問,爬蟲怎么實現免登入,這邊介紹幾種方法。
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()
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()
執行結果: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方法類似,就不做介紹啦。