日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網營銷解決方案
如何用Python+Scrapy爬取視頻?

本文轉載自微信公眾號「快學Python」,作者快快。轉載本文請聯(lián)系快學Python公眾號。

人生苦短,快學Python!

今天將帶大家簡單了解Scrapy爬蟲框架,并用一個真實案例來演示代碼的編寫和爬取過程。

一、scrapy簡介

1. 什么是Scrapy

Scrapy是一個為了爬取網站數據,提取結構性數據而編寫的應用框架,我們只需要實現少量的代碼,就能夠快速的抓取

Scrapy使用了Twisted異步網絡框架,可以加快我們的下載速度

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

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

異步:調用在發(fā)出之后,這個調用就直接返回,不管有無結果

非阻塞:關注的是程序在等待調用結果時的狀態(tài),指在不能立刻得到結果之前,該調用不會阻塞當前線程

2. Scrapy工作流程

另一種爬蟲方式

Scrapy工作流程

Scrapy engine(引擎) 總指揮:負責數據和信號的在不同模塊間的傳遞 scrapy已經實現
Scheduler(調度器)一個隊列,存放引擎發(fā)過來的request請求scrapy已經實現
Downloader(下載器)下載把引擎發(fā)過來的requests請求,并返回給引擎scrapy已經實現
Spider(爬蟲)處理引擎發(fā)來的response,提取數據,提取url,并交給引擎需要手寫
Item Pipline(管道)處理引擎?zhèn)鬟^來的數據,比如存儲需要手寫
Downloader Middlewares(下載中間件)可以自定義的下載擴展,比如設置代理一般不用手寫
Spider Middlewares(中間件)可以自定義requests請求和進行response過濾一般不用手寫

3. Scrapy入門

 
 
 
 
  1. #1 創(chuàng)建一個scrapy項目 
  2. scrapy startproject mySpider 
  3.  
  4. #2 生成一個爬蟲 
  5. scrapy genspider demo "demo.cn" 
  6.  
  7. #3 提取數據 
  8. 完善spider 使用xpath等 
  9.  
  10. #4 保存數據 
  11. pipeline中保存數據 

在命令中運行爬蟲

 
 
 
 
  1. scrapy crawl qb # qb爬蟲的名字 

在pycharm中運行爬蟲

 
 
 
 
  1. from scrapy import cmdline 
  2.  
  3. cmdline.execute("scrapy crawl qb".split()) 

4. pipline使用

從pipeline的字典形可以看出來,pipeline可以有多個,而且確實pipeline能夠定義多個

為什么需要多個pipeline:

1 可能會有多個spider,不同的pipeline處理不同的item的內容

2 一個spider的內容可以要做不同的操作,比如存入不同的數據庫中

注意:

1 pipeline的權重越小優(yōu)先級越高

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

5. 文件目錄結構

文件配置:

setting:

 
 
 
 
  1. SPIDER_MODULES = ['st.spiders'] 
  2. NEWSPIDER_MODULE = 'st.spiders' 
  3. LOG_LEVEL = 'WARNING' # 這樣設置可以在運行的時候不打印日志文件 
  4. ... 
  5. # Obey robots.txt rules 
  6. ROBOTSTXT_OBEY = False # 調整為false, 
  7. ... 
  8. # Override the default request headers: # 頭部信息,反爬 
  9. DEFAULT_REQUEST_HEADERS = { 
  10.     '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', 
  11.   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
  12.   'Accept-Language': 'en', 
  13. ... 
  14. ITEM_PIPELINES = { # 打開管道 
  15.    'st.pipelines.StPipeline': 300, 

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

 
 
 
 
  1. from scrapy import cmdline 
  2. cmdline.execute('scrapy crawl stsp'.split()) # 這里爬蟲項目名為stsp 

目前是這樣,后面提取數據的時候修改對應文件 .

二、頁面分析

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

url規(guī)律:

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

通過分析頁面知道視頻數據在li里面,如圖所示.現在問題就簡單了。

三、解析數據

 
 
 
 
  1. def parse(self, response): 
  2.     # global count 
  3.     # count += 1 
  4.     # print(response) 
  5.     liList = response.xpath('//li') # 獲取所有的li,后面提取有用的 
  6.      
  7.     print(len(liList)) # 76(然后分析可知,第11個到第70個是我們需要的數據) 
  8.      
  9.     newfolderName = 'page{}'.format(count) # 文件夾的名字page1,page2,.... 
  10.     # 步驟二 創(chuàng)建一個新的文件夾 保存每頁的視頻 
  11.     if not os.path.exists(newfolderName): 
  12.         os.mkdir(newfolderName) 
  13.  
  14.     for li in liList[10:-6]: 
  15.         video_link = li.xpath("./a/div/video/@data-original").extract_first() 
  16.         videoLink = 'https:' + video_link # url拼接 
  17.         title = li.xpath("./a[2]/h3/text()").extract_first() 
  18.         # 下載數據: 
  19.         res = requests.get(videoLink,headers=headers) 
  20.         data = res.content 
  21.                 
  22.         try: 
  23.             with open(newfolderName + '/' + title + '.mp4','wb') as f: 
  24.                  f.write(data) 
  25.                  print('%s下載成功'%title) 
  26.         except: 
  27.            break 

四、文件配置

items:

 
 
 
 
  1. import scrapy 
  2. class StItem(scrapy.Item): 
  3.     # define the fields for your item here like: 
  4.     # 和兩個對應前面的數據 
  5.     videoLink = scrapy.Field() 
  6.     title = scrapy.Field() 
  7.     # pass 

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

 
 
 
 
  1. from st.items import StItem # 這個要設置根目錄文件即st 

然后調整stsp文件:

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

piplines:

 
 
 
 
  1. # 前面的注釋代碼 
  2. from itemadapter import ItemAdapter 
  3. import csv 
  4.  
  5. class StPipeline: 
  6.     def __init__(self): 
  7.         # 打開文件,指定方式為寫,利用第3個參數把csv寫數據時產生的空行消除 
  8.         self.f = open('Sp.csv','w',encoding='utf-8',newline='') 
  9.         # 設置文件第一行的字段名,注意要跟spider傳過來的字典key名稱相同 
  10.         self.file_name = ['title', 'videoLink'] 
  11.         # 指定文件的寫入方式為csv字典寫入,參數1為指定具體文件,參數2為指定字段名 
  12.         self.writer = csv.DictWriter(self.f, fieldnames=self.file_name) 
  13.         # 寫入第一行字段名,因為只要寫入一次,所以文件放在__init__里面 
  14.         self.writer.writeheader() 
  15.  
  16.     def process_item(self, item, spider): 
  17.         # 寫入spider傳過來的具體數值 
  18.         self.writer.writerow(dict(item)) # 這里的item是上面創(chuàng)建出來的實例對象,需要轉換成dict 
  19.         # 寫入完返回 
  20.         return item 
  21.  
  22.     def close_spider(self,spider): 
  23.         self.f.close() 

五、批量爬取

 
 
 
 
  1. 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í)行數據解析,就讓他+1 
  2. request = scrapy.Request(next_url) 
  3. yield request 

最后運行程序:

csv文件:

page2.mp4文件:


標題名稱:如何用Python+Scrapy爬取視頻?
本文地址:http://www.5511xx.com/article/dpsddog.html