亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python 利用scrapy爬蟲通過短短50行代碼下載整站短視頻

 更新時間:2018年10月29日 10:05:25   作者:馬鳴謙  
近日,有朋友向我求助一件小事兒,他在一個短視頻app上看到一個好玩兒的段子,想下載下來,可死活找不到下載的方法。經(jīng)過我的一番研究才找到解決方法,下面小編給大家分享Python 利用scrapy爬蟲通過短短50行代碼下載整站短視頻的方法,感興趣的朋友一起看看吧

近日,有朋友向我求助一件小事兒,他在一個短視頻app上看到一個好玩兒的段子,想下載下來,可死活找不到下載的方法。這忙我得幫,少不得就抓包分析了一下這個app,找到了視頻的下載鏈接,幫他解決了這個小問題。

因為這個事兒,勾起了我另一個念頭,這不最近一直想把python爬蟲方面的知識梳理梳理嗎,干脆借機行事,正湊著短視頻火熱的勢頭,做一個短視頻的爬蟲好了,中間用到什么知識就理一理。

我喜歡把事情說得很直白,如果恰好有初入門的朋友想了解爬蟲的技術,可以將就看看,或許對你的認識會有提升。如果有高手路過,最好能指點一二,本人不勝感激。

一、撕開爬蟲的面紗——爬蟲是什么,它能做什么

爬蟲是什么

爬蟲就是一段能夠從互聯(lián)網(wǎng)上高效獲取數(shù)據(jù)的程序。

我們每天都在從互聯(lián)網(wǎng)上獲取數(shù)據(jù)。當打開瀏覽器訪問百度的時候,我們就從百度的服務器獲取數(shù)據(jù),當拿起手機在線聽歌的時候,我們就從某個app的服務器上獲取數(shù)據(jù)。簡單的歸納,這些過程都可以描述為:我們提交一個Request請求,服務器會返回一個Response數(shù)據(jù),應用根據(jù)Response來渲染頁面,給我們展示數(shù)據(jù)結果。

爬蟲最核心的也是這個過程,提交Requests——〉接受Response。就這樣,很簡單,當我們在瀏覽器里打開一個頁面,看到頁面內(nèi)容的時候,我們就可以說這個頁面被我們采集到了。

只不過當我們真正進行數(shù)據(jù)爬取時,一般會需要采集大量的頁面,這就需要提交許多的Requests,需要接受許多的Response。數(shù)量大了之后,就會涉及到一些比較復雜的處理,比如并發(fā)的,比如請求序列,比如去重,比如鏈接跟蹤,比如數(shù)據(jù)存儲,等等。于是,隨著問題的延伸和擴展,爬蟲就成為了一個相對獨立的技術門類。

但它的本質(zhì)就是對一系列網(wǎng)絡請求和網(wǎng)絡響應的處理。

爬蟲能做什么

爬蟲的作用和目的只有一個,獲取網(wǎng)絡數(shù)據(jù)。我們知道,互聯(lián)網(wǎng)是個數(shù)據(jù)的海洋,大量的信息漂浮在其中,想把這些資源收歸己用,爬蟲是最常用的方式。特別是最近幾年大樹據(jù)挖掘技術和機器學習以及知識圖譜等技術的興盛,更是對數(shù)據(jù)提出了更大的需求。另外也有很多互聯(lián)網(wǎng)創(chuàng)業(yè)公司,在起步初期自身積累數(shù)據(jù)較少的時候,也會通過爬蟲快速獲取數(shù)據(jù)起步。

二、python爬蟲框架scrapy——爬蟲開發(fā)的利器

如果你剛剛接觸爬蟲的概念,我建議你暫時不要使用scrapy框架?;蛘吒鼘挿旱恼f,如果你剛剛接觸某一個技術門類,我都不建議你直接使用框架,因為框架是對許多基礎技術細節(jié)的高級抽象,如果你不了解底層實現(xiàn)原理就直接用框架多半會讓你云里霧里迷迷糊糊。

在入門爬蟲之初,看scrapy的文檔,你會覺得“太復雜了”。當你使用urllib或者Requests開發(fā)一個python的爬蟲腳本,并逐個去解決了請求頭封裝、訪問并發(fā)、隊列去重、數(shù)據(jù)清洗等等問題之后,再回過頭來學習scrapy,你會覺得它如此簡潔優(yōu)美,它能節(jié)省你大量的時間,它會為一些常見的問題提供成熟的解決方案。

scrapy數(shù)據(jù)流程圖

這張圖是對scrapy框架的經(jīng)典描述,一時看不懂沒有關系,用一段時間再回來看?;蛘甙驯疚淖x完再回來看。


在一些書上會把爬蟲的基本抓取流程概括為UR 2 IM,意思是數(shù)據(jù)爬取的過程是圍繞URL、Request(請求)、Response(響應)、Item(數(shù)據(jù)項)、MoreUrl(更多的Url)展開的。上圖的 綠色箭頭 體現(xiàn)的正是這幾個要素的流轉(zhuǎn)過程。圖中涉及的四個模塊正是用于處理這幾類對象的:

  • Spider模塊:負責生成Request對象、解析Response對象、輸出Item對象
  • Scheduler模塊:負責對Request對象的調(diào)度
  • Downloader模塊:負責發(fā)送Request請求,接收Response響應
  • ItemPipleline模塊:負責數(shù)據(jù)的處理
  • scrapy Engine負責模塊間的通信

各個模塊和scrapy引擎之間可以添加一層或多層中間件,負責對出入該模塊的UR 2 IM對象進行處理。

scrapy的安裝

參考官方文檔,不再贅述。官方文檔:https://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/install.html

三、scrapy實戰(zhàn):50行代碼爬取全站短視頻

python的優(yōu)雅之處在于能夠讓開發(fā)者專注于業(yè)務邏輯,花更少的時間在枯燥的代碼編寫調(diào)試上。scrapy無疑完美詮釋了這一精神。

開發(fā)爬蟲的一般步驟是:

  • 確定要爬取的數(shù)據(jù)(item)
  • 找到數(shù)據(jù)所在頁面的url
  • 找到頁面間的鏈接關系,確定如何跟蹤(follow)頁面

那么,我們一步一步來。

既然是使用scrapy框架,我們先創(chuàng)建項目:

scrapy startproject DFVideo

緊接著,我們創(chuàng)建一個爬蟲:

scrapy genspider -t crawl DfVideoSpider eastday.com

這是我們發(fā)現(xiàn)在當前目錄下已經(jīng)自動生成了一個目錄:DFVideo

目錄下包括如圖文件:

spiders文件夾下,自動生成了名為DfVideoSpider.py的文件。

爬蟲項目創(chuàng)建之后,我們來確定需要爬取的數(shù)據(jù)。在items.py中編輯:

import scrapy
class DfvideoItem(scrapy.Item):
 # define the fields for your item here like:
 # name = scrapy.Field()
 video_url = scrapy.Field()#視頻源url
 video_title = scrapy.Field()#視頻標題
 video_local_path = scrapy.Field()#視頻本地存儲路徑

接下來,我們需要確定視頻源的url,這是很關鍵的一步。

現(xiàn)在許多的視頻播放頁面是把視頻鏈接隱藏起來的,這就使得大家無法通過右鍵另存為,防止了視頻別隨意下載。

但是只要視頻在頁面上播放了,那么必然是要和視頻源產(chǎn)生數(shù)據(jù)交互的,所以只要稍微抓下包就能夠發(fā)現(xiàn)玄機。

這里我們使用fiddler抓包分析。

發(fā)現(xiàn)其視頻播放頁的鏈接類似于:video.eastday.com/a/180926221513827264568.html?index3lbt

視頻源的數(shù)據(jù)鏈接類似于:mvpc.eastday.com/vyule/20180415/20180415213714776507147_1_06400360.mp4

有了這兩個鏈接,工作就完成了大半:

在DfVideoSpider.py中編輯

# -*- coding: utf-8 -*-
import scrapy
from scrapy.loader import ItemLoader
from scrapy.loader.processors import MapCompose,Join
from DFVideo.items import DfvideoItem
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
import time
from os import path
import os

class DfvideospiderSpider(CrawlSpider):
 name = 'DfVideoSpider'
 allowed_domains = ['eastday.com']
 start_urls = ['http://video.eastday.com/']

 rules = (
  Rule(LinkExtractor(allow=r'video.eastday.com/a/\d+.html'),
    callback='parse_item', follow=True),
 )

 def parse_item(self, response):
  item = DfvideoItem()
  try:
   item["video_url"] = response.xpath('//input[@id="mp4Source"]/@value').extract()[0]
   item["video_title"] = response.xpath('//meta[@name="description"]/@content').extract()[0]
   #print(item)
   item["video_url"] = 'http:' + item['video_url']
   yield scrapy.Request(url=item['video_url'], meta=item, callback=self.parse_video)
  except:
   pass

 def parse_video(self, response):

  i = response.meta
  file_name = Join()([i['video_title'], '.mp4'])
  base_dir = path.join(path.curdir, 'VideoDownload')
  video_local_path = path.join(base_dir, file_name.replace('?', ''))
  i['video_local_path'] = video_local_path

  if not os.path.exists(base_dir):
   os.mkdir(base_dir)

  with open(video_local_path, "wb") as f:
   f.write(response.body)

  yield i

至此,一個簡單但強大的爬蟲便完成了。

如果你希望將視頻的附加數(shù)據(jù)保存在數(shù)據(jù)庫,可以在pipeline.py中進行相應的操作,比如存入mongodb中:

from scrapy import log
import pymongo
class DfvideoPipeline(object):
 def __init__(self):
  self.mongodb = pymongo.MongoClient(host='127.0.0.1', port=27017)
  self.db = self.mongodb["DongFang"]
  self.feed_set = self.db["video"]
  # self.comment_set=self.db[comment_set]
  self.feed_set.create_index("video_title", unique=1)
  # self.comment_set.create_index(comment_index,unique=1)
 def process_item(self, item, spider):
  try:
   self.feed_set.update({"video_title": item["video_title"]}, item, upsert=True)
  except:
   log.msg(message="dup key: {}".format(item["video_title"]), level=log.INFO)
  return item
 def on_close(self):
  self.mongodb.close()

當然,你需要在setting.py中將pipelines打開:

ITEM_PIPELINES = {
 'TouTiaoVideo.pipelines.ToutiaovideoPipeline': 300,
}

四、執(zhí)行結果展示

視頻文件:

五、最后

以上所述是小編給大家介紹的Python 利用scrapy爬蟲通過短短50行代碼下載整站短視頻,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關文章

  • 一文詳解凱撒密碼的原理及Python實現(xiàn)

    一文詳解凱撒密碼的原理及Python實現(xiàn)

    凱撒密碼是古羅馬愷撒大帝用來對軍事情報進行加密的算法,它采用了替換方法對信息中的每一個英文字符循環(huán)替換為字母表序列該字符后面第三個字符。本文主要為大家講解了凱撒密碼的原理及實現(xiàn),需要的可以參考一下
    2022-08-08
  • python分析網(wǎng)頁上所有超鏈接的方法

    python分析網(wǎng)頁上所有超鏈接的方法

    這篇文章主要介紹了python分析網(wǎng)頁上所有超鏈接的方法,涉及Python使用urllib模塊操作頁面超鏈接的技巧,需要的朋友可以參考下
    2015-05-05
  • python中解析json格式文件的方法示例

    python中解析json格式文件的方法示例

    這篇文章主要給大家介紹了python中解析json格式文件的相關資料,解析json文件就是編碼和解碼,本文還介紹了在解析中可能遇到的問題與解決方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-05-05
  • python爬蟲刷訪問量 2019 7月

    python爬蟲刷訪問量 2019 7月

    這篇文章主要介紹了python爬蟲刷訪問量 2019 7月,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • python如何實現(xiàn)質(zhì)數(shù)求和

    python如何實現(xiàn)質(zhì)數(shù)求和

    這篇文章主要介紹了python如何實現(xiàn)質(zhì)數(shù)求和,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • django restframework使用redis實現(xiàn)token認證

    django restframework使用redis實現(xiàn)token認證

    本文主要介紹了django restframework使用redis實現(xiàn)token認證,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 在Django的視圖(View)外使用Session的方法

    在Django的視圖(View)外使用Session的方法

    這篇文章主要介紹了在Django的視圖(View)外使用Session的方法,Django是最具人氣的Python web開發(fā)框架,需要的朋友可以參考下
    2015-07-07
  • Python函數(shù)的參數(shù)類型和使用技巧詳解

    Python函數(shù)的參數(shù)類型和使用技巧詳解

    這篇文章主要介紹了Python函數(shù)的參數(shù)類型和使用技巧詳解,函數(shù)指通過專門的代碼組織,用來實現(xiàn)特定功能的代碼段,具有相對的獨立性,可以被其他代碼重復調(diào)用,需要的朋友可以參考下
    2023-08-08
  • 如何讓PyQt5中QWebEngineView與JavaScript交互

    如何讓PyQt5中QWebEngineView與JavaScript交互

    這篇文章主要介紹了如何讓PyQt5中QWebEngineView與JavaScript交互,幫助大家更好的理解和學習PyQt5框架,感興趣的朋友可以了解下
    2020-10-10
  • Python實現(xiàn)音頻提取的示例詳解

    Python實現(xiàn)音頻提取的示例詳解

    在日常生活中,有好聽的翻唱視頻或音樂視頻可以將其音頻分離保存到網(wǎng)易云或QQ音樂中隨時聽,然而大部分的音頻分離軟件需要下載和安裝,所以本文就來分享一種提取音頻的簡便方法吧
    2023-09-09

最新評論