每天30分鐘 一起來學習爬蟲——day8(requests庫的cookie,ssl認證和代理,實例:人人網模擬登錄)

代理

代理的相關理論在前面已將說過了,這次直接看用requests 來設置代理


import requests

url = 'https://www.baidu.com/s?wd=ip&ie=UTF-8'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}

proxies = {
    'http': '117.88.176.252	:3000',
    'https': '117.88.176.252:3000',

}

r = requests.get(url, headers=headers, proxies=proxies)
print(r.status_code)

如果返回的200 就說明成功,但是下次訪問的時候可能就不成功了,大家如果實驗的話,先去 西刺代理 找一個最新的,好用一點



ssl 認證

HTTPs CA證書
沒有ssl證書的網站是可以訪問的,但是一些主流瀏覽器打開沒有ssl證書的網站也就是類型網站會提示“不安全”等信息。

相信大家都見過這樣的界面

在這裏插入圖片描述

在這裏插入圖片描述

ssl認證大體上如下:

  1. 服務器向CA機構獲取證書(假設這個證書僞造不了),當瀏覽器首次請求服務器的時候,服務器返回證書給瀏覽器。(證書包含:公鑰+申請者與頒發者的相關信息+簽名)

  2. 瀏覽器得到證書後,開始驗證證書的相關信息,證書有效(沒過期等)。(驗證過程,比較複雜,詳見上文)。

  3. 驗證完證書後,如果證書有效,客戶端是生成一個隨機數,然後用證書中的公鑰進行加密,加密後,發送給服務器,服務器用私鑰進行解密,得到隨機數。之後雙方便開始用該隨機數作爲鑰匙,對要傳遞的數據進行加密、解密。

更多關於ssl的看這

在這裏插入圖片描述
如遇到了沒有ssl認證的情況,用戶如果不點 高級 那用戶也看不到,我們在第一天就說過,爬蟲只能爬取用戶能訪問的頁面,現在用戶都看不到,爬蟲也爬不到了吖

不管怎麼樣,先按套路爬一下

import requests

url = 'https://www.desktx.com'# 這個是提示危險的網頁
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}

response = requests.get(url=url,headers=headers)
data=  response.content

with open ('ssl_requests.html','wb') as f:
    f.write(data)
# 爲了更清楚的看到,我把它寫入文件中

尷尬了,直接報錯,
在這裏插入圖片描述錯誤粘出來看看requests.exceptions.SSLError: HTTPSConnectionPool(host='www.desktx.com', port=443)
壓根就連不上啊(哭)

因爲 HTTPs 是有第三方的 CA 證書認證的,但是,這個網站,雖然是https, 但沒有第三方的 CA 證書,是自己的證書

解決方法 : 直接告訴 web 忽略證書

import requests

url = 'https://www.desktx.com'# 這個是提示危險的網頁
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}

response = requests.get(url=url,headers=headers,verify=False)
data=  response.content

with open ('ssl_requests.html','wb') as f:
    f.write(data)

直接在請求時 加上verify=False 就可以了吖

還有一種方法是全局取消證書驗證

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

一般用第一種就好了呢~~~



cookie

還記得之前使用 urlllib 庫,人人網的模擬登錄嗎,回憶一下,之前我們有兩種方法

  1. 登錄後抓包,直接吧cookie 寫在請求頭中
  2. 登錄時抓包,獲取到提交的表單數據(formdata),創建一個cookiejar的對象,並通過 cookiejar 使用HTTPCookieProcessor創建一個handler處理器,之後創建我們自己的openner來發送請求。

這次我們用requests 來實現一下
我們知道,cookie 是有關對話的一個問題,所以我們要先創建一個會話,之後,所有的請求都通過會話發送。

這裏就不再演示抓包分析了,於之前的實例一樣,忘了的可以 點這裏看看

這裏就直接看代碼吧,

import requests

# 如果碰到會話相關問題,要先創建一個會話
s = requests.Session()
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'

}

formdata = {
    'rkey':	'',    # 這裏是我們抓包得到的數據,填進去
    'password':	'',# 這裏是我們抓包得到的數據,填進去
    'origURL':	'http://www.renren.com/home',
    'key_id':	'1',
    'icode'	: '',
    'f'	: 'http%3A%2F%2Fwww.renren.com%2F823000881',
    'email'	: ' ', # 這裏是我們抓包得到的數據,填進去
    'domain':	'renren.com',
    'captcha_type':	'web_login',
}

post_url = 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=2020159150'

r = s.post(url=post_url, headers=headers, data=formdata)
# 用剛纔的會話發送請求

# 這下s裏面就保存了cookie,我們這時候訪問個人主頁就可以成功了
get_url = 'http://sc.renren.com/scores/mycalendar'

ret = s.get(url=get_url, headers=headers)
# with open('renren_r.html', 'wb') as f:
#     f.write(ret.text)
print(ret.text)

# 這樣用s訪問,而不是request 就可以登錄成功

同樣的,如果使用第一種方法,我們需要做的,只是給get請求傳入cookie 參數

import requests
# 直接傳入 cookie  的方法
cookie = '' # 這裏填自己抓包得到的cookie
# 這個是cookie字符串,但我們要傳入的是字典

#  我們先創建一個字典
cookie_dict = {}
# 我們手動轉換一下,先從 封號 拆開
cookie_list = cookie.split(';')
for cookie in cookie_list:
    # 再從 '=' 拆開
    cookie_dict[cookie.split('=')[0]] = cookie.split('=')[1]

# 我們也可以寫字典推導式,來生成字典

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}
url = ''# 這個是自己要訪問的url,
r = requests.get(url=url, headers=headers, cookies=cookie_dict)
with open('renren_r.html', 'wb') as f:
    f.write(r.content)



auth認證

這個沒有實例演示,就是能簡單說一下,如果有公司內網的話,可以試試

import requests

auth = (username, pwd)  # 這個是一個元組,訪問內網的時候,傳進去就好了

response = requests.get(url, headers=headers, auth=auth)
# 這樣就可以了

到這裏我們requests庫就大概學完了,但是大家有沒有發現,我們目前都是保存的網頁,這並沒有什麼實際效果,所以接下來我們會學習對爬取的數據的解析,明天 先學習 正則表達式解析


我又來要讚了,如果覺得可以學到些什麼的話,點個贊再走吧,歡迎各位路過的大佬評論指正

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章