scrapy startproject【學習筆記02】

入門案例

學習目標

  • 創建一個Scrapy項目
  • 定義提取的結構化數據(Item)
  • 編寫爬取網站的 Spider 并提取出結構化數據(Item)
  • 編寫 Item Pipelines 來存儲提取到的Item(即結構化數據)

一. 新建項目(scrapy startproject)

  • 在開始爬取之前,必須創建一個新的Scrapy項目。進入自定義的項目目錄中,運行下列命令:
scrapy startproject mySpider
  • 其中, mySpider 為項目名稱,可以看到將會創建一個 mySpider 文件夾,目錄結構大致如下:

下面來簡單介紹一下各個主要文件的作用:

scrapy.cfg :項目的配置文件

mySpider/ :項目的Python模塊,將會從這里引用代碼

mySpider/items.py :項目的目標文件

mySpider/pipelines.py :項目的管道文件

mySpider/settings.py :項目的設置文件

mySpider/spiders/ :存儲爬蟲代碼目錄

二、明確目標(mySpider/items.py)

我們打算抓取:http://www.itcast.cn/channel/teacher.shtml?網站里的所有講師的姓名、職稱和個人信息。

  1. 打開mySpider目錄下的items.py

  2. Item 定義結構化數據字段,用來保存爬取到的數據,有點像Python中的dict,但是提供了一些額外的保護減少錯誤。

  3. 可以通過創建一個 scrapy.Item 類, 并且定義類型為 scrapy.Field的類屬性來定義一個Item。

  4. 接下來,創建一個ItcastItem 類,和構建item模型(model)。

import scrapyclass ItcastItem(scrapy.Item):name = scrapy.Field()level = scrapy.Field()info = scrapy.Field()

三、制作爬蟲 (spiders/itcastSpider.py)

爬蟲功能要分兩步:

1. 爬數據

  • 在當前目錄下輸入命令,將在mySpider/spider目錄下創建一個名為itcast的爬蟲,并指定爬取域的范圍:
scrapy genspider itcast "itcast.cn"
  • 打開 mySpider/spider目錄里的 itcast.py,默認增加了下列代碼:
import scrapyclass ItcastSpider(scrapy.Spider):name = "itcast"allowed_domains = ["itcast.cn"]start_urls = ('http://www.itcast.cn/',)def parse(self, response):pass

其實也可以由我們自行創建itcast.py并編寫上面的代碼,只不過使用命令可以免去編寫固定代碼的麻煩

要建立一個Spider, 你必須用scrapy.Spider類創建一個子類,并確定了三個強制的屬性 和 一個方法。

  • name = ""?:這個爬蟲的識別名稱,必須是唯一的,在不同的爬蟲必須定義不同的名字。

  • allow_domains = []?是搜索的域名范圍,也就是爬蟲的約束區域,規定爬蟲只爬取這個域名下的網頁,不存在的URL會被忽略。

  • start_urls = ()?:爬取的URL元祖/列表。爬蟲從這里開始抓取數據,所以,第一次下載的數據將會從這些urls開始。其他子URL將會從這些起始URL中繼承性生成。

  • parse(self, response)?:解析的方法,每個初始URL完成下載后將被調用,調用的時候傳入從每一個URL傳回的Response對象來作為唯一參數,主要作用如下:

    1. 負責解析返回的網頁數據(response.body),提取結構化數據(生成item)
    2. 生成需要下一頁的URL請求。

將start_urls的值修改為需要爬取的第一個url

start_urls = ("http://www.itcast.cn/channel/teacher.shtml",)

修改parse()方法

def parse(self, response):with open("teacher.html", "w") as f:f.write(response.text)

然后運行一下看看,在mySpider目錄下執行:

scrapy crawl itcast

是的,就是 itcast,看上面代碼,它是 ItcastSpider 類的 name 屬性,也就是使用?scrapy genspider命令的爬蟲名。

一個Scrapy爬蟲項目里,可以存在多個爬蟲。各個爬蟲在執行時,就是按照 name 屬性來區分。

運行之后,如果打印的日志出現?[scrapy] INFO: Spider closed (finished),代表執行完成。 之后當前文件夾中就出現了一個 teacher.html 文件,里面就是我們剛剛要爬取的網頁的全部源代碼信息。


2. 取數據

  • 爬取整個網頁完畢,接下來的就是的取過程了,首先觀察頁面源碼:

<div class="li_txt"><h3>  xxx  </h3><h4> xxxxx </h4><p> xxxxxxxx </p>

是不是一目了然?直接上XPath開始提取數據吧。

  • 我們之前在mySpider/items.py 里定義了一個ItcastItem類。 這里引入進來
  from mySpider.items import ItcastItem
  • 然后將我們得到的數據封裝到一個?ItcastItem?對象中,可以保存每個老師的屬性:
from mySpider.items import ItcastItemdef parse(self, response):#open("teacher.html","wb").write(response.body).close()# 存放老師信息的集合items = []for each in response.xpath("//div[@class='li_txt']"):# 將我們得到的數據封裝到一個 `ItcastItem` 對象item = ItcastItem()#extract()方法返回的都是字符串name = each.xpath("h3/text()").extract()title = each.xpath("h4/text()").extract()info = each.xpath("p/text()").extract()#xpath返回的是包含一個元素的列表item['name'] = name[0]item['title'] = title[0]item['info'] = info[0]items.append(item)# 直接返回最后數據return items
  • 我們暫時先不處理管道,后面會詳細介紹。

保存數據

scrapy保存信息的最簡單的方法主要有四種,-o 輸出指定格式的文件,,命令如下:

# json格式,默認為Unicode編碼
scrapy crawl itcast -o teachers.json# json lines格式,默認為Unicode編碼
scrapy crawl itcast -o teachers.jsonl# csv 逗號表達式,可用Excel打開
scrapy crawl itcast -o teachers.csv# xml格式
scrapy crawl itcast -o teachers.xml

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/456771.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/456771.shtml
英文地址,請注明出處:http://en.pswp.cn/news/456771.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

開始把其他的博客搬家到這里了

今天&#xff0c;用一晚上的時間進行一下文章的遷移吧。這樣以后查詢就可以在自己的博客中查找了&#xff0c;也算是給自己一個寫作的規律。 從很多個大牛的博客中都閱讀到&#xff0c;寫博客對于一個coder的重要性。希望這次可以堅持。轉載于:https://www.cnblogs.com/cyforev…

java系統高并發解決方案(轉載)

轉載博客地址&#xff1a;http://blog.csdn.net/zxl333/article/details/8685157 一個小型的網站&#xff0c;比如個人網站&#xff0c;可以使用最簡單的html靜態頁面就實現了&#xff0c;配合一些圖片達到美化效果&#xff0c;所有的頁面均存放在一個目錄下&#xff0c;這樣的…

Request/Response【學習筆記03】

Request Request 部分源碼&#xff1a; # 部分代碼 class Request(object_ref):def __init__(self, url, callbackNone, methodGET, headersNone, bodyNone, cookiesNone, metaNone, encodingutf-8, priority0,dont_filterFalse, errbackNone):self._encoding encoding # t…

TotoiseSVN的上手教程

本文轉自&#xff1a;http://www.cnblogs.com/xilentz/archive/2010/05/06/1728945.html TotoiseSVN的基本使用方法&#xff1a; 一、簽入源代碼到SVN服務器 假如我們使用Visual Studio在文件夾StartKit中創建了一個項目&#xff0c;我們要把這個項目的源代碼簽入到SVN Serv…

ALV可輸入狀態下輸入金額字段變小數的問題

http://blog.163.com/mxb_sapyeah/blog/static/10335262520167109022155/ 小數位數兩位 當我在給ALV上給該字段輸入整數 ‘1234 ‘ 時&#xff0c;該數據居然會默認變成‘12.34’ 可以在這里解決這個問題。就是定義字段目錄的時候&#xff0c;對于金額字段指定參考數據類型就…

Downloader Middlewares反反爬蟲【學習筆記04】

反反爬蟲相關機制 Some websites implement certain measures to prevent bots from crawling them, with varying degrees of sophistication. Getting around those measures can be difficult and tricky, and may sometimes require special infrastructure. Please consi…

【轉載】Android 關于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容問題

轉自&#xff1a;【歐陽鵬】http://blog.csdn.net/ouyang_peng Android 設備的CPU類型(通常稱為”ABIs”) armeabiv-v7a: 第7代及以上的 ARM 處理器。2011年15月以后的生產的大部分Android設備都使用它.arm64-v8a: 第8代、64位ARM處理器&#xff0c;很少設備&#xff0c;三星 G…

HDFS的簡介及基本操作(常用的命令參數介紹)

目錄前言&#xff1a;1、HDFS基本概念2、HDFS基本操作總結&#xff1a; 目錄 前言&#xff1a; 總算有空來接著寫大數據的學習筆記了&#xff0c;今天就把之前學過的HDFS的基礎知識詳細的介紹一下&#xff0c;如有哪點寫的不足希望大家多多指教。 1、HDFS基本概念 1.1、前…

Settings【學習筆記05】

Settings Scrapy設置(settings)提供了定制Scrapy組件的方法。可以控制包括核心(core)&#xff0c;插件(extension)&#xff0c;pipeline及spider組件。比如 設置Json Pipeliine、LOG_LEVEL等。 參考文檔&#xff1a;http://scrapy-chs.readthedocs.io/zh_CN/1.0/topics/setti…

java命令

javac.exe是編譯.java文件java.exe是執行編譯好的.class文件javadoc.exe是生成Java說明文檔jdb.exe是Java調試器javaprof.exe是剖析工具轉載于:https://www.cnblogs.com/Berryxiong/p/6143016.html

TensorFlow訓練單特征和多特征的線性回歸

線性回歸 線性回歸是很常見的一種回歸&#xff0c;線性回歸可以用來預測或者分類&#xff0c;主要解決線性問題。相關知識可看“相關閱讀”。 主要思想 在TensorFlow中進行線性回歸處理重點是將樣本和樣本特征矩陣化。 單特征線性回歸 單特征回歸模型為&#xff1a;ywxb 構建模…

大數據之HDFS應用開發(java API)

目錄1、搭建開發環境2、獲取api中的客戶端對象3、DistributedFileSystem實例對象所具備的方法4、HDFS客戶端操作數據代碼示例 目錄 1、搭建開發環境 window下開發的說明: A、在windows的某個目錄下解壓一個hadoop的安裝包 B、將安裝包下的lib和bin目錄用對應windows版本平…

shell腳本執行方式,更方便更快捷。

在進行linux測試時編寫腳本是必不可少的。最近經常使用Linux&#xff0c;感覺太頻繁地敲擊鍵盤有些累了&#xff0c;于是想到了Shell腳本。可以把太多的命令寫成一個腳本&#xff0c;這樣每次執行一遍 shell文件&#xff0c;就可以省去了敲擊鍵盤的時間。于是在網上搜了一些有…

行為科學統計第1章

行為科學統計 Statistics for the Behavioral Sciences 一周只學習一次不如每周學習比較多的幾次高效噢&#xff5e;&#xff3b;一開始&#xff0c;你并不知道這是一個會寫著畫風突變的讀書筆記?…&#xff3d; 第I部分 簡述與描述性統計 第1章 統計學入門 這本書我就是覺得這…

閉包---在函數內部再定義一個函數

什么是閉包 # 定義一個函數 def test(number):# 在函數內部再定義一個函數&#xff0c;并且這個函數用到了外邊函數的變量&#xff0c;那么將這個函數以及用到的一些變量稱之為閉包def test_in(number_in):print("in test_in 函數, number_in is %d" % number_in)re…

慕課網_《Java實現對稱加密》學習總結

時間&#xff1a;2017年4月11日星期二說明&#xff1a;本文部分內容均來自慕課網。慕課網&#xff1a;http://www.imooc.com教學示例源碼&#xff1a;https://github.com/zccodere/s...個人學習源碼&#xff1a;https://github.com/zccodere/s... 第一章&#xff1a;對稱加密算…

大數據之MapReduce詳解(MR的運行機制及配合WordCount實例來說明運行機制)

目錄前言&#xff1a;1、MapReduce原理2、mapreduce實踐&#xff08;WordCount實例&#xff09; 目錄 今天先總體說下MapReduce的相關知識&#xff0c;后續將會詳細說明對應的shuffle、mr與yarn的聯系、以及mr的join操作的等知識。以下內容全是個人學習后的見解&#xff0c;如…

生動形象的理解什么是裝飾器!

裝飾器 裝飾器是程序開發中經常會用到的一個功能&#xff0c;用好了裝飾器&#xff0c;開發效率如虎添翼&#xff0c;所以這也是Python面試中必問的問題&#xff0c;但對于好多初次接觸這個知識的人來講&#xff0c;這個功能有點繞&#xff0c;自學時直接繞過去了&#xff0c;…

PLSQL 申明和游標

--從鍵盤輸入一個數 accept b prompt 請輸入一個大于零的數字; declareanum number : &b; beginwhile anum>0loopdbms_output.put_line(anum);anum:anum-1;end loop; end;declarev_num number; begin -- 從stsu表中選出id最大的值&#xff0c;并根據該值打印次數select …

20155222 2016-2017-2 《Java程序設計》第8周學習總結

20155222 2016-2017-2 《Java程序設計》第8周學習總結 教材學習內容總結 Java NIO(New IO)是一個可以替代標準Java IO API的IO API&#xff08;從Java 1.4開始)&#xff0c;Java NIO提供了與標準IO不同的IO工作方式。 Java NIO: Channels and Buffers&#xff08;通道和緩沖區&…