網絡爬蟲框架 Scrapy 入門教程

Scrapy 是一個用 Python 開發的爬蟲框架,用於抓取 Web 頁面並提取其中的結構化數據。

安裝html

首先,肯定你的電腦上已經安裝了 Python 3 以及對應的 pip。可使用下面的命令查看:python

$ python3 --version
Python 3.6.3
$ pip3 --version
pip 9.0.1 from /usr/local/lib/python3.6/site-packages (python 3.6)

若是沒有安裝的話,推薦使 Homebrew 這個工具來進行安裝。數據庫

pip 是 Python 的一個包管理工具,相似於 npm,能夠在線安裝、卸載全部的第三方 Python 模塊,並自動處理依賴關係。這裏咱們使用下面的命令來安裝 Scrapy 模塊:npm

$ pip3 install scrapy

教程:一個抓取豆瓣電影 Top 250 的爬蟲瀏覽器

首先,咱們使用下面的命令來建立並初始化 Scrapy 項目:框架

$ scrapy startproject doubanmovie

這樣便會在當前目錄下建立一個 doubanmovie 的爬蟲項目,其內部結構以下:dom

$ tree
.
├── doubanmovie
│   ├── __init__.py
│   ├── __pycache__
│   ├── items.py
│   ├── middlewares.py
│   ├── pipelines.py
│   ├── settings.py
│   └── spiders
│       ├── __init__.py
│       └── __pycache__
└── scrapy.cfg

其中:scrapy

scrapy.cfg 爲 Scrapy 項目的核心配置文件ide

items.py 用於定義爬蟲程序爬取到的數據實體的屬性結構函數

piplines.py 用於定義爬蟲程序每次爬取到的數據實體進行後續處理的操做流程,好比寫入文件系統或數據庫

settings.py 爲爬蟲程序的配置文件,能夠在這裏定義多個 pipline 和 middleware

spiders 文件夾中存放爬蟲文件

接着,咱們須要在 items.py 文件中定義電影實體的屬性結構:

class DoubanmovieItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    rank = scrapy.Field() # 豆瓣排名
    title = scrapy.Field() # 電影名稱
    poster = scrapy.Field() # 電影海報
    link = scrapy.Field() # 連接地址
    rating = scrapy.Field() # 豆瓣評分
    pass

而後,咱們使用下面的命令來建立一個名爲 doubanspider 的爬蟲程序:

$ scrapy genspider moviespider douban.com

運行以後會在 spiders 目錄下生成一個名爲 moviespider.py 的爬蟲文件,內部定義了爬蟲的名稱、做用域及起始 URL 等基本信息,以及一個解析函數,該函數的主要功能即是經過 XPath 分析頁面中的 HTML 元素,並將解析結果輸出:

class MoviespiderSpider(scrapy.Spider):
    name = 'moviespider'
    allowed_domains = ['douban.com']
    start_urls = ['https://movie.douban.com/top250']

    def parse(self, response):
        movie_items = response.xpath('//div[@class="item"]')
        for item in movie_items:
            movie = DoubanmovieItem()

            movie['rank'] = item.xpath('div[@class="pic"]/em/text()').extract()
            movie['title'] = item.xpath('div[@class="info"]/div[@class="hd"]/a/span[@class="title"][1]/text()').extract()
            movie['poster'] = item.xpath('div[@class="pic"]/a/img/@src').extract()
            movie['link'] = item.xpath('div[@class="info"]/div[@class="hd"]/a/@href').extract()
            movie['rating'] = item.xpath('div[@class="info"]/div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()').extract()

            yield movie
        pass

經過爬蟲解析後的實體數據,會經過一種 Pipeline 的過程將結果進行打印輸出、存入文件或數據庫等:

class DoubanmoviePipeline(object):
    def process_item(self, item, spider):
        print('豆瓣排名:' + item['rank'][0])
        print('電影名稱:' + item['title'][0])
        print('連接地址:' + item['link'][0])
        print('豆瓣評分:' + item['rating'][0] + '\n')

        return item

因爲豆瓣電影的網站設置了防爬蟲技術,因此在完成上述步驟後運行爬蟲會出現 403 的 HTTP 狀態碼。因而咱們須要在發送的請求中加入 User Agent 信息來假裝成一個瀏覽器:

from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware

class FakeUserAgentMiddleware(UserAgentMiddleware):
    def process_request(self, request, spider):
        request.headers.setdefault('User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36')

最後,咱們將上述修改寫入配置文件:

# Enable or disable downloader middlewares
# See http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html
DOWNLOADER_MIDDLEWARES = {
    'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None,
    'doubanmovie.fakeuseragent.FakeUserAgentMiddleware': 543,
}

# Configure item pipelines
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
    'doubanmovie.pipelines.DoubanmoviePipeline': 300,
}

運行 scrapy crawl moviespider 命令,便會在控制檯中輸出爬取到的數據。

相關文章
相關標籤/搜索