爬取某小視頻網(wǎng)站的下載鏈接地址批量下載

??? 僅供學(xué)習(xí)必要的都打碼處理了?。?! ?

??? 0x01前言

????? 漆黑的房間只有閃爍的電腦燈光,小明獨(dú)守空房寂寞難耐。只見他注視著電腦屏幕默默掏出了紙巾,擤了一下鼻涕。定睛一看原來是不停的敲打著代碼。

?????? 言歸正傳,開始今天的爬蟲之路。

?????? Today無意中打開了一個有意思的小網(wǎng)站,里面有一群敬業(yè)的小姐姐,即便是衣衫襤褸、寸無遮攔也要堅(jiān)持自己的表演。為了這群敬業(yè)的小姐姐,決定安排一下。

?????? 0x02爬蟲環(huán)境

?????? Python3.7使用到庫requests、json、re、bs4 、http.cookiejar

?????? 0x03模擬登陸并記錄cookie

?????? 我們要模擬用戶登陸首先要知道怎么和服務(wù)器“溝通”的,給服務(wù)器說了什么才能讓他放我進(jìn)去。我喜歡用burpsuite抓包,當(dāng)然也可以用瀏覽器的開發(fā)者選項(xiàng)查看交互過程。


從抓的包上來看,登陸采用POST方法,傳入的參數(shù)也只有username與password以及一個redirect空值。這就簡單了直接使用requests.post就行。登陸后我們可以記錄下cookie的值,下次登陸直接調(diào)用cookie就行。

def login():

??? Session = requests.session() #定義Session,下面就用Session代替requests

??? #因?yàn)樵嫉膕ession.cookies沒有save()方法,所以需要用到cookielib中的方法LWPCookieJar,

??? #這個類實(shí)例化的cookie對象,就可以直接調(diào)用save方法。

??? Session.cookies =cookielib.LWPCookieJar(filename = "Cookies.txt") #保存cookie

??? posturl='這里是登陸post的url'

??? header = {'User-Agent': 'Mozilla/5.0(Windows NT 10.0; Win64; x64; rv:62.0)',

?????????????? 'Referer': '抓包可見'}

??? postdata = {

??????? 'username' : '用戶名',

????????????? 'password' : '密碼',

????????????? 'redirect' : ''

??? }

??? try:

??????? print('123')

??????? r = Session.post(url=posturl,data=postdata,headers=header)

??????? print(f"statusCode ={r.status_code}")

??????? print(f"text = {r.text}")

??????? Session.cookies.save()

??? except Exception as e:

??????? print('[-] info : login fail, pleasetry again ')

??????? exit()

0x04 爬取分頁鏈接

登陸之后發(fā)現(xiàn)首頁有十五個不同小姐姐,這就說明有十五個鏈接可以進(jìn)去。我們先提取出每一頁中的鏈接。

首先還是查看采用的方法,開發(fā)者工具“網(wǎng)絡(luò)“,查看方法。


所以用到的核心代碼是:r = requests.get(url=url+str(pageNumber),headers=headers)

打開開發(fā)者工具,查看代碼。


發(fā)現(xiàn)每張圖片都對應(yīng)有以上標(biāo)記的標(biāo)簽,我們直接使用beautifulSoup提取標(biāo)簽里的內(nèi)容。使用的是a標(biāo)簽,但是a標(biāo)簽很多我們還有匹配class="fly-case-img"才能提取到后面href中的內(nèi)容。所以核心代碼就是:

soup.find_all("a",class_="fly-case-img")[0:]。

匹配之后就是提取herf中的url。整體代碼如下:

url = 'http://*******.net/?page=' #每一個分頁的url格式

??????????? headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0)',

???????????????? ????'Referer': 'http://**********/user/login/'}

??????????? r =

requests.get(url=url+str(pageNumber),headers=headers)

??????????? r.encoding = 'utf-8'

??????????? soup =BeautifulSoup(r.text,'lxml')

??????????? info =soup.find_all("a", class_="fly-case-img")[0:]#提取想要的部分

??????????? #print(info)

??????????? for tag in info:#提取href中的url

??????????????? name = tag['href']

??????????????? print(name)

0x05 提取每個鏈接中的下載地址

由于前面提取的url之后主站后的鏈接,所以在之前要先補(bǔ)全url。

并get補(bǔ)全后的地址.

url = 'http://$#@.net'

??????????????? page = Session.get(url=url+str(name)+'.html',headers=headers)

??????????????? page.encoding = 'utf-8'

一樣的用soup過濾標(biāo)簽,打開源代碼查看對應(yīng)下載地址的標(biāo)簽。


由圖可以看到該下載鏈接存在與一個a標(biāo)簽中,但是整個網(wǎng)頁的a標(biāo)簽很多,但是內(nèi)容存在’mp4’就就這一個a標(biāo)簽,所以可以構(gòu)造核心代碼:

page =Session.get(url=url+str(name)+'.html',headers=headers)

???????????????page.encoding = 'utf-8'

??????????????? soup =BeautifulSoup(page.text,'lxml')

??????????????? infos =soup.find_all("a",href=re.compile("mp4"))[0:]

??????????????????????????? fortag in infos:

???????????????????names = tag['href']

???????????????????print(names)

在這里遇到了一個小小的坑,提取的url地址下載出來沒東西,這就很尷尬,褲子都脫了。接著我就訪問了一下鏈接。


TMD分兩個下載節(jié)點(diǎn),打開源碼看看


發(fā)現(xiàn)爬取的下載鏈接少一個“1“和“2“,原來就http://d.。。。“,真實(shí)的下載地址為http://d1.簡單就在原來的鏈接中加上1。我采用的是字符串拼接。代碼如下:

for tag in infos:

??????????????????? names= tag['href'][31:]

??????????????????? print(names)

??????????????????? withopen('url_heji.txt','a+') as f:

?????????????????????? ?f.write('http://d1.********.top/uploads/mp4/'+names+'\n')

0x06 zip文件下載地址提取

?????? 網(wǎng)站中除了MP4外還有一種壓縮包文件的下載地址。


采用同樣的方法匹配a標(biāo)簽,再匹配href中的“download”;核心代碼如下:

infoss =soup.find_all("a",href=re.compile("download"))[0:]

??????????????? #print(infos)

??????????????? #num =re.search('_src.*href',infos).group()[:-1]

??????????????? for tag in infoss:

??????????????????? namess = tag['href']

??????????????????? print(namess)

??????????????????? withopen('url_heji.txt','a+') as f:

??????????????????????? f.write(namess+'\n')

0x07 結(jié)果展示


不行了營養(yǎng)更不上了??!


附錄:匯總代碼

# coding: utf-8

import os

import requests

import json

import re

from bs4 import BeautifulSoup

import http.cookiejar as cookielib

def login():

???Session = requests.session()

???#因?yàn)樵嫉膕ession.cookies 沒有save()方法,所以需要用到cookielib中的方法LWPCookieJar,

???#這個類實(shí)例化的cookie對象,就可以直接調(diào)用save方法。

???Session.cookies = cookielib.LWPCookieJar(filename ="Cookies.txt")

???posturl='http://****.net/user/login/dologin.html'

???header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64;rv:62.0)',

?????????????? 'Referer': 'http://****.net/user/login/'}

???postdata = {

???????'username' : '用戶名',

????????????? 'password': '密碼',

????????????? 'redirect': ''

???}

???try:

???????print('123')

??????? r= Session.post(url=posturl,data=postdata,headers=header)

???????print(f"statusCode = {r.status_code}")

???????print(f"text = {r.text}")

???????Session.cookies.save()

???except Exception as e:

???????print('[-] info : login fail, please try again ')

???????exit()

def url():

???Session.cookies.load()

???try:

???????for pageNumber in range(1,200):

??????????? print('目前已經(jīng)爬取到第'+str(pageNumber)+'頁'+'\n')

??????????? #Session.cookies.load()

??????????? url = 'http://****.net/?page='

??????????? headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0)',

???????????????????? 'Referer': 'http://****.net/user/login/'}

??????????? r =requests.get(url=url+str(pageNumber),headers=headers)

??????????? r.encoding = 'utf-8'

??????????? soup = BeautifulSoup(r.text,'lxml')

??????????? info = soup.find_all("a",class_="fly-case-img")[0:]

??????????? #print(info)

??????????? for tag in info:

??????????????? name = tag['href']

??????????????? print(name)

??????????????? url = 'http://****.net'

??????????????? page =Session.get(url=url+str(name)+'.html',headers=headers)

??????????????? page.encoding = 'utf-8'

??????????????? soup =BeautifulSoup(page.text,'lxml')

??????????? ????infos =soup.find_all("a",href=re.compile("mp4"))[0:]

??????????????? #print(infos)

??????????????? #num =re.search('_src.*href',infos).group()[:-1]

??????????????? for tag in infos:

??????????????????? names = tag['href'][31:]

??????????????????? print(names)

??????????????????? withopen('url_heji.txt','a+') as f:

??????????????????????? f.write('http://d1.****.top/uploads/mp4/'+names+'\n')

??????????????? infoss =soup.find_all("a",href=re.compile("download"))[0:]

??????????????? #print(infos)

???????????????#num =re.search('_src.*href',infos).group()[:-1]

??????????????? for tag in infoss:

??????????????????? namess = tag['href']

??????????????????? print(namess)

??????????????????? withopen('url_heji.txt','a+') as f:

??????????????????????? f.write(namess+'\n')

???except Exception:

???????print('可能遇一些問題,腳本即將推出運(yùn)行')

???????print('目前已經(jīng)爬取到第'+str(pageNumber)+'頁,下次可從這里繼續(xù)開始')

???????sys.exit()


if __name__ == '__main__':

???#login()

???url()

???#palianjie()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容