很多網(wǎng)頁瀏覽都需要首先登陸,比如說新浪微博锄贷。當(dāng)然译蒂,這里有一個(gè)小技巧,用手機(jī)3G版登陸谊却。電腦版會(huì)有各種加密柔昼,動(dòng)態(tài)加載什么的。我們就耍一下小流氓炎辨,柿子揀軟的捏么岳锁。
瀏覽器保持登陸是利用我們登陸時(shí)收到的cookies,發(fā)送給網(wǎng)站蹦魔,這樣網(wǎng)站就知道用戶已經(jīng)登陸過來激率。我們的思路是這樣:首先提交賬號密碼登陸,接受cookies勿决,然后才開始瀏覽微博乒躺。
但是很多網(wǎng)站不僅需要提交賬號密碼,為了防止爬蟲低缩,他們會(huì)在登錄頁面源代碼里生成一些隨機(jī)數(shù)據(jù)嘉冒,瀏覽器會(huì)自動(dòng)處理,post出去咆繁。所以我們也要找到它們讳推。
這是我們的步驟:第一步要找出我們需要提交的數(shù)據(jù),第二步在登錄頁面的網(wǎng)頁代碼里Ctrl +F尋找那些數(shù)據(jù)玩般,第三步開始寫代碼银觅,利用requests.get(登錄頁面),抓取代碼坏为,re正則表達(dá)式提取出來究驴,組成列表镊绪。第四步登陸,獲取cookies洒忧。第五步開始抓取微博蝴韭。
第一步:找出瀏覽器發(fā)送的數(shù)據(jù)
1,我們打開登陸網(wǎng)頁: https://login.weibo.cn/login/
2熙侍,右鍵單擊榄鉴,查看元素,點(diǎn)擊控制臺(tái)蛉抓,網(wǎng)絡(luò)庆尘。
3,右鍵單擊芝雪,查看源代碼。(為了找到發(fā)送數(shù)據(jù)后回來看這些數(shù)據(jù)在源代碼的位置)
4综苔,填寫賬號密碼惩系,點(diǎn)擊登陸。我們可以看見如筛,瀏覽器發(fā)送了一個(gè)POST堡牡,我們點(diǎn)開看看
5,我們分析一下杨刨,可以看到晤柄,POST的請求網(wǎng)址不是原來的,即我們要提交數(shù)據(jù)的url妖胀。這是一個(gè)我們需要找的芥颈。
還有表單提交的內(nèi)容:
vk,tryCount赚抡,submit爬坑,remember,password_8439涂臣,mobile盾计,backURL,backTitle這幾項(xiàng)赁遗。我們需要找的是vk署辉,password_8439就行了。
第二步在登錄頁面的網(wǎng)頁代碼里Ctrl +F尋找那些數(shù)據(jù)
我們分別搜索rand岩四,vk哭尝,password關(guān)鍵詞,找到它們的位置剖煌,發(fā)現(xiàn)數(shù)值確實(shí)和發(fā)送的數(shù)值一致刚夺。
第三步requests.get(登錄頁面)献丑,抓取代碼,re正則表達(dá)式提取
第四步獲取cookies
cookie=requests.session().post(new_url,data=data).cookies
第五步抓取微博
代碼如下
#-*-coding:utf8-*-
import requests
from lxml import etree
import re
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
#防止編碼錯(cuò)誤
url_login = 'https://login.weibo.cn/login/'
html = requests.get(url_login).content
selector = etree.HTML(html)
password = selector.xpath('//input[@type="password"]/@name')[0]
vk = selector.xpath('//input[@name="vk"]/@value')[0]
action = selector.xpath('//form[@method="post"]/@action')[0]
print action
print password
print vk
print" ************* "
newurl = url_login + action
data={
? ?'mobile' : '登陸賬號',
? ?password : '登陸密碼',
? ?'remember' : 'on',
? ?'backURL' : 'http://weibo.cn/',
? ?'backTitle' : u'手機(jī)新浪網(wǎng)',
? ?'tryCount' : '',
? ?'vk' : vk,
? ?'submit' : u'登錄'
}
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36'}
cookie=requests.session().post(newurl,data=data侠姑,headers=headers).cookies
print cookie
page = []
for i in range(1,21):
? ?newpage = 'http://weibo.cn/greatanny?page=' + str(i)
? ?page.append(newpage)
for url in page:
? ?html = requests.get(url,cookies = cookie,headers=headers).content
? ?selector = etree.HTML(html)
? ?content = selector.xpath('//span[@class="ctt"]')
? ?for each in content:
? ? ? ?text = each.xpath('string(.)')
? ? ? ?print text