1. 程式人生 > >利用scrapy框架進行爬蟲

利用scrapy框架進行爬蟲

今天一個網友問爬蟲知識,自己把許多小細節都忘了,很慚愧,所以這裡寫一下大概的步驟,主要是自己鞏固一下知識,順便複習一下。(scrapy框架有一個好處,就是可以爬取https的內容)

【爬取的是楊子晚報,這裡就以此為例,建立scrapy爬蟲 網址:http://www.yangtse.com/】

第一步:安裝scrapy框架

(這裡不做詳細介紹了,要是安裝遇到問題的朋友們,可以參考下面連結

http://www.cnblogs.com/wj-1314/p/7856695.html)

第二步:建立scrapy爬蟲檔案

格式:scrapy startproject  + 專案名稱

scrapy startproject yangzi

第三步:進入爬蟲檔案

格式:cd  專案名稱

cd yangzi

第四步:建立爬蟲專案

格式:scrapy genspider -t basic  專案名稱  網址

具體用法如下:

Usage
=====
  scrapy genspider [options] <name> <domain>

Generate new spider using pre-defined templates

Options
=======
--help, -h              show this help message and exit
--list, -l              List available templates
--edit, -e              Edit spider after creating it
--dump=TEMPLATE, -d TEMPLATE
                        Dump template to standard output
--template=TEMPLATE, -t TEMPLATE
                        Uses a custom template.
--force                 If the spider already exists, overwrite it with the
                        template

Global Options
--------------
--logfile=FILE          log file. if omitted stderr will be used
--loglevel=LEVEL, -L LEVEL
                        log level (default: DEBUG)
--nolog                 disable logging completely
--profile=FILE          write python cProfile stats to FILE
--pidfile=FILE          write process ID to FILE
--set=NAME=VALUE, -s NAME=VALUE
                        set/override setting (may be repeated)
--pdb                   enable pdb on failure

scrapy genspider -t basic yz http://www.yangtse.com/

建立好了,如下圖:

解釋一下檔案:

  • scrapy.cfg:專案的配置檔案
  • yangzi:該專案的python模組。之後您將在此加入程式碼。
  • yangzi/items.py:專案中的item檔案。
  • yangzi/pipelines.py:專案中的pipelines檔案。
  • yangzi/yz/:放置spider程式碼的目錄。

第五步:進入爬蟲專案中,先寫items

    寫這個的目的就是告訴專案,你要爬去什麼東西,比如標題,連結,作者等.

    Item是儲存爬取到的資料的容器:其使用方法和python字典類似,並且提供了額外保護機制來避免拼寫錯誤導致的未定義欄位錯誤。 
   類似在ORM中做的一樣,你可以通過建立一個scrapy.Item類,並且定義型別為scrapy.Field的類屬性來定義一個Item。 
   首先根據需要從dmoz.org獲取到的資料對item進行建模。我們需要從dmoz中獲取名字,url,以及網站的描述。對此,在item中定義相應的欄位。

以我寫的為例,我想爬取標題,連結,內容,如下:

複製程式碼
class YangziItem(scrapy.Item):
    # define the fields for your item here like:
    #標題
    title = scrapy.Field()
    #連結
    link =  scrapy.Field()
    #內容
    text =  scrapy.Field()
複製程式碼

第六步:進入pipelines,設定相應程式

    分析爬去的網站,依次爬取的東西,因為pipelines是進行後續處理的,比如把資料寫入MySQL,或者寫入本地文件啊等等,就在pipelies裡面寫。這裡直接輸出,不做資料庫的匯入處理

class YangziPipeline(object):
    def process_item(self, item, spider):
        print(item["title"])
        print(item["link"])
        return item

第七步:再寫自己建立的爬蟲

    (其實,爬蟲和pipelines和settings前後順序可以顛倒,這個不重要,但是一定要先寫items)

     Spider是使用者編寫用於從單個網站(或者一些網站)爬取資料的類。 
     其包含了一個用於下載的初始url,如何跟進網頁中的連結以及如何分析頁面中的內容,提取生成item的方法。 
   為了建立一個Spider,您必須繼承scrapy.Spider類,且定義以下三個屬性:

    • name:用於區別Spider。改名字必須是唯一的,您不可以為不同的Spider設定相同的名字。
    • start_urls:包含了Spider在啟動時進行爬取的url列表。因此,第一個被獲取的頁面給將是其中之一。後續的URL則從初始的URL獲取到的資料中提取。
    • parse():是spider的一個方法。被呼叫時,每個初始url完成下載後生成的Response物件將會作為唯一的引數傳遞給該函式。該方法負責解析返回的資料(response data),提取資料(生成item)以及生成需要進一步處理的URL的Request物件。

進入爬蟲後,先匯入items

接下來需要建立一個ITEM容器,

 it = YangziItem()

然後寫自己的要爬去的內容,分析網頁後,利用xpath寫

複製程式碼
   def parse(self, response):
        it = YangziItem()
        it["title"] = response.xpath('//div[@class="box-text-title]/text()').extract()
        it["link"] = response.xpath('//a[@target="_blank"]/@href').extract()
        #it["text"] = response.xpath().extract()
        yield it
複製程式碼

第八步:設定settings

在settings中配置pipelines(ctrl+f 找到pipelines,然後解除那三行的註釋,大約在64-68行之間),如下圖

第九步:執行爬蟲檔案

scrapy crawl yz
scrapy crawl yz --nolog #不想顯示日誌檔案