Python 爬蟲(chóng) | Scrapy 基礎(chǔ)入門(mén)篇

      網(wǎng)友投稿 1129 2025-03-31

      初識(shí)scrapy


      scrapy使用 Python 實(shí)現(xiàn)的一個(gè)開(kāi)源爬蟲(chóng)框架,Scrapy基于 twisted這個(gè)高性能的事件驅(qū)動(dòng)網(wǎng)絡(luò)引擎框架,Scrapy爬蟲(chóng)擁有很高的性能。

      Scrapy內(nèi)置數(shù)據(jù)提取器(Selector),支持XPath和 Scrapy自己的 CSS Selector語(yǔ)法

      并且支持正則表達(dá)式,方便從網(wǎng)頁(yè)提取信息。

      交互式的命令行工具,方便測(cè)試 Selector 和 debugging爬蟲(chóng)

      支持將數(shù)據(jù)導(dǎo)出為 JSON,CSV,XML格式。

      可推展性強(qiáng),運(yùn)行自己編寫(xiě)特定功能的插件

      內(nèi)置了很多拓展和中間件用于處理:

      cookies和 session

      HTTP的壓縮,認(rèn)證,緩存

      robots.txt

      爬蟲(chóng)深度限制

      其中:

      Scrapy Engine(引擎): 負(fù)責(zé)Spider、ItemPipeline、Downloader、Scheduler中間的通訊,信號(hào)、數(shù)據(jù)傳遞等。

      Scheduler(調(diào)度器): 它負(fù)責(zé)接受引擎發(fā)送過(guò)來(lái)的Request請(qǐng)求,并按照一定的方式進(jìn)行整理排列,入隊(duì),當(dāng)引擎需要時(shí),交還給引擎。

      Downloader(下載器):負(fù)責(zé)下載Scrapy Engine(引擎)發(fā)送的所有Requests請(qǐng)求,并將其獲取到的Responses交還給Scrapy Engine(引擎),由引擎交給Spider來(lái)處理,

      Spider(爬蟲(chóng)):它負(fù)責(zé)處理所有Responses,從中分析提取數(shù)據(jù),獲取Item字段需要的數(shù)據(jù),并將需要跟進(jìn)的URL提交給引擎,再次進(jìn)入Scheduler(調(diào)度器),

      Item Pipeline(管道):它負(fù)責(zé)處理Spider中獲取到的Item,并進(jìn)行進(jìn)行后期處理(詳細(xì)分析、過(guò)濾、存儲(chǔ)等)的地方.

      Downloader Middlewares(下載中間件):你可以當(dāng)作是一個(gè)可以自定義擴(kuò)展下載功能的組件。

      Spider Middlewares(Spider中間件):你可以理解為是一個(gè)可以自定擴(kuò)展和操作引擎和Spider中間通信的功能組件(比如進(jìn)入Spider的Responses;和從Spider出去的Requests)

      新建項(xiàng)目(scrapy startproject xxx):新建一個(gè)新的爬蟲(chóng)項(xiàng)目 明確目標(biāo)(編寫(xiě)items.py):明確你想要抓取的目標(biāo) 制作爬蟲(chóng)(spiders/xxspider.py):制作爬蟲(chóng)開(kāi)始爬取網(wǎng)頁(yè) 存儲(chǔ)內(nèi)容(pipelines.py):設(shè)計(jì)管道存儲(chǔ)爬取內(nèi)容

      在windows 64bit系統(tǒng)下安裝Scrapy需要安裝以下依賴(lài)庫(kù):

      pip install wheel lxml-4.2.1-cp36-cp36m-win_amd64.whl pyOpenSSL-17.5.0-py2.py3-none-any.whl pywin32-221.win-amd64-py3.6.exe Twisted-17.9.0-cp36-cp36m-win_amd64.whl pip install scrapy

      系統(tǒng)版本為ubuntu 16.04

      sudo apt-get install build-essential python3-dev libssl-dev libffi-dev libxml2 libxml2-dev libxslt1-dev zlib1g-dev pip install scrapy

      Python 爬蟲(chóng) | Scrapy 基礎(chǔ)入門(mén)篇

      我們?cè)趙indows命令行模式下輸入以下命令創(chuàng)建Scrapy項(xiàng)目:

      scrapy startproject 項(xiàng)目名稱(chēng)

      可以看到創(chuàng)建了以下文件:

      其中:

      scrapy.cfg :項(xiàng)目的配置文件 xxSpider/ :項(xiàng)目的Python模塊,將會(huì)從這里引用代碼 xxSpider/items.py :項(xiàng)目的目標(biāo)文件 xxSpider/pipelines.py :項(xiàng)目的管道文件 xxSpider/settings.py :項(xiàng)目的設(shè)置文件 xxSpider/spiders/ :存儲(chǔ)爬蟲(chóng)代碼目錄

      創(chuàng)建完Scrapy項(xiàng)目,還是要上手實(shí)驗(yàn)一下才能更好的理解,所以我根據(jù)之前我在樓+課程中的學(xué)習(xí)筆記寫(xiě)了一個(gè)Scrapy單文件Demo,使用這個(gè)單文件Demo能快速爬取實(shí)驗(yàn)樓全部課程信息。

      首先看下單文件的內(nèi)容結(jié)構(gòu):

      # -*- coding:utf-8 -*- import scrapy class ShiyanlouCoursesSpider(scrapy.Spider): """ 所有 scrapy 爬蟲(chóng)需要寫(xiě)一個(gè) Spider 類(lèi),這個(gè)類(lèi)要繼承 scrapy.Spider 類(lèi)。在這個(gè)類(lèi)中定義要請(qǐng)求的網(wǎng)站和鏈接、如何從返回的網(wǎng)頁(yè)提取數(shù)據(jù)等等。 """ # 爬蟲(chóng)標(biāo)識(shí)符號(hào),在 scrapy 項(xiàng)目中可能會(huì)有多個(gè)爬蟲(chóng),name 用于標(biāo)識(shí)每個(gè)爬蟲(chóng),不能相同 name = 'shiyanlou-courses' def start_requests(self): """ 需要返回一個(gè)可迭代的對(duì)象,迭代的元素是scrapy.Request對(duì)象,可迭代對(duì)象可以是一個(gè)列表或者迭代器,這樣 scrapy 就知道有哪些網(wǎng)頁(yè)需要爬取了。scrapy.Request接受一個(gè) url 參數(shù)和一個(gè) callback 參數(shù),url 指明要爬取的網(wǎng)頁(yè),callback 是一個(gè)回調(diào)函數(shù)用于處理返回的網(wǎng)頁(yè),通常是一個(gè)提取數(shù)據(jù)的 parse 函數(shù)。 """ def parse(self, response): """ 這個(gè)方法作為 `scrapy.Request` 的 callback,在里面編寫(xiě)提取數(shù)據(jù)的代碼。scrapy 中的下載器會(huì)下載 `start_reqeusts` 中定義的每個(gè) `Request` 并且結(jié)果封裝為一個(gè) response 對(duì)象傳入這個(gè)方法。 """ pass

      因?yàn)閷?shí)驗(yàn)樓的網(wǎng)頁(yè)結(jié)構(gòu)還是很簡(jiǎn)單的,所以解析部分就不做贅述,直接上單文件完整代碼:

      # -*- coding:utf-8 -*- import scrapy class ShiyanlouCoursesSpider(scrapy.Spider): def start_requests(self): # 課程列表頁(yè)面 url 模版 url_tmpl = 'https://www.shiyanlou.com/courses/?category=all&course_type=all&fee=all&tag=all&page={}' # 所有要爬取的頁(yè)面 urls = (url_tmpl.format(i) for i in range(1, 23)) # 返回一個(gè)生成器,生成 Request 對(duì)象,生成器是可迭代對(duì)象 for url in urls: yield scrapy.Request(url=url, callback=self.parse) def parse(self, response): # 遍歷每個(gè)課程的 div.course-body for course in response.css('div.course-body'): # 使用 css 語(yǔ)法對(duì)每個(gè) course 提取數(shù)據(jù) yield { # 課程名稱(chēng) 'name': course.css('div.course-name::text').extract_first(), # 課程描述 'description': course.css('div.course-desc::text').extract_first(), # 課程類(lèi)型,實(shí)驗(yàn)樓的課程有免費(fèi),會(huì)員,訓(xùn)練營(yíng)三種,免費(fèi)課程并沒(méi)有字樣顯示,也就是說(shuō)沒(méi)有 span.pull-right 這個(gè)標(biāo)簽,沒(méi)有這個(gè)標(biāo)簽就代表時(shí)免費(fèi)課程,使用默認(rèn)值 `免費(fèi)`就可以了。 'type': course.css('div.course-footer span.pull-right::text').extract_first(default='Free'), # 注意 // 前面的 .,沒(méi)有點(diǎn)表示整個(gè)文檔所有的 div.course-body,有 . 才表示當(dāng)前迭代的這個(gè) div.course-body 'students': course.xpath('.//span[contains(@class, "pull-left")]/text()[2]').re_first('[^\d]*(\d*)[^\d]*') }

      保存文件,使用scrapy runspider xx.py -o data.json運(yùn)行代碼,這里使用 -o參數(shù)將結(jié)果輸出為json格式。

      Python Scrapy

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:表格如何添加頁(yè)碼
      下一篇:工廠制造哪些過(guò)程最適合機(jī)器人?
      相關(guān)文章
      亚洲精品无码av片| 最新亚洲精品国偷自产在线| 亚洲.国产.欧美一区二区三区| 亚洲人成网站在线观看播放动漫 | 亚洲精品永久在线观看| 激情综合亚洲色婷婷五月APP| 亚洲第一香蕉视频| 亚洲综合网美国十次| 亚洲高清中文字幕| 亚洲精品福利网泷泽萝拉| 亚洲宅男永久在线| 亚洲熟妇色自偷自拍另类| 亚洲国产综合精品| 亚洲人成高清在线播放| 国产亚洲sss在线播放| 亚洲综合偷自成人网第页色| 日韩亚洲国产综合高清| 亚洲一区二区三区成人网站| 亚洲免费综合色在线视频| 亚洲国产欧美日韩精品一区二区三区| 亚洲欧美国产日韩av野草社区| 亚洲欧美自偷自拍另类视| 亚洲第一成年免费网站| 一区二区三区亚洲视频| 亚洲精品99久久久久中文字幕| 亚洲午夜精品第一区二区8050| 成人伊人亚洲人综合网站222| 亚洲裸男gv网站| 亚洲无码在线播放| 亚洲AV人人澡人人爽人人夜夜| 亚洲视频精品在线| 亚洲日韩中文字幕| 久久综合久久综合亚洲| 亚洲Aⅴ在线无码播放毛片一线天| 精品亚洲视频在线| 日韩亚洲变态另类中文| 亚洲av网址在线观看| 亚洲精品熟女国产| 亚洲综合激情五月丁香六月| 久久精品国产亚洲AV| 精品国产日韩亚洲一区|