前面(1)(2)的內容已經足夠爬蟲如鏈家網之類的不需要登錄可以直接獲取數據的網站。
而要爬取社交網站比較鮮明的特點就是需要登錄,否則很多東西都無法獲取。經過測試發現,微博,知乎都不是很好登錄,知乎有時候的驗證碼會類似12306那樣,而微博除了驗證碼,在傳遞參數的時候會對用戶名進行base64加密。這里講簡單的豆瓣的登錄以及簡單的爬取。
對於Chrome內核的瀏覽器來說,可以右鍵,審查元素,選擇network,登錄一下自己的賬號。
選中login會有各種post還是get,url,連接頭各種信息。
往下拉找到formdat,像微博就把formdata給加密了。
form data里有我們登錄所需要的所有信息,其中captcha-solution就是登錄驗證碼,有時候有 有時候沒有所以在請求的時候,需要判斷有沒有。
import requests import re from bs4 import BeautifulSoup as bs import sys reload(sys) sys.setdefaultencoding('utf-8') s = requests.Session() url_login = 'http://accounts.douban.com/login' url_contacts = 'https://www.douban.com/contacts/list' formdata = { 'source':'index_nav', 'redir': 'https://www.douban.com', 'form_email': '22222', 'form_password': '111111', 'login': u'登錄' } headers = {'user-agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'} r = s.post(url_login, data=formdata, headers=headers) content = r.text soup = bs(content, 'lxml') captcha = soup.find('img', id='captcha_image') if captcha: captcha_url = captcha['src'] re_captcha_id = r'<input type-"hidden" name="captcha-id" value="(.*?)"/' captcha_id = re.findall(re_captcha_id, content) print captcha_id print captcha_url captcha_text = raw_input('Please input 驗證碼啊') formdata['captcha-solution'] = captcha_text formdata['captcha-id'] = captcha_id r = s.post(url_login, data=formdata, headers=headers)
這樣就成功登錄啦。
其實還有一種簡單的辦法,就是在登錄的時候 選擇記住我,然后在Request Headers里復制下來cookie,cookie可以用很久,所以還是足夠自用的。
import requests import os headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'} cookies = {'cookie':1'} url = 'http://www.douban.com' r = requests.get(url, cookies=cookies,headers=headers) r.encoding = 'utf-8' print r.text with open('douban.txt','wb+',encoding = 'utf') as f: f.write(r.content)