<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何用 Python + Scrapy 爬取視頻?

          共 7170字,需瀏覽 15分鐘

           ·

          2021-07-04 07:55


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

          一、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)用就直接返回,不管有無結(jié)果

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

          2. Scrapy工作流程

          另一種爬蟲方式

          Scrapy工作流程

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

          3. Scrapy入門

          #1 創(chuàng)建一個(gè)scrapy項(xiàng)目
          scrapy startproject mySpider

          #2 生成一個(gè)爬蟲
          scrapy genspider demo "demo.cn"

          #3 提取數(shù)據(jù)
          完善spider 使用xpath等

          #4 保存數(shù)據(jù)
          pipeline中保存數(shù)據(jù)

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

          scrapy crawl qb     # qb爬蟲的名字

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

          from scrapy import cmdline

          cmdline.execute("scrapy crawl qb".split())

          4. pipline使用

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

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

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

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

          注意:

          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 = { # 打開管道
             'st.pipelines.StPipeline'300,
          }

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

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

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

          二、頁面分析

          第一頁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)

          通過分析頁面知道視頻數(shù)據(jù)在li里面,如圖所示.現(xià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è)新的文件夾 保存每頁的視頻
              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.content
                         
                  try:
                      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文件后需要在爬蟲文件(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 csv

          class StPipeline:
              def __init__(self):
                  # 打開文件,指定方式為寫,利用第3個(gè)參數(shù)把csv寫數(shù)據(jù)時(shí)產(chǎn)生的空行消除
                  self.f = open('Sp.csv','w',encoding='utf-8',newline='')
                  # 設(shè)置文件第一行的字段名,注意要跟spider傳過來的字典key名稱相同
                  self.file_name = ['title''videoLink']
                  # 指定文件的寫入方式為csv字典寫入,參數(shù)1為指定具體文件,參數(shù)2為指定字段名
                  self.writer = csv.DictWriter(self.f, fieldnames=self.file_name)
                  # 寫入第一行字段名,因?yàn)橹灰獙懭胍淮?,所以文件放在__init__里面
                  self.writer.writeheader()

              def process_item(self, item, spider):
                  # 寫入spider傳過來的具體數(shù)值
                  self.writer.writerow(dict(item)) # 這里的item是上面創(chuàng)建出來的實(shí)例對(duì)象,需要轉(zhuǎn)換成dict
                  # 寫入完返回
                  return item

              def 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ù)太慢,來試試Polars吧!
          懶人必備!只需一行代碼,就能導(dǎo)入所有的Python庫
          絕!關(guān)于pip的15個(gè)使用小技巧
          介紹10個(gè)常用的Python內(nèi)置函數(shù),99.99%的人都在用!
          可能是全網(wǎng)最完整的 Python 操作 Excel庫總結(jié)!

          瀏覽 81
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  四季AV日韩人妻无码 | 中文字幕亚洲视频 | 国产高清成人a片 | 精品无码一区二区三区四区五区 | 午夜人妻精品理论片中文字幕 |