最近我必須執(zhí)行一項(xiàng)從一個需要登錄的網(wǎng)站上爬取一些網(wǎng)頁的操作。它沒有我想象中那么簡單,因此我決定為它寫一個輔助教程。
在本教程中,我們將從我們的bitbucket賬戶中爬取一個項(xiàng)目列表。
教程中的代碼可以從我的 Github 中找到。
我們將會按照以下步驟進(jìn)行:
-
提取登錄需要的詳細(xì)信息
-
執(zhí)行站點(diǎn)登錄
-
爬取所需要的數(shù)據(jù)
在本教程中,我使用了以下包(可以在 requirements.txt 中找到):
requests
lxml
#步驟一:研究該網(wǎng)站
打開登錄頁面
進(jìn)入以下頁面 “bitbucket.org/account/signin”。你會看到如下圖所示的頁面(執(zhí)行注銷,以防你已經(jīng)登錄)
仔細(xì)研究那些我們需要提取的詳細(xì)信息,以供登錄之用
在這一部分,我們會創(chuàng)建一個字典來保存執(zhí)行登錄的詳細(xì)信息:
1. 右擊 “Username or email” 字段,選擇“查看元素”。我們將使用 “name” 屬性為 “username” 的輸入框的值。“username”將會是 key 值,我們的用戶名/電子郵箱就是對應(yīng)的 value 值(在其他的網(wǎng)站上這些 key 值可能是 “email”,“ user_name”,“ login”,等等)。
2. 右擊 “Password” 字段,選擇“查看元素”。在腳本中我們需要使用 “name” 屬性為 “password” 的輸入框的值。“password” 將是字典的 key 值,我們輸入的密碼將是對應(yīng)的 value 值(在其他網(wǎng)站key值可能是 “userpassword”,“l(fā)oginpassword”,“pwd”,等等)。
3. 在源代碼頁面中,查找一個名為 “csrfmiddlewaretoken” 的隱藏輸入標(biāo)簽。“csrfmiddlewaretoken” 將是 key 值,而對應(yīng)的 value 值將是這個隱藏的輸入值(在其他網(wǎng)站上這個 value 值可能是一個名為 “csrftoken”,“ authenticationtoken” 的隱藏輸入值)。列如:“Vy00PE3Ra6aISwKBrPn72SFml00IcUV8”。
最后我們將會得到一個類似這樣的字典:
在學(xué)習(xí)過程中有什么不懂得可以加我的
python學(xué)習(xí)交流扣扣qun,784758214
群里有不錯的學(xué)習(xí)視頻教程、開發(fā)工具與電子書籍。
與你分享python企業(yè)當(dāng)下人才需求及怎么從零基礎(chǔ)學(xué)習(xí)好python,和學(xué)習(xí)什么內(nèi)容
payload = {
"username": "
",
"password": "
",
"csrfmiddlewaretoken": "
"
}
請記住,這是這個網(wǎng)站的一個具體案例。雖然這個登錄表單很簡單,但其他網(wǎng)站可能需要我們檢查瀏覽器的請求日志,并找到登錄步驟中應(yīng)該使用的相關(guān)的 key 值和 value 值。
#步驟2:執(zhí)行登錄網(wǎng)站
對于這個腳本,我們只需要導(dǎo)入如下內(nèi)容:
import requests
from lxml import html
##首先,我們要創(chuàng)建 session 對象。這個對象會允許我們保存所有的登錄會話請求。
session_requests = requests.session()
##第二,我們要從該網(wǎng)頁上提取在登錄時所使用的 csrf 標(biāo)記。在這個例子中,我們使用的是 lxml 和 xpath 來提取,我們也可以使用正則表達(dá)式或者其他的一些方法來提取這些數(shù)據(jù)。
login_url = "https://bitbucket.org/account/signin/?next=/"
result = session_requests.get(login_url)
tree = html.fromstring(result.text)
authenticity_token = list(set(tree.xpath("http://input[@name='csrfmiddlewaretoken']/@value")))[0]
更多關(guān)于xpath 和lxml的信息可以在這里找到。
接下來,我們要執(zhí)行登錄階段。在這一階段,我們發(fā)送一個 POST 請求給登錄的 url。我們使用前面步驟中創(chuàng)建的 payload 作為 data 。也可以為該請求使用一個標(biāo)題并在該標(biāo)題中給這個相同的 url 添加一個參照鍵。
result = session_requests.post(
login_url,
data = payload,
headers = dict(referer=login_url)
)
#步驟三:爬取內(nèi)容
現(xiàn)在,我們已經(jīng)登錄成功了,我們將從 bitbucket dashboard 頁面上執(zhí)行真正的爬取操作。
url = 'https://bitbucket.org/dashboard/overview'
result = session_requests.get(
url,
headers = dict(referer = url)
)
為了測試以上內(nèi)容,我們從 bitbucket dashboard 頁面上爬取了項(xiàng)目列表。我們將再次使用 xpath 來查找目標(biāo)元素,清除新行中的文本和空格并打印出結(jié)果。如果一切都運(yùn)行 OK,輸出結(jié)果應(yīng)該是你 bitbucket 賬戶中的 buckets / project 列表。
tree = html.fromstring(result.content)
bucket_elems = tree.findall(".//span[@class='repo-name']/")
bucket_names = [bucket.text_content.replace("n", "").strip() for bucket inbucket_elems]
print bucket_names
你也可以通過檢查從每個請求返回的狀態(tài)代碼來驗(yàn)證這些請求結(jié)果。它不會總是能讓你知道登錄階段是否是成功的,但是可以用來作為一個驗(yàn)證指標(biāo)。
如果你依然在編程的世界里迷茫,可以加入我們的Python學(xué)習(xí)扣qun:784758214,看看前輩們是如何學(xué)習(xí)的。交流經(jīng)驗(yàn)。從基礎(chǔ)的python腳本到web開發(fā)、爬蟲、django、數(shù)據(jù)挖掘等,零基礎(chǔ)到項(xiàng)目實(shí)戰(zhàn)的資料都有整理。送給每一位python的小伙伴!分享一些學(xué)習(xí)的方法和需要注意的小細(xì)節(jié),點(diǎn)擊加入我們的 python學(xué)習(xí)者聚集地
例如:
result.ok # 會告訴我們最后一次請求是否成功
result.status_code # 會返回給我們最后一次請求的狀態(tài)
就是這樣。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
