亚洲 国产精品 日韩-亚洲 激情-亚洲 欧美 91-亚洲 欧美 成人日韩-青青青草视频在线观看-青青青草影院

千鋒教育-做有情懷、有良心、有品質的職業教育機構

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

關注千鋒學習站小程序
隨時隨地免費學習課程

當前位置:首頁  >  技術干貨  > 20天學會爬蟲之Scrapy框架Spider類(案例:披荊斬棘的哥哥)

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

來源:千鋒教育
發布人:qyf
時間: 2022-09-19 17:59:40 1663581580

  Spider是什么?

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

  • Spider是定義如何抓取某個網站的類,包括如何執行抓取以及如何從其網頁中提取結構化數據。

  源碼如下:

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

  class Spider(object_ref):

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

  name = None

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

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

  #判斷是否存在爬蟲名字name,沒有則會報錯

  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對象或類型通過內置成員__dict__來存儲成員信息

  self.__dict__.update(kwargs)

  #判斷是否存在start_urls列表,從列表中獲取到頁面的URL開始請求,后續的URL將會從獲取到的數據中提取。

  if not hasattr(self, 'start_urls'):

  self.start_urls = []

  # Scrapy執行后的日志信息

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

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

  # 判斷對象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內的地址,并為每一個地址生成一個Request對象,交給Scrapy下載并返回Response

  #注意:該方法僅調用一次

  def start_requests(self):

  for url in self.start_urls:

  # 生成Request對象的函數

  yield self.make_requests_from_url(url)

  #Request對象默認的回調函數為parse(),提交的方式為get

  def make_requests_from_url(self, url):

  return Request(url, dont_filter=True)

  #默認的Request對象回調函數,處理返回的response。

  #生成Item或者Request對象。用戶需要自己重寫該方法中的內容

  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__

  因此可以總結出Scrapy爬取數據的過程如下:

  Spider的入口方法(start_requests())請求start_urls列表中定義的url,返回Request對象(同時默認傳給它一個名為parse的回調函數)。

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

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

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

  scrapy.spider.Spider類介紹

  常用類屬性

  • name:是字符串。標識了每一個spider的名字,必須定義且唯一。實際中我們一般為每個獨立網站創建一個spider。

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

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

  •

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

  – 擴展:設置settings中的值的幾種方法,優先級從高到低如下:

  命令行選項

  custom_settings

  settings.py文件

  命令行的默認設置,每一個命令行都有它自己的默認設置

  默認的全局設置,被定義在 scrapy.settings.default_settings 中

  • allowed_domains:是一個字符串列表。規定了允許爬取的網站域名,非域名下的網頁將被自動過濾。

  •

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

  • crawler:是一個Crawler對象。可以通過它訪問Scrapy的一些組件(例如:extensions, middlewares, settings)。

  •

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

  • settings:是一個Settings對象。它包含運行中時的Spider的配置。這和我們使用spider.crawler.settings訪問是一樣的。

  • logger:是一個Logger對象。根據Spider的name創建的,它記錄了事件日志。

  常用方法

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

  • parse:當其他的Request沒有指定回調函數時,用于處理下載響應的默認回調,主要作用:負責解析返回的網頁數據(response.body),提取結構化數據(生成item)生成需要下一頁的URL請求。。該方法用于編寫解析網頁的具體邏輯(包含解析數據,或是解析出新的頁面),所以此方法非常重要哦!。

  Spider案例:披荊斬棘的哥哥評論

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

  《披荊斬棘的哥哥》是芒果TV推出的全景音樂競演綜藝。節目嘉賓們彼此挑戰,披荊斬棘,通過男人之間的彼此探索、家族建立的進程,詮釋“滾燙的人生永遠發光”,見證永不隕落的精神力。

  我們本次使用Scrapy爬取哥哥們的評論。

Picture

  分析思路:

  打開谷歌瀏覽器,訪問第01期的鏈接(https://www.mgtv.com/b/367750/13107580.html),把JavaScript加載關掉,刷新,發現底下的評論數據沒有了,說明這數據是異步加載的,在這個網頁鏈接的源代碼里是找不到評論數據的;

  既然是異步加載,那么就要抓包了。把剛剛關掉的JavaScript打開,重新加載網頁,右鍵檢查,Network, 數據一般都在XHR或者JS里面,所以先把這兩項勾選了,這時候點擊評論的下一頁,發現數據就在JS里面:

Picture(1)

Picture(2)

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

Picture(3)

  我們知道page是頁碼數,subjectId是s每個視頻對應的id,callback回調函數,最后一個大膽猜測下就是unix時間戳后面再加上3位隨機數(或者unix時間戳乘以1000再取整),應該只起一個占位的作用,可能是一個完全沒用的參數,只是用來嚇唬我們的。

  但是不確定,我們來看一下,于是我去掉最后一個參數在瀏覽器發出了一下請求,結果如下:

Picture(4)

  說明就是一個完全沒用的參數,哈哈哈用來嚇唬我們的,不要怕!我們不用它。

  鏈接有了之后我們就開始創建爬蟲項目啦!

  首先打開命令行,輸入:

  scrapy startproject mongotv_comments_crawler

  生成新的mongotvcommentscrawler項目,再輸入:

  cd mongotv_comments_crawler

  scrapy genspider mgtv_crawl mgtv.com

  生成爬蟲名。

  然后,用PyCharm打開項目。由于最后爬取到的是json數據,我們直接解析Json數據,并返回到Items中。

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

  class MgtvCrawlSpider(scrapy.Spider):

  name = 'mgtv_crawl'

  allowed_domains = ['mgtv.com']

  # start_urls = ['http://mgtv.com/'] 因為我們每次都需要構建芒果TV的請求,所以我們重寫start_requests方法

  subject_id = 4327535 # 視頻的id

  pages = list(range(1, 100)) # 需要爬取的評論頁數比如100頁

  因為我們要爬取多頁的內容,所以我們要不斷修改page參數,所以我們重寫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保存進start_urls

  for url in start_urls: # 遍歷start_urls發出請求

  yield Request(url)

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

Picture(5)

  def parse(self, response):

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

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

  for i in json_data['data']['list']: # 遍歷每頁的評論列表

  item = MongotvCommentsCrawlerItem()

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

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

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

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

  yield item

  編寫item,獲取評論的:內容、創建時間、用戶名和評論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文件,把爬取回來的items入庫

  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中開啟對應的設置項:

Picture(6)

Picture(7)

Picture(8)

  開啟爬蟲進行爬取:

  scrapy crawl mgtv_crawl

  爬取到的結果如下:

Picture(9)

tags:
聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
免費領取
今日已有369人領取成功
劉同學 138****2860 剛剛成功領取
王同學 131****2015 剛剛成功領取
張同學 133****4652 剛剛成功領取
李同學 135****8607 剛剛成功領取
楊同學 132****5667 剛剛成功領取
岳同學 134****6652 剛剛成功領取
梁同學 157****2950 剛剛成功領取
劉同學 189****1015 剛剛成功領取
張同學 155****4678 剛剛成功領取
鄒同學 139****2907 剛剛成功領取
董同學 138****2867 剛剛成功領取
周同學 136****3602 剛剛成功領取
相關推薦HOT
免费无码成人AV片在线在线播放| 精品久久久久久狼人社区| 国内精品国语自产拍在线观看 | 国产成人久久综合第一区| 国产手机AV片在线无码观你| 久久电影网午夜鲁丝片伦| 男男开小嫩苞好深啊H窑子开| 人人澡人人澡人人看添AV| 无码国产玉足脚交久久2020 | 中文乱码在线中文字幕中文乱码| H漫全彩纯肉无码网站| 国产成人18黄网站| 精品人妻一区二区三区视频53一 | 中文字幕乱码亚洲无线码三区| 菠萝蜜视频在线观看| 国产女人18毛片水真多1| 久久久久亚洲AV成人人电影软件| 欧美又大粗又爽又黄大片视频 | WWW一区二区三区在线 || 国产成人无码AⅤ片在线观看你 | 国产精品视频第一区二区三区| 精品熟女少妇A∨免费久久 | 中国JAPANESE成熟少妇| 成A人片亚洲日本久久| 国语精品自产拍在线观看网站| 精品无人区一区二区三区的特点| 内射人妻无码色AV综合网| 四季AV一区二区三区免费观看| 亚洲精品无码激情AV| JJZZJJZZ高潮喷水妇女| 国产男男激情VIDEOSGAY| 麻花传媒剧国产MV在线观看| 丝袜国偷自产中文字幕| 亚洲午夜无码久久久久蜜臀AV| 被下春药爽翻天按摩的人妻| 黑色丝袜老师自慰喷水浪潮免费| 欧码的XL是亚洲码| 香蕉久久人人97超碰CAOPR| 中文字幕AV免费专区| 超碰97人人射妻| 精品午夜人成一区| 日本熟妇人妻XXXXX中文| 亚洲国产人成自久久国产| WWW国产精品人妻一二三区| 好吊视频一区二区三区| 人妻人人澡人人添人人爽人人玩| 亚洲成国产人片在线观看| 薄白丝小仙女自慰喷水| 精品久久久久久久久午夜福利| 人妻在线无码一区二区三区| 亚洲精品无码MV在线观看网站| 草棚CAOPORON已满18进| 久久久久国产精品免费免费搜索| 日本WWW一道久久久免费| 亚洲男人第一无码AV网站| 粉嫩小泬无遮挡久久久久久| 精品久久亚洲中文字幕| 色综合天天综合狠狠爱| 婬乱丰满熟妇XXXXX性69| 国产精品久久久久久久久电影网| 免费看30分钟打扑克教程| 性猛69式交富婆Ⅹ×××乱大交| 91国语对白露脸自产拍不卡| 护士HD老师FREE性Ⅹ| 色欲香天天天综合网站| 中文午夜人妻无码看片| 国产无套无码AⅤ在线观看| 欧美最猛黑人XXXX黑人猛交3p| 亚洲成A人片在线观看中文| 粗大的内捧猛烈进出小视频| 久久精品女同亚洲女同| 我和亲妺婷婷在浴室作爱经过| 98久9在线 | 免费| 精品国产一区二区三区噜噜噜 | 欧美午夜理伦三级在线观看| 亚洲熟女成年三级中文字幕| 国产精品久久久久7777| 欧美一级137片内射亚洲| 亚洲中文久久精品无码照片| 国产免费久久精品99久久| 人性禁岛1破禁果| 中文无码人妻有码人妻中文字幕| 好爽…又高潮了粉色视频| 日日摸夜夜添夜夜添高潮喷水| 最新国产精品拍自在线观看 | 日韩人妻无码一区2区3区| 真人性囗交69图片| 激情综合一区二区迷情校园| 无码办公室丝袜OL中文字幕| 被三个男人绑着躁我好爽| 免费十大软件大全下载安装| 亚洲色偷偷综合亚洲AVYP| 国产无遮挡吃胸膜奶免费看 | 啊灬啊灬啊灬快灬深高潮了亚洲乱色视频在线观看| 久久99精品国产麻豆宅宅| 无码中文亚洲AV影音先锋无码| 成人精品免费AV不卡在线观看| 奶头被民工们吸得又红又肿怎么办| 亚洲色偷偷偷网站色偷一区人人澡| 国产区精品一区二区不卡中文| 色哟哟免费精品网站入口| ZOOM与人性ZOOM1区别| 免费全部高H视频无码| 亚洲AV无码成人黄网站在线观看| 播放男人添女人下边视频| 欧美嫩交一区二区三区| 最新无码国产在线视频9299| 久久久久无码精品国产AV蜜桃| 亚洲国产精品一区二区美利坚| 国产美女视频国产视视频| 天天躁夜夜躁狠狠躁2021| 丁香婷婷在线成人播放视频| 人妻妺妺窝人体色WWW聚色窝| BBBBBBBBB老妇人BBB| 久久久久久精品免费免费69| 亚洲色大成网站WWW永久一区| 好大好深好猛好爽视频| 亚洲AV无码一区二区高潮| 国产又爽又黄的激情精品视频| 午夜A级毛片免费观看| 国产精品亚洲色婷婷99久久精品| 日韩毛片无码永久免费看| 成年女人天堂香蕉网| 日本三级香港三级人妇99| 菠萝蜜视频在线观看| 欧美熟妇精品一区二区蜜桃视频| 中文精品无码中文字幕无码专区| 久久伊人精品一区二区三区| 永久看一二三四线| 久久夜色精品国产| 中国少妇内射XXXXX-百度| 久久精品女人天堂AV| 亚洲熟妇成人精品二区蜜臀| 精品久久8X国产免费观看| 亚洲精品国产A久久久久久| 黑人强伦姧人妻完整版| 亚洲AV无码乱码在线观看| 国产美女丝袜一级肛交蜜桃| 亚洲AV成人无码一区二区在线观看 | 国产在线无码视频一区二区三区 | 国产AV日韩A∨亚洲AV电影| 丝袜 中出 制服 人妻 美腿| 国产精品亚洲LV粉色| 亚洲AV无码成人片在线观看| 护士猛少妇色ⅩXXXX猛叫| 亚洲国产AⅤ天堂久久| 久久97人人超人人超碰超国产| 亚洲中文字幕久久无码| 久久精品国产亚洲AV蜜桃| 亚洲欧美日韩中文高清WWW| 久久人人爽天天玩人人妻精品| 中文字幕AV一区中文字幕天堂 | Japanese日本护士XXXX18一19| 人体艺术大胆图片| 国产成人亚洲综合网站| 亚洲AV无码成人精品区| 久久精品网站免费观看| 19岁MACBOOKPRO高清| 日本XXXⅩ69XXXX护土| 国产精品成人影院久久久| 亚洲成A人片在线观看WWW| 久久久久无码精品国产AV蜜桃| 999国内精品永久免费观看| 人妻一区二区三区Av毛片| 多毛BGMBGMBGM胖在| 无码AV中文字幕免费放| 精品国产乱码一区二区三区APP| 幼儿HIPHOP仙踪林的功能| 欧美巨鞭大战丰满少妇| 锕锕锕锕锕锕锕轻点好痛免费 | CSGO未满十八岁能玩多久| 日日摸夜夜添夜夜添亚洲女人| 国产熟女高潮一区二区三区| 亚洲欭美日韩颜射在线| 欧美精品一区二区| 寡妇下面好黑好毛| 小浪蹄子蜜水噗呲噗呲的| 久久人人爽人人爽人人片AV超碰| 亚洲AV实录无码成人精品电影 | 色婷婷五月色综合AⅤ小说 | 亚洲欧洲精品成人久久曰影片| 欧美日韩精品久久久免费观看| 国产精品嫩草影院一二三区入口| 夜夜香夜夜摸夜夜添视频| 日日摸日日碰夜夜爽无| 久久国产精品成人片免费| 成人国产精品一区二区免费看| 亚洲AV无码专区在线电影成人| 欧美XXXXX牲另类人与| 国产美女精品自在线拍免费| 综合无码成人AⅤ视频在线观看| 天天拍天天看天天做| 两个领导在车里吃我奶| 国产成人AV一区二区三区| 又粗又大又硬毛片免费看| 少妇厨房愉情理伦片BD在线观看| 久久精品AⅤ无码中文字字幕 | 精品无码国产自产野外拍在线| 波多野结衣AV高清一区二区三区| 亚洲国产一区二区三区|