在做爬蟲任務的時候,我們常常會遇到很多網頁必須登錄后,才可以開放某些頁面。所以登錄是爬取網頁的第一步。但是,通過post表單(包含用戶名和密碼)的方法,對于那些不需要輸入比較復雜的驗證碼的網頁,可以使用正則表達式將驗證碼和驗證碼的ID匹配得出,然后實現自動化登錄。但是,現在多部分的網頁都是需要輸入圖片驗證碼的,所以必須得通過人工的識別圖片然后輸入驗證碼。當然,你也可以開發一個深度學習算法,將下載下來的驗證碼圖片進行識別,然后轉換為數字進行輸入,但是這樣就大大的提高了算法的成本,本來你只是要爬取一些簡單的信息,卻的開發一個實用的驗證碼識別算法,實屬劃不來。所以,我們可以通過使用cookie信息,完成自動化輸入,而且每次訪問網站的時候都不需要輸入賬號,密碼和驗證碼等信息,相當于你在瀏覽器上勾選了記住我和自動登錄的選項。下面就讓我們開始學習如何使用cookie信息完成自動的登錄,以爬取豆瓣網內容為例。
一.輸入驗證碼登錄
首先,我給出一個不使用cookie信息來登錄的例子代碼
import requests
import html5lib
import re
from bs4 import BeautifulSoup
s = requests.Session()
url_login = 'http://accounts.douban.com/login' #該網址通過跟蹤登錄信息可以查看到
#登錄的表單
formdata = {
? ? 'redir':'https://www.douban.com',#登錄后直接跳轉的頁面
? ? 'form_email': '2324973098.com', #賬戶郵箱名(這是我自己亂寫的郵箱號碼,使用時請換成你自己的郵箱號)
? ? 'form_password': '12345678!',#登錄密碼(這是我自己亂寫的密碼,使用時請換成你自己的密碼)
? ? 'login': u'登陸'
}
#登錄的頭信息,為了模擬瀏覽器登錄,屬于固定形式
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36'}
r = s.post(url_login, data = formdata, headers = headers)
content = r.text
soup = BeautifulSoup(content, 'html5lib')#使用HTML5進行解析網頁
captcha = soup.find('img', id = 'captcha_image')#獲取驗證碼圖的鏈接
#判斷是否需要驗證碼,需要則人工輸入
if captcha:
? ? captcha_url = captcha['src']
? ? re_captcha_id = r'<input type="hidden" name="captcha-id" value="(.*?)"/'#找出驗證碼的ID,都可以通過跟蹤登錄過程知道
? ? captcha_id = re.findall(re_captcha_id, content)
? ? print(captcha_id)
? ? print(captcha_url)
? ? captcha_text = input('Please input the captcha:')#通過將輸出的驗證碼圖片網頁鏈接復制到瀏覽器打開,然后觀察驗證碼,然后輸入登錄
? ? formdata['captcha-solution'] = captcha_text
? ? formdata['captcha-id'] = captcha_id? ?#加入驗證碼的信息后,從新構造表單,然后申請登錄
? ? r = s.post(url_login, data = formdata, headers = headers)
with open('contacts.txt', 'w+', encoding = 'utf-8') as f:
? ? f.write(r.text)
二.使用cookie信息登錄
步驟:
1.使用你的賬號和密碼登錄豆瓣主頁,并且在登錄頁勾選記住我的選項。
2.打開瀏覽器,并按F12鍵,調出開發者工具,找到network這一選項,選中all,如下圖所示:
3.在該業中輸入豆瓣主頁https://www.douban.com/,然后便可以在下面的監視框內看到登錄的信息,如下圖:
4.找到最前面的一項,顯示的是www.douban.com,單擊后,點擊header,如下圖:
5.在header下面找到cookie信息便可,然后將cookie信息復制到代碼中。如下圖:
為了保護我的豆瓣的賬戶信息,所以這里cookie信息進行遮蔽,還望諒解。
代碼如下:
import requests
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36'}
cookies = {'cookie': 'bid=10gz8L7vrjI; __yadk_uid=QTSUUYvkbEDpprCxnGHo2vDkzhjkNgWB; ll="108288"; 608; ue="2314963088@qq.com"; push_noty_num=0; push_doumail_num=0; __utmv=30149280.17557; __utmt=1; dbcl2="175570305:1c9NM2YiWlg";ue="2314963088@qq.com"; push_noty_num=0; push_doumail_num=0; __utmv=30149280.17557; __utmt=1; dbcl2="175570305:1c9NM2YiWlg";?ck=Yiiv; _pk_id.100001.8cb4=3997ae079664ac75.1508600267.12.1521361971.1520843669.; __utmb=30149280.11.10.1521360343'}
r = requests.get(url, cookies = cookies, headers = headers)# print(r.text)
with open('douban_2.txt', 'wb+') as f:
? ? f.write(r.content)
到這里為止,你就完成了使用cookie的所有步驟,以后想再次訪問該網站則不在需要輸入驗證碼等信息了。