1. 程式人生 > >用Scrapy寫爬蟲

用Scrapy寫爬蟲

一、scrapy專案的目錄結構

scrapy專案目錄結構
標目結構

包括了一個spiders資料夾,以及__init__.py、items.py、pipelines.py、settings.py等python檔案。

  • items.py是爬蟲專案的資料容器檔案,用來定義我們要獲取的資料。
  • pipelines.py 是爬蟲專案的管道檔案,用來對items裡面定義的資料進行進一步的加工與處理。
  • settinng.py是專案的設定檔案。
  • spiders資料夾下面放置的是爬蟲部分相關的檔案。

二、spider的編寫

 1.建立專案

   在命令列中輸入scrapy startproject 專案名,如下我建立了一個名為mypjt1的scrapy爬蟲專案

PS D:\學習資料及空間> scrapy startproject mypjt1
New Scrapy project 'mypjt1', using template directory 'd:\\users\\administrator\\anaconda3\\lib\\site-packages\\scrapy\\templates\\project', created in:
    D:\學習資料及空間\mypjt1

2.items的編寫

import scrapy


class Mypjt1Item(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()

3.spider的編寫

在爬蟲專案中通過genspider命令建立一個爬蟲檔案,然後我們在對該爬蟲檔案進行相應的修改與編寫。

在命令列中切換到相應的專案目錄下,然後輸入scrapy genspider -t 模板 新爬蟲名 爬取的域名

PS D:\學習資料及空間> cd mypjt1
PS D:\學習資料及空間\mypjt1> scrapy genspider -t basic myspd sina.com.cn
Created spider 'myspd' using template 'basic' in module:
  mypjt1.spiders.myspd

開啟後,該檔案的預設程式碼為

# -*- coding: utf-8 -*-
import scrapy


class MyspdSpider(scrapy.Spider):
    name = 'myspd'
    allowed_domains = ['sina.com.cn']
    start_urls = ['http://sina.com.cn/']

    def parse(self, response):
        pass

name 是爬蟲的名稱,此時我的爬蟲名稱為myspd,allowed_domains代表的是允許爬行的域名, start_urls代表的是爬行的起始網址, parse方法是處理Scrapy爬蟲爬行到的網頁響應預設方法,該方法可以對響應進行處理和返回處理後的資料,在該屬性中,我們可以定義多個起始網址,中間用逗號隔開。

進行簡單的修改後:
 

# -*- coding: utf-8 -*-
import scrapy
from mypjt1.items import Mypjt1Item

class MyspdSpider(scrapy.Spider):
    name = 'myspd'
    allowed_domains = ['sina.com.cn']
    start_urls = (
        'http://sina.com.cn/',
        'https://mil.news.sina.com.cn/'
    )

    def parse(self, response):
        item = Mypjt1Item()
        item['title'] = response.xpath("/html/head/title").extract()
        print(item['title'])

我們的提取方式是Xpath,Xpath學習網址:http://www.w3school.com.cn/xpath/index.asp

4.執行

輸入及相應的輸出結果

PS D:\學習資料及空間\mypjt1> scrapy crawl myspd --nolog
['<title>軍事頻道_最多軍迷首選的軍事門戶_新浪網</title>']
['<title>新聞中心首頁_新浪網</title>']

5.對爬取的資料進行進一步的加工

這時候我們用到了pipelines.py檔案,但在這之前我們應該對settings.py檔案配置。

# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
#ITEM_PIPELINES = {
#    'mypjt1.pipelines.Mypjt1Pipeline': 300,
#}

將預設配置修改如下:

# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
   'mypjt1.pipelines.Mypjt1Pipeline': 300,
}

編寫pipelines.py檔案將爬取的資料儲存到mydata.txt檔案中

# -*- coding: utf-8 -*-
import codecs
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html


class Mypjt1Pipeline(object):
    def __init__(self):
        #初始化,開始時呼叫,開啟一個檔案用於儲存爬取到的資料
        self.file = codecs.open('D:\\python35\\crawler\\mydata.txt',"wb",encoding="utf-8")

    #是pipeline的主要處理方法,預設會自動呼叫
    def process_item(self, item, spider):
        l = str(item) + '\n'
        #寫入到相應的檔案中
        self.file.write(l)
        return item

    #close_spider()方法一般在關閉蜘蛛時呼叫
    def close_spider(self):
        #關閉檔案
        self.file.close()

之後在myspd,py的parse方法加上yield item如下

    def parse(self, response):
        item = Mypjt1Item()
        item['title'] = response.xpath("/html/head/title").extract()
        print(item['title'])
        yield item

執行之後結果