久久精品国产亚洲高清|精品日韩中文乱码在线|亚洲va中文字幕无码久|伊人久久综合狼伊人久久|亚洲不卡av不卡一区二区|精品久久久久久久蜜臀AV|国产精品19久久久久久不卡|国产男女猛烈视频在线观看麻豆

    1. <style id="76ofp"></style>

      <style id="76ofp"></style>
      <rt id="76ofp"></rt>
      <form id="76ofp"><optgroup id="76ofp"></optgroup></form>
      1. 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

        手機(jī)站
        千鋒教育

        千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

        千鋒教育

        掃一掃進(jìn)入千鋒手機(jī)站

        領(lǐng)取全套視頻
        千鋒教育

        關(guān)注千鋒學(xué)習(xí)站小程序
        隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

        當(dāng)前位置:首頁(yè)  >  技術(shù)干貨  > 20天學(xué)會(huì)爬蟲之Scrapy框架Spider類(案例:披荊斬棘的哥哥)

        20天學(xué)會(huì)爬蟲之Scrapy框架Spider類(案例:披荊斬棘的哥哥)

        來(lái)源:千鋒教育
        發(fā)布人:qyf
        時(shí)間: 2022-09-19 17:59:40 1663581580

          Spider是什么?

          • Spider是一個(gè)Scrapy提供的基本類,Scrapy中包含的其他基本類(例如CrawlSpider)以及自定義的spider都必須繼承這個(gè)類。

          • Spider是定義如何抓取某個(gè)網(wǎng)站的類,包括如何執(zhí)行抓取以及如何從其網(wǎng)頁(yè)中提取結(jié)構(gòu)化數(shù)據(jù)。

          源碼如下:

          所有爬蟲的基類,用戶定義的爬蟲必須從這個(gè)類繼承

          class Spider(object_ref):

          #name是spider最重要的屬性,而且是必須的。一般做法是以該網(wǎng)站(domain)(加或不加 后綴 )來(lái)命名spider。 例如,如果spider爬取 mywebsite.com ,該spider通常會(huì)被命名為 mywebsite

          name = None

          #初始化,提取爬蟲名字,start_ruls

          def __init__(self, name=None, **kwargs):

          #判斷是否存在爬蟲名字name,沒(méi)有則會(huì)報(bào)錯(cuò)

          if name is not None:

          self.name = name

          elif not getattr(self, 'name', None):

          raise ValueError("%s must have a name" % type(self).__name__)

          # python對(duì)象或類型通過(guò)內(nèi)置成員__dict__來(lái)存儲(chǔ)成員信息

          self.__dict__.update(kwargs)

          #判斷是否存在start_urls列表,從列表中獲取到頁(yè)面的URL開(kāi)始請(qǐng)求,后續(xù)的URL將會(huì)從獲取到的數(shù)據(jù)中提取。

          if not hasattr(self, 'start_urls'):

          self.start_urls = []

          # Scrapy執(zhí)行后的日志信息

          def log(self, message, level=log.DEBUG, **kw):

          log.msg(message, spider=self, level=level, **kw)

          # 判斷對(duì)象object的屬性是否存在,不存在則做斷言處理

          def set_crawler(self, crawler):

          assert not hasattr(self, '_crawler'), "Spider already bounded to %s" % crawler

          self._crawler = crawler

          @property

          def crawler(self):

          assert hasattr(self, '_crawler'), "Spider not bounded to any crawler"

          return self._crawler

          @property

          def settings(self):

          return self.crawler.settings

          #該方法將讀取start_urls內(nèi)的地址,并為每一個(gè)地址生成一個(gè)Request對(duì)象,交給Scrapy下載并返回Response

          #注意:該方法僅調(diào)用一次

          def start_requests(self):

          for url in self.start_urls:

          # 生成Request對(duì)象的函數(shù)

          yield self.make_requests_from_url(url)

          #Request對(duì)象默認(rèn)的回調(diào)函數(shù)為parse(),提交的方式為get

          def make_requests_from_url(self, url):

          return Request(url, dont_filter=True)

          #默認(rèn)的Request對(duì)象回調(diào)函數(shù),處理返回的response。

          #生成Item或者Request對(duì)象。用戶需要自己重寫該方法中的內(nèi)容

          def parse(self, response):

          raise NotImplementedError

          @classmethod

          def handles_request(cls, request):

          return url_is_from_spider(request.url, cls)

          def __str__(self):

          return "<%s %r at 0x%0x>" % (type(self).__name__, self.name, id(self))

              __repr__ = __str__

          因此可以總結(jié)出Scrapy爬取數(shù)據(jù)的過(guò)程如下:

          Spider的入口方法(start_requests())請(qǐng)求start_urls列表中定義的url,返回Request對(duì)象(同時(shí)默認(rèn)傳給它一個(gè)名為parse的回調(diào)函數(shù))。

          下載器獲取Respose后,回調(diào)函數(shù)會(huì)解析Reponse,返回(yield)的結(jié)果可能是字典、Item或是Request對(duì)象,亦或是這些對(duì)象組成的可迭代類型。其中,返回的Request也會(huì)包含一個(gè)回調(diào)函數(shù),并在被下載之后被回調(diào)函數(shù)處理(即重復(fù)第2步)。

          解析數(shù)據(jù)可以使用Scrapy自帶的Selectors工具或者lxml、BeautifulSoup等模塊。

          最后Scrapy將返回的數(shù)據(jù)字典(或是Item對(duì)象)保存為文件或者保存在數(shù)據(jù)庫(kù)中。

          scrapy.spider.Spider類介紹

          常用類屬性

          • name:是字符串。標(biāo)識(shí)了每一個(gè)spider的名字,必須定義且唯一。實(shí)際中我們一般為每個(gè)獨(dú)立網(wǎng)站創(chuàng)建一個(gè)spider。

          • starturl:是包含初始請(qǐng)求頁(yè)面url的列表,必須定義。`startrequests()方法會(huì)引用該屬性,發(fā)出初始的Request`。

          • custom_settings:是一個(gè)字典,每一條鍵值對(duì)表示一個(gè)配置,可用于覆寫SETTINGS(Scrapy的全局配置模塊,位于settings.py文件中)。

          •

          – 例1:custom_settings = {'COOKIES_ENABLED': True,'ROBOTSTXT_OBEY': False}。覆蓋了全局屬性COOKIES_ENABLED。

          – 擴(kuò)展:設(shè)置settings中的值的幾種方法,優(yōu)先級(jí)從高到低如下:

          命令行選項(xiàng)

          custom_settings

          settings.py文件

          命令行的默認(rèn)設(shè)置,每一個(gè)命令行都有它自己的默認(rèn)設(shè)置

          默認(rèn)的全局設(shè)置,被定義在 scrapy.settings.default_settings 中

          • allowed_domains:是一個(gè)字符串列表。規(guī)定了允許爬取的網(wǎng)站域名,非域名下的網(wǎng)頁(yè)將被自動(dòng)過(guò)濾。

          •

          – 例1:allowed_domains = cnblogs.com,start_url = 'https://www.zhihu.com'。在這個(gè)例子中,知乎不屬于CSDN的域名,因此爬取過(guò)程中會(huì)被過(guò)濾。

          • crawler:是一個(gè)Crawler對(duì)象。可以通過(guò)它訪問(wèn)Scrapy的一些組件(例如:extensions, middlewares, settings)。

          •

          – 例1:spider.crawler.settings.getbool('xxx')。這個(gè)例子中我們通過(guò)crawler訪問(wèn)到了全局屬性。

          • settings:是一個(gè)Settings對(duì)象。它包含運(yùn)行中時(shí)的Spider的配置。這和我們使用spider.crawler.settings訪問(wèn)是一樣的。

          • logger:是一個(gè)Logger對(duì)象。根據(jù)Spider的name創(chuàng)建的,它記錄了事件日志。

          常用方法

          • start_requests:該方法是Spider的入口方法。默認(rèn)下,該方法會(huì)請(qǐng)求start_url中定義的url,返回對(duì)應(yīng)的Request,如果該方法被重寫,可以返回包含Request(作為第一個(gè)請(qǐng)求)的可迭代對(duì)象或者是FormRequest對(duì)象,一般POST請(qǐng)求重寫該方法。

          • parse:當(dāng)其他的Request沒(méi)有指定回調(diào)函數(shù)時(shí),用于處理下載響應(yīng)的默認(rèn)回調(diào),主要作用:負(fù)責(zé)解析返回的網(wǎng)頁(yè)數(shù)據(jù)(response.body),提取結(jié)構(gòu)化數(shù)據(jù)(生成item)生成需要下一頁(yè)的URL請(qǐng)求。。該方法用于編寫解析網(wǎng)頁(yè)的具體邏輯(包含解析數(shù)據(jù),或是解析出新的頁(yè)面),所以此方法非常重要哦!。

          Spider案例:披荊斬棘的哥哥評(píng)論

          最近被披荊斬棘的哥哥所吸引,但是還是要為大家做好服務(wù),每天更新文章啊!介紹下這個(gè)綜藝節(jié)目哈。

          《披荊斬棘的哥哥》是芒果TV推出的全景音樂(lè)競(jìng)演綜藝。節(jié)目嘉賓們彼此挑戰(zhàn),披荊斬棘,通過(guò)男人之間的彼此探索、家族建立的進(jìn)程,詮釋“滾燙的人生永遠(yuǎn)發(fā)光”,見(jiàn)證永不隕落的精神力。

          我們本次使用Scrapy爬取哥哥們的評(píng)論。

        Picture

          分析思路:

          打開(kāi)谷歌瀏覽器,訪問(wèn)第01期的鏈接(https://www.mgtv.com/b/367750/13107580.html),把JavaScript加載關(guān)掉,刷新,發(fā)現(xiàn)底下的評(píng)論數(shù)據(jù)沒(méi)有了,說(shuō)明這數(shù)據(jù)是異步加載的,在這個(gè)網(wǎng)頁(yè)鏈接的源代碼里是找不到評(píng)論數(shù)據(jù)的;

          既然是異步加載,那么就要抓包了。把剛剛關(guān)掉的JavaScript打開(kāi),重新加載網(wǎng)頁(yè),右鍵檢查,Network, 數(shù)據(jù)一般都在XHR或者JS里面,所以先把這兩項(xiàng)勾選了,這時(shí)候點(diǎn)擊評(píng)論的下一頁(yè),發(fā)現(xiàn)數(shù)據(jù)就在JS里面:

        Picture(1)

        Picture(2)

          由上面評(píng)論的真實(shí)鏈接可以知道,評(píng)論真實(shí)的請(qǐng)求網(wǎng)址是:“https://comment.mgtv.com/v4/comment/getCommentList?”,后面跟著一系列的參數(shù)(callback, _support, subjectType, subjectId, page, _),可見(jiàn):

        Picture(3)

          我們知道page是頁(yè)碼數(shù),subjectId是s每個(gè)視頻對(duì)應(yīng)的id,callback回調(diào)函數(shù),最后一個(gè)大膽猜測(cè)下就是unix時(shí)間戳后面再加上3位隨機(jī)數(shù)(或者unix時(shí)間戳乘以1000再取整),應(yīng)該只起一個(gè)占位的作用,可能是一個(gè)完全沒(méi)用的參數(shù),只是用來(lái)嚇唬我們的。

          但是不確定,我們來(lái)看一下,于是我去掉最后一個(gè)參數(shù)在瀏覽器發(fā)出了一下請(qǐng)求,結(jié)果如下:

        Picture(4)

          說(shuō)明就是一個(gè)完全沒(méi)用的參數(shù),哈哈哈用來(lái)嚇唬我們的,不要怕!我們不用它。

          鏈接有了之后我們就開(kāi)始創(chuàng)建爬蟲項(xiàng)目啦!

          首先打開(kāi)命令行,輸入:

          scrapy startproject mongotv_comments_crawler

          生成新的mongotvcommentscrawler項(xiàng)目,再輸入:

          cd mongotv_comments_crawler

          scrapy genspider mgtv_crawl mgtv.com

          生成爬蟲名。

          然后,用PyCharm打開(kāi)項(xiàng)目。由于最后爬取到的是json數(shù)據(jù),我們直接解析Json數(shù)據(jù),并返回到Items中。

          因此在爬蟲文件mgtv_crawl.py的MgtvCrawlSpider類中,進(jìn)行如下定義:

          class MgtvCrawlSpider(scrapy.Spider):

          name = 'mgtv_crawl'

          allowed_domains = ['mgtv.com']

          # start_urls = ['http://mgtv.com/'] 因?yàn)槲覀兠看味夹枰獦?gòu)建芒果TV的請(qǐng)求,所以我們重寫start_requests方法

          subject_id = 4327535 # 視頻的id

          pages = list(range(1, 100)) # 需要爬取的評(píng)論頁(yè)數(shù)比如100頁(yè)

          因?yàn)槲覀円廊《囗?yè)的內(nèi)容,所以我們要不斷修改page參數(shù),所以我們重寫start_requests方法

          def start_requests(self): # 重寫start_requests

          start_urls = [f'https://comment.mgtv.com/v4/comment/getCommentList?page={page}&subjectType=hunantv2014&subjectId={self.subject_id}&callback=jQuery18204988030991528978_1630030396693&_support=10000000&_=1630030399968' for page in self.pages]

          # 生成所有需要爬取的url保存進(jìn)start_urls

          for url in start_urls: # 遍歷start_urls發(fā)出請(qǐng)求

          yield Request(url)

          然后重寫parse()函數(shù),獲取json結(jié)果。但是json結(jié)果前面有下圖一樣的前綴內(nèi)容,我們要去掉

        Picture(5)

          def parse(self, response):

          text = response.text[response.text.find('{'):-1] # 通過(guò)字符串選取的方式把"jQuery...()去掉"

          json_data = json.loads(text) # 轉(zhuǎn)換成json格式

          for i in json_data['data']['list']: # 遍歷每頁(yè)的評(píng)論列表

          item = MongotvCommentsCrawlerItem()

          item['content'] = i['content']

          item['commentId'] = i['commentId']

          item['createTime'] = i['createTime']

          item['nickName'] = i['user']['nickName']

          yield item

          編寫item,獲取評(píng)論的:內(nèi)容、創(chuàng)建時(shí)間、用戶名和評(píng)論ID

          class MongotvCommentsCrawlerItem(scrapy.Item):

          # define the fields for your item here like:

          # name = scrapy.Field()

          content = scrapy.Field()

          createTime = scrapy.Field()

          nickName = scrapy.Field()

          commentId = scrapy.Field()

          然后便是寫pipelines.py文件,把爬取回來(lái)的items入庫(kù)

          import pymysql

          class MongotvCommentsCrawlerPipeline(object):

          def __init__(self):

          self.conn = pymysql.connect(host='127.0.0.1', user='root', password='root',

          db='mgtv', charset='utf8')

          def process_item(self, item, spider):

          commentId = item["commentId"]

          content = item['content']

          createTime = item['createTime']

          nickName = item["nickName"]

          sql = "insert into comments(commentId,content,createTime,nickName) values(" + str(commentId) + ",'" + content + "','" + createTime + "','" + nickName + "');"

          self.conn.query(sql)

          self.conn.commit()

          return item

          def close_spider(self, spider):

          self.conn.close()

          在settings.py中開(kāi)啟對(duì)應(yīng)的設(shè)置項(xiàng):

        Picture(6)

        Picture(7)

        Picture(8)

          開(kāi)啟爬蟲進(jìn)行爬?。?/p>

          scrapy crawl mgtv_crawl

          爬取到的結(jié)果如下:

        Picture(9)

        tags:
        聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
        10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
        請(qǐng)您保持通訊暢通,專屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
        免費(fèi)領(lǐng)取
        今日已有369人領(lǐng)取成功
        劉同學(xué) 138****2860 剛剛成功領(lǐng)取
        王同學(xué) 131****2015 剛剛成功領(lǐng)取
        張同學(xué) 133****4652 剛剛成功領(lǐng)取
        李同學(xué) 135****8607 剛剛成功領(lǐng)取
        楊同學(xué) 132****5667 剛剛成功領(lǐng)取
        岳同學(xué) 134****6652 剛剛成功領(lǐng)取
        梁同學(xué) 157****2950 剛剛成功領(lǐng)取
        劉同學(xué) 189****1015 剛剛成功領(lǐng)取
        張同學(xué) 155****4678 剛剛成功領(lǐng)取
        鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
        董同學(xué) 138****2867 剛剛成功領(lǐng)取
        周同學(xué) 136****3602 剛剛成功領(lǐng)取
        相關(guān)推薦HOT
        Visual Studio Online和GitHub有什么區(qū)別?

        1.定位不同Visual Studio Online,現(xiàn)更名為Visual Studio Codespaces,是微軟提供的一款在線開(kāi)發(fā)環(huán)境,允許開(kāi)發(fā)者在云端進(jìn)行編程和調(diào)試工作。而...詳情>>

        2023-10-15 00:21:42
        什么是域控制器?

        一、域控制器的定義域控制器是指在Windows Server操作系統(tǒng)中部署Active Directory服務(wù)的服務(wù)器。Active Directory是微軟公司開(kāi)發(fā)的目錄服務(wù),用...詳情>>

        2023-10-15 00:10:28
        深度學(xué)習(xí)模型權(quán)重h5、weights、ckpt、pth有什么區(qū)別?

        1.來(lái)源框架不同h5格式通常用于Keras和TensorFlow框架,weights用于Darknet框架,ckpt是TensorFlow框架的一種格式,而pth則主要用于PyTorch框架...詳情>>

        2023-10-15 00:05:17
        大數(shù)據(jù)測(cè)試工程師需要具備哪些技能?

        一、理解大數(shù)據(jù)概念大數(shù)據(jù)測(cè)試工程師需要理解大數(shù)據(jù)的基本概念和原理,如分布式存儲(chǔ)、MapReduce、實(shí)時(shí)計(jì)算等。他們還需要了解如何處理大規(guī)模的...詳情>>

        2023-10-14 23:43:03
        為什么SpringBoot的 jar 可以直接運(yùn)行?

        一、JAR文件的結(jié)構(gòu)與執(zhí)行方式Spring Boot的JAR包是Java Archive的縮寫,它是一種壓縮文件格式,可以將Java項(xiàng)目的類文件、資源文件以及依賴庫(kù)等...詳情>>

        2023-10-14 23:01:49
        快速通道
        太康县| 兴仁县| 昭平县| 明光市| 新沂市| 滕州市| 黄冈市| 福泉市| 嫩江县| 汝城县| 溆浦县| 鄂温| 余庆县| 平果县| 罗甸县| 河间市| 哈巴河县| 黔南| 临汾市| 阳信县| 如皋市| 呼和浩特市| 丹江口市| 福海县| 福建省| 仪征市| 镇赉县| 潮安县| 顺昌县| 彭山县| 汤阴县| 湖北省| 惠安县| 泽州县| 武定县| 呼和浩特市| 迭部县| 宿迁市| 铜陵市| 湟中县| 犍为县|