日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

如何用 Python + Scrapy 爬取视频?

發(fā)布時(shí)間:2024/9/15 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何用 Python + Scrapy 爬取视频? 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

今天將帶大家簡(jiǎn)單了解Scrapy爬蟲(chóng)框架,并用一個(gè)真實(shí)案例來(lái)演示代碼的編寫和爬取過(guò)程。

一、scrapy簡(jiǎn)介

1. 什么是Scrapy

Scrapy是一個(gè)為了爬取網(wǎng)站數(shù)據(jù),提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應(yīng)用框架,我們只需要實(shí)現(xiàn)少量的代碼,就能夠快速的抓取

Scrapy使用了Twisted異步網(wǎng)絡(luò)框架,可以加快我們的下載速度

http://scrapy-chs.readthedocs.io/zh_CN/1.0/intro/overview.html

異步和非阻塞的區(qū)別

異步:調(diào)用在發(fā)出之后,這個(gè)調(diào)用就直接返回,不管有無(wú)結(jié)果

非阻塞:關(guān)注的是程序在等待調(diào)用結(jié)果時(shí)的狀態(tài),指在不能立刻得到結(jié)果之前,該調(diào)用不會(huì)阻塞當(dāng)前線程

2. Scrapy工作流程

另一種爬蟲(chóng)方式

Scrapy工作流程

Scrapy engine(引擎)總指揮:負(fù)責(zé)數(shù)據(jù)和信號(hào)的在不同模塊間的傳遞scrapy已經(jīng)實(shí)現(xiàn)
Scheduler(調(diào)度器)一個(gè)隊(duì)列,存放引擎發(fā)過(guò)來(lái)的request請(qǐng)求scrapy已經(jīng)實(shí)現(xiàn)
Downloader(下載器)下載把引擎發(fā)過(guò)來(lái)的requests請(qǐng)求,并返回給引擎scrapy已經(jīng)實(shí)現(xiàn)
Spider(爬蟲(chóng))處理引擎發(fā)來(lái)的response,提取數(shù)據(jù),提取url,并交給引擎需要手寫
Item Pipline(管道)處理引擎?zhèn)鬟^(guò)來(lái)的數(shù)據(jù),比如存儲(chǔ)需要手寫
Downloader Middlewares(下載中間件)可以自定義的下載擴(kuò)展,比如設(shè)置代理一般不用手寫
Spider Middlewares(中間件)可以自定義requests請(qǐng)求和進(jìn)行response過(guò)濾一般不用手寫

3. Scrapy入門

#1?創(chuàng)建一個(gè)scrapy項(xiàng)目 scrapy?startproject?mySpider#2?生成一個(gè)爬蟲(chóng) scrapy?genspider?demo?"demo.cn"#3?提取數(shù)據(jù) 完善spider?使用xpath等#4?保存數(shù)據(jù) pipeline中保存數(shù)據(jù)

在命令中運(yùn)行爬蟲(chóng)

scrapy?crawl?qb?????#?qb爬蟲(chóng)的名字

在pycharm中運(yùn)行爬蟲(chóng)

from?scrapy?import?cmdlinecmdline.execute("scrapy?crawl?qb".split())

4. pipline使用

從pipeline的字典形可以看出來(lái),pipeline可以有多個(gè),而且確實(shí)pipeline能夠定義多個(gè)

為什么需要多個(gè)pipeline:

1 可能會(huì)有多個(gè)spider,不同的pipeline處理不同的item的內(nèi)容

2 一個(gè)spider的內(nèi)容可以要做不同的操作,比如存入不同的數(shù)據(jù)庫(kù)中

注意:

1 pipeline的權(quán)重越小優(yōu)先級(jí)越高

2 pipeline中process_item方法名不能修改為其他的名稱

5. 文件目錄結(jié)構(gòu)

文件配置:

setting:

SPIDER_MODULES?=?['st.spiders'] NEWSPIDER_MODULE?=?'st.spiders' LOG_LEVEL?=?'WARNING'?#?這樣設(shè)置可以在運(yùn)行的時(shí)候不打印日志文件 ... #?Obey?robots.txt?rules ROBOTSTXT_OBEY?=?False?#?調(diào)整為false, ... #?Override?the?default?request?headers:?#?頭部信息,反爬 DEFAULT_REQUEST_HEADERS?=?{'user-agent':?'Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/88.0.4324.96?Safari/537.36','Accept':?'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language':?'en', } ... ITEM_PIPELINES?=?{?#?打開(kāi)管道'st.pipelines.StPipeline':?300, }

為了運(yùn)行文件方便:新建start.py(和settings在同一目錄下),

from?scrapy?import?cmdline cmdline.execute('scrapy?crawl?stsp'.split())?#?這里爬蟲(chóng)項(xiàng)目名為stsp

目前是這樣,后面提取數(shù)據(jù)的時(shí)候修改對(duì)應(yīng)文件 .

二、頁(yè)面分析

第一頁(yè)url:https://699pic.com/video-sousuo-0-18-0-0-0-1-4-popular-0-0-0-0-0-0.html

url規(guī)律:

url?=?'https://699pic.com/video-sousuo-0-18-0-0-0-{}-4-popular-0-0-0-0-0-0.html'.format(i)

通過(guò)分析頁(yè)面知道視頻數(shù)據(jù)在li里面,如圖所示.現(xiàn)在問(wèn)題就簡(jiǎn)單了。

二、解析數(shù)據(jù)

def?parse(self,?response):#?global?count#?count?+=?1#?print(response)liList?=?response.xpath('//li')?#?獲取所有的li,后面提取有用的print(len(liList))?#?76(然后分析可知,第11個(gè)到第70個(gè)是我們需要的數(shù)據(jù))newfolderName?=?'page{}'.format(count)?#?文件夾的名字page1,page2,....#?步驟二?創(chuàng)建一個(gè)新的文件夾?保存每頁(yè)的視頻if?not?os.path.exists(newfolderName):os.mkdir(newfolderName)for?li?in?liList[10:-6]:video_link?=?li.xpath("./a/div/video/@data-original").extract_first()videoLink?=?'https:'?+?video_link?#?url拼接title?=?li.xpath("./a[2]/h3/text()").extract_first()#?下載數(shù)據(jù):res?=?requests.get(videoLink,headers=headers)data?=?res.contenttry:with?open(newfolderName?+?'/'?+?title?+?'.mp4','wb')?as?f:f.write(data)print('%s下載成功'%title)except:break

三、文件配置

items:

import?scrapy class?StItem(scrapy.Item):#?define?the?fields?for?your?item?here?like:#?和兩個(gè)對(duì)應(yīng)前面的數(shù)據(jù)videoLink?=?scrapy.Field()title?=?scrapy.Field()#?pass

設(shè)置好items文件后需要在爬蟲(chóng)文件(stsp.py)頭部添加如下代碼:

from?st.items?import?StItem?#?這個(gè)要設(shè)置根目錄文件即st

然后調(diào)整stsp文件:

item?=?StItem(videoLink=videoLink,title=title)yield?item?#?這里必須使用yield,如果使用return最后在管道中只能得到一個(gè)文件

piplines:

#?前面的注釋代碼 from?itemadapter?import?ItemAdapter import?csvclass?StPipeline:def?__init__(self):#?打開(kāi)文件,指定方式為寫,利用第3個(gè)參數(shù)把csv寫數(shù)據(jù)時(shí)產(chǎn)生的空行消除self.f?=?open('Sp.csv','w',encoding='utf-8',newline='')#?設(shè)置文件第一行的字段名,注意要跟spider傳過(guò)來(lái)的字典key名稱相同self.file_name?=?['title',?'videoLink']#?指定文件的寫入方式為csv字典寫入,參數(shù)1為指定具體文件,參數(shù)2為指定字段名self.writer?=?csv.DictWriter(self.f,?fieldnames=self.file_name)#?寫入第一行字段名,因?yàn)橹灰獙懭胍淮?#xff0c;所以文件放在__init__里面self.writer.writeheader()def?process_item(self,?item,?spider):#?寫入spider傳過(guò)來(lái)的具體數(shù)值self.writer.writerow(dict(item))?#?這里的item是上面創(chuàng)建出來(lái)的實(shí)例對(duì)象,需要轉(zhuǎn)換成dict#?寫入完返回return?itemdef?close_spider(self,spider):self.f.close()

四、批量爬取

next_url?=?'https://699pic.com/video-sousuo-0-18-0-0-0-{}-4-popular-0-0-0-0-0-0.html'.format(count)?#?這里的count是初始化的全局變量count,每次執(zhí)行數(shù)據(jù)解析,就讓他+1 request?=?scrapy.Request(next_url) yield?request

最后運(yùn)行程序:

csv文件:

page2.mp4文件:

代碼下載

Scrapy 爬取視頻源碼

鏈接:https://pan.baidu.com/s/1hmNBwdfNWd7gM795x5ivfg 提取碼:kxpy

推薦閱讀

Pandas處理數(shù)據(jù)太慢,來(lái)試試Polars吧!

懶人必備!只需一行代碼,就能導(dǎo)入所有的Python庫(kù)

絕!關(guān)于pip的15個(gè)使用小技巧

介紹10個(gè)常用的Python內(nèi)置函數(shù),99.99%的人都在用!

可能是全網(wǎng)最完整的 Python 操作 Excel庫(kù)總結(jié)!

總結(jié)

以上是生活随笔為你收集整理的如何用 Python + Scrapy 爬取视频?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。