1. 程式人生 > >Python爬蟲實例(四)網站模擬登陸

Python爬蟲實例(四)網站模擬登陸

opener 運行 webkit zh-cn head window targe Coding 破解

一、獲取一個有登錄信息的Cookie模擬登陸

下面以人人網為例,首先使用自己的賬號和密碼在瀏覽器登錄,然後通過抓包拿到cookie,再將cookie放到請求之中發送請求即可,具體代碼如下:

# -*- coding: utf-8 -*-

import urllib2

# 構建一個已經登錄過的用戶的headers信息
headers = {
    "Host":"www.renren.com",
    "Connection":"keep-alive",
    "Upgrade-Insecure-Requests":"1",
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36
", "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Language":"zh-CN,zh;q=0.8,en;q=0.6", # 添加抓包獲取的cookie,這個Cookie是保存了密碼無需重復登錄的用戶的Cookie,裏面記錄了用戶名及密碼等登錄信息(我這裏只顯示一部分) "Cookie": "anonymid=j5xitrrwqgbk8; _r01_=1; loginfrom=syshome; wp_fold=0; _de=BF09EE3FED92E6B65F6A4705D973F1383380866D39FF5;
} # 通過headers裏的報頭信息(主要是Cookie信息),構建Request對象 request = urllib2.Request("http://www.renren.com/", headers = headers) # 直接訪問renren主頁,服務器會根據headers報頭信息(主要是Cookie信息),判斷這是一個已經登錄的用戶,並返回相應的頁面 response = urllib2.urlopen(request) # 打印響應內容 print response.read()

這樣就可以訪問登錄後才會呈現的頁面。

二、使用cookielib庫 和 HTTPCookieProcessor處理器

上面的方式固然可行,但是卻過於麻煩,我們先需要在瀏覽器登錄賬戶,並且設置保存密碼,並且通過抓包才能獲取這個Cookie。下面我們將簡化一下,代碼如下:

# -*- coding: utf-8 -*-

import urllib
import urllib2
import cookielib

# 構建一個CookieJar對象實例來保存cookie
cookie = cookielib.CookieJar()

# 使用HTTPCookieProcessor()來創建cookie處理器對象,參數為CookieJar()對象
cookie_handler = urllib2.HTTPCookieProcessor(cookie)

# 通過 build_opener() 來構建opener
opener = urllib2.build_opener(cookie_handler)

# addheaders 接受一個列表,裏面每個元素都是一個headers信息的元祖, opener將附帶headers信息
opener.addheaders = [("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36")]

#  需要登錄的賬戶和密碼
data = {"email":"賬戶", "password":"密碼"}  

#  通過urlencode()轉碼
postdata = urllib.urlencode(data)

#  構建Request請求對象,包含需要發送的用戶名和密碼
request = urllib2.Request("http://www.renren.com/PLogin.do", data = postdata)

#  通過opener發送這個請求,並獲取登錄後的Cookie值,
opener.open(request)                                              

#  opener包含用戶登錄後的Cookie值,可以直接訪問那些登錄後才可以訪問的頁面
response = opener.open("http://www.renren.com/410049765/profile")  

#  打印響應內容
print response.read()
這裏可以使用requests簡化代碼,具體如下:
import requests

# 創建session對象,可以保存Cookie值
ssion = requests.session()

# 處理 headers
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}

# 3需要登錄的用戶名和密碼
data = {"email":"賬戶", "password":"密碼"}  

# 發送附帶用戶名和密碼的請求,並獲取登錄後的Cookie值,保存在ssion裏
ssion.post("http://www.renren.com/PLogin.do", data = data)

#  ssion包含用戶登錄後的Cookie值,可以直接訪問那些登錄後才可以訪問的頁面
response = ssion.get("http://www.renren.com/410049765/profile")

# 打印響應內容
print response.text

註:這裏使用的是人人網的老版接口http://www.renren.com/PLogin.do如果使用的是http://www.renren.com/這個接口登錄將會失敗,因為新的接口需要的不僅僅是賬戶和密碼,還要有一些
動態生成的數據需要一起傳送過去,這個也可以通過先抓包獲取再和賬戶密碼一起發生。

這種方式模擬登錄需要註意的問題:
1、登錄一般都會先有一個HTTP GET,用於拉取一些信息及獲得Cookie,然後再HTTP POST登錄。
2、HTTP POST登錄的鏈接有可能是動態的,從GET返回的信息中獲取。
3、password 有些是明文發送,有些是加密後發送。有些網站甚至采用動態加密的,同時包括了很多其他數據的加密信息,只能通過查看JS源碼獲得加密算法,再去破解加密,非常困難。
4、大多數網站的登錄整體流程是類似的,可能有些細節不一樣,所以不能保證其他網站登錄成功


三、使用Selenium和PhantomJS模擬登錄
這種登錄方式和在瀏覽器登錄一樣,代碼如下:
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

driver = webdriver.PhantomJS()
driver.get("http://www.renren.com/")

# 輸入賬號密碼
driver.find_element_by_name("email").send_keys("賬戶")
driver.find_element_by_name("password").send_keys("密碼")

# 模擬點擊登錄
driver.find_element_by_xpath("//input[@class=‘input-submit login-btn‘]").click()

# 等待3秒
time.sleep(3)

# 生成登陸後快照
driver.save_screenshot("renren.png")

運行程序後就可以得到登錄後頁面的截圖了,也可以使用driver.page_source拿到頁面源碼。

Python爬蟲實例(四)網站模擬登陸