摘要: 在進行爬蟲時,除了常見的不用登陸就能爬取的網站,還有一類須要先登陸的網站。好比豆瓣、知乎,以及上一篇文章中的桔子網。這一類網站又能夠分爲:只需輸入賬號密碼、除了賬號密碼還需輸入或點擊驗證碼等類型。本文以只需輸入帳號密碼就能登陸的桔子網爲例,介紹模擬登陸經常使用的 3 種方法。html
下面,咱們用代碼分別實現上述 3 種方法。python
這是咱們要獲取內容的網頁:web
radar.itjuzi.com/investeventapi
這個網頁須要先登陸才能看到數據信息,登陸界面以下:服務器
能夠看到,只須要輸入帳號和密碼就能夠登陸,不用輸驗證碼,比較簡單。下面咱們利用一個測試帳號和密碼,來實現模擬登陸。cookie
首先,咱們要找到 POST 請求的 URL。session
有兩種方法,第一種是在網頁 devtools 查看請求,第二種是在 Fiddler 軟件中查看。ide
先說第一種方法。工具
在登陸界面輸入帳號密碼,並打開開發者工具,清空全部請求,接着點擊登陸按鈕,這時便會看到有大量請求產生。哪個纔是 POST 請求的 URL呢?這個須要一點經驗,由於是登陸,因此能夠嘗試點擊帶有 「login」字眼的請求。這裏咱們點擊第四個請求,在右側 Headers 中能夠看到請求的 URL,請求方式是 POST類型,說明 URL 找對了。post
接着,咱們下拉到 Form Data,這裏有幾個參數,包括 identify 和 password,這兩個參數正是咱們登陸時須要輸入的帳號和密碼,也就是 POST 請求須要攜帶的參數。
參數構造很是簡單,接下來只須要利用 Requests.post 方法請求登陸網站,而後就能夠爬取內容了。
下面,咱們嘗試用 Fiddler 獲取 POST 請求。
若是你對 Fiddler 還不太熟悉或者沒有電腦上沒有安裝,能夠先了解和安裝一下。
Fiddler 是位於客戶端和服務器端的 HTTP 代理,也是目前最經常使用的 HTTP 抓包工具之一 。 它可以記錄客戶端和服務器之間的全部 HTTP 請求,能夠針對特定的 HTTP 請求,分析請求數據、設置斷點、調試 web 應用、修改請求的數據,甚至能夠修改服務器返回的數據,功能很是強大,是 web 調試的利器。
Fiddler 下載地址:
使用教程:
下面,咱們就經過 Fiddler 截取登陸請求。
當點擊登陸時,官場 Fiddler 頁面,左側能夠看到抓取了大量請求。經過觀察,第15個請求的 URL中含有「login」字段,頗有多是登陸的 POST 請求。咱們點擊該請求,回到右側,分別點擊「inspectors」、「Headers」,能夠看到就是 POST 請求,該 URL 和上面的方法獲取的 URL 是一致的。
接着,切換到右側的 Webforms 選項,能夠看到 Body 請求體。也和上面方法中獲得的一致。
獲取到 URL 和請求體參數以後,下面就能夠開始用 Requests.post 方法模擬登陸了。
代碼以下:
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 = {
'identity':'irw27812@awsoo.com',
'password':'test2018',
}
url ='https://www.itjuzi.com/user/login?redirect=&flag=&radar_coupon='
session = requests.Session()
session.post(url,headers = headers,data = data)
# 登陸後,咱們須要獲取另外一個網頁中的內容
response = session.get('http://radar.itjuzi.com/investevent',headers = headers)
print(response.status_code)
print(response.text)
複製代碼
使用 session.post 方法提交登陸請求,而後用 session.get 方法請求目標網頁,並輸出 HTML代碼。能夠看到,成功獲取到了網頁內容。
下面,介紹第 2 種方法。
上面一種方法,咱們須要去後臺獲取 POST 請求連接和參數,比較麻煩。下面,咱們能夠嘗試先登陸,獲取 Cookie,而後將該 Cookie 添加到 Headers 中去,而後用 GET 方法請求便可,過程簡單不少。
代碼以下:
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',
'Cookie': '你的cookie',
}
url = 'https://www.itjuzi.com/user/login?redirect=&flag=&radar_coupon='
session = requests.Session()
response = session.get('http://radar.itjuzi.com/investevent', headers=headers)
print(response.status_code)
print(response.text)
複製代碼
能夠看到,添加了 Cookie 後就不用再 POST 請求了,直接 GET 請求目標網頁便可。能夠看到,也能成功獲取到網頁內容。
下面介紹第 3 種方法。
這個方法很直接,利用 Selenium 代替手動方法去自動輸入帳號密碼而後登陸就好了。
關於 Selenium 的使用,在以前的一篇文章中有詳細介紹,若是你不熟悉能夠回顧一下:
代碼以下:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
browser = webdriver.Chrome()
browser.maximize_window() # 最大化窗口
wait = WebDriverWait(browser, 10) # 等待加載10s
def login():
browser.get('https://www.itjuzi.com/user/login')
input = wait.until(EC.presence_of_element_located(
(By.XPATH, '//*[@id="create_account_email"]')))
input.send_keys('irw27812@awsoo.com')
input = wait.until(EC.presence_of_element_located(
(By.XPATH, '//*[@id="create_account_password"]')))
input.send_keys('test2018')
submit = wait.until(EC.element_to_be_clickable(
(By.XPATH, '//*[@id="login_btn"]')))
submit.click() # 點擊登陸按鈕
get_page_index()
def get_page_index():
browser.get('http://radar.itjuzi.com/investevent')
try:
print(browser.page_source) # 輸出網頁源碼
except Exception as e:
print(str(e))
login()
複製代碼
這裏,咱們在網頁中首先定位了帳號節點位置:'//*[@id="create_account_email"]'
,而後用 input.send_keys 方法輸入帳號,同理,定位了密碼框位置並輸入了密碼。接着定位 登陸 按鈕的位置://*[@id="login_btn"]
,而後用 submit.click() 方法實現點擊登陸按鈕操做,從而完成登陸。能夠看到,也能成功獲取到網頁內容。
以上就是模擬需登陸網站的幾種方法。當登陸進去後,就能夠開始爬取所需內容了。
推薦閱讀:
本文完。