??? 僅供學(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()