用Scrapy與Django一起搭建一個簡單的爬蟲架構

來源:互聯網
上載者:User
目錄

目錄 前言 本文 環境配置 只用Scrapy完成任務 簡單的Django項目 串連mysql資料庫 編寫一個資料類 加入Scrapy 編寫items 編寫spiders 編寫pipelines 爬蟲設定 部署和運行爬蟲 啟動scrapyd 部署爬蟲到scrapyd 運行結果 項目地址 後記

前言

跳過廢話,直接看本文

總是寫後端也沒意思,突發奇想,來學學爬蟲。最終目標是利用Scrapy以及Django來搭建一個簡單的爬蟲架構,並完成一個簡單的爬取任務:將目標網頁的部分內容爬取下來存入Mysql資料庫中。

本文記錄了一個簡單的爬蟲架構的完整搭建步驟,適合想要快速上手的朋友。如果想系統地學習Scrapy以及Django,請前往以下列出的官方文檔: Scrapy官方文檔 Scrapyd官方文檔 Django官方文檔 本文 環境配置 安裝python開發環境(強烈推薦直接安裝Anaconda(我目前安裝的是Anaconda2-4.1.1-Windows-x86_64) 安裝scrapy(命令列運行“conda install scrapy”) 安裝django(命令列運行“conda install django”) 安裝scrapyd(目前Anaconda好像還找不到這個module,直接用pip裝:命令列運行“pip install scrapyd”) 其他還有兩三個依賴的庫(如scrapy_djangoitem 、MySQL-python),具體記不全了,在運行scrapy或django報錯時,用pip裝一下就好了 只用Scrapy完成任務

如果你只是想快速寫一個簡單的爬蟲程式,那麼沒有必要搭建任何架構,只用scrapy就可以搞定了,就如下面的程式這樣。(該段代碼來自Scrapy官網)

import scrapyclass QuotesSpider(scrapy.Spider):    name = "quotes"    start_urls = [        'http://quotes.toscrape.com/tag/humor/',    ]    def parse(self, response):        for quote in response.css('div.quote'):            yield {                'text': quote.css('span.text::text').extract_first(),                'author': quote.xpath('span/small/text()').extract_first(),            }        next_page = response.css('li.next a::attr("href")').extract_first()        if next_page is not None:            next_page = response.urljoin(next_page)            yield scrapy.Request(next_page, callback=self.parse)

將上述代碼儲存為quotes_spider.py,並運行命令:

scrapy runspider quotes_spider.py -o quotes.json

爬取的內容輸出到quotes.json檔案中。

可以看到,用scrapy寫一個爬蟲非常簡單,只要繼承scrapy.Spider並實現parse函數就好了。

然而,這裡的輸出是放在檔案中的,我們的任務目標是將輸出存入mysql中,因此我們需要藉助其他的庫,web架構Django就是一個很好的選擇。
Django內建Sqlite,也支援mysql、sqlserver等多種資料庫。 簡單的Django項目

在將Django與Scrapy結合之前,先簡單瞭解一下Django的項目結構。
運行如下命令建立一個Django項目:

django-admin startproject helloscrapy

可以看到此項目的檔案結構:

helloscrapy/    manage.py    helloscrapy/        __init__.py        settings.py        urls.py        wsgi.py

此時,你在最頂層的helloscrapy目錄下運行以下命令:

python manage.py runserver

用瀏覽器開啟http://127.0.0.1:8000/就能夠看到一個顯示“Congratulations on your first Django-powered page.”的頁面,這表示你的Django開發環境配置正確。

當然,我們的目的不是開發網站,只是利用Django來對資料庫進行操作,因此,在這裡我們只要熟悉Django專案檔組成即可,
(每個檔案的作用在Django官方文檔都有詳細解釋,這裡不做贅述)。 串連mysql資料庫

Django預設使用sqlite,因此,在編寫具體的資料類之前,我們需要先配置好Django與mysql的串連。這個配置是寫在裡層的helloscrapy目錄下的settings.py中(將其中的ip、user等資訊改為自己的):

DATABASES = {    'default': {        'ENGINE': 'django.db.backends.mysql',        'NAME': 'database_name',        'USER': 'user',        'PASSWORD': 'password',        'HOST': 'database_server_ip',        'PORT': '3306',    }}

配置好後,在項目根目錄下運行以下命令:

python manage.py makemigrationspython manage.py migrate

在這個過程中若遇到缺少模組的錯誤,請用pip install安裝缺少的模組。命令成功運行後,開啟你的資料庫,若看到有一些auth和django開頭的表建立,則說明mysql資料庫連接成功。 編寫一個資料類

在根目錄下運行以下命令來建立一個Django app:

python manage.py startapp warehouse

我們可以看到產生的warehouse的目錄結構:

warehouse/    __init__.py    admin.py    apps.py    migrations/        __init__.py    models.py    tests.py    views.py

接著在裡層的helloscrapy目錄下的settings.py中的INSTALLED_APPS中加入’warehouse’, 如下所示:

INSTALLED_APPS = [    'django.contrib.admin',    'django.contrib.auth',    'django.contrib.contenttypes',    'django.contrib.sessions',    'django.contrib.messages',    'django.contrib.staticfiles',    'warehouse',]

我們將把warehouse當做資料類的倉庫,爬蟲爬取的資料將會進行一定處理而轉換為warehouse中定義的資料類(model),並存入資料庫中。

接下來,在models.py中編寫一個簡單的model:

from django.db import modelsclass TestScrapy(models.Model):    text= models.CharField(max_length=255)    author= models.CharField(max_length=255)    class Meta:        app_label = 'warehouse'        db_table = 'test_scrapy'

同樣地,在項目根目錄下運行以下命令:

python manage.py makemigrationspython manage.py migrate

查看資料庫中,應該能夠看到剛剛建好的test_scrapy表。 加入Scrapy

現在就可以將Scrapy加入到Django項目中了。

首先,配置環境變數PYTHONPATH,設定其值為此Django的項目根目錄的路徑(例如E:\PythonProjects\helloscrapy)

接下來,項目根目錄下建立一個bots檔案夾,進入bots目錄,建立一個init.py檔案,內容如下:

def setup_django_env():    import os, django    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "helloscrapy.settings")    django.setup()def check_db_connection():    from django.db import connection    if connection.connection:        #NOTE: (zacky, 2016.MAR.21st) IF CONNECTION IS CLOSED BY BACKEND, CLOSE IT AT DJANGO, WHICH WILL BE SETUP AFTERWARDS.        if not connection.is_usable():            connection.close()

在bots目錄下運行以下命令來建立一個scrapy項目:

scrapy startproject testbot

testbot項目結構如下:

testbot/    __init__.py    scrapy.cfg    testbot/        __init__.py        items.py        pipelines.py        settings.py        spiders/    
編寫items

items檔案:

import scrapyfrom scrapy_djangoitem import DjangoItemfrom warehouse.models import TestScrapyclass TestbotItem(DjangoItem):    django_model = TestScrapy
編寫spiders

在spiders目錄下建立一個test_spider.py,內容如下:

import scrapyfrom testbot.items import TestbotItemclass TestSpider(scrapy.Spider):    name = "test_spider"    start_urls = [        'http://quotes.toscrape.com/tag/humor/',    ]    def parse(self, response):        for quote in response.css('div.quote'):            item = TestbotItem()            item['text'] = quote.css('span.text::text').extract_first()            item['author'] = quote.xpath('span/small/text()').extract_first()            yield item        next_page = response.css('li.next a::attr("href")').extract_first()        if next_page is not None:            next_page = response.urljoin(next_page)            yield scrapy.Request(next_page, callback=self.parse)
編寫pipelines
class TestbotPipeline(object):    def process_item(self, item, spider):        item.save()        return item
爬蟲設定

testbot下的settings.py:

from bots import setup_django_envsetup_django_env()BOT_NAME = 'testbot'SPIDER_MODULES = ['testbot.spiders']NEWSPIDER_MODULE = 'testbot.spiders'DOWNLOAD_HANDLERS = {'s3': None}DOWNLOAD_DELAY = 0.5DOWNLOAD_TIMEOUT = 100CONCURRENT_REQUESTS_PER_IP=1ITEM_PIPELINES = {    'testbot.pipelines.TestbotPipeline': 1,}

ok, 到這裡,一個簡單的Scrapy算是完成了,接下來就是部署和啟動,這裡我們使用scrapyd-client來部署爬蟲到scrapyd上 部署和運行爬蟲 啟動scrapyd

運行下面的命令:

scrapyd

開啟 http://localhost:6800/ 應該能夠看到scrapyd的頁面 部署爬蟲到scrapyd

將testbot目錄下的scrapy.cfg中url前的的“#”刪除:

url = http://localhost:6800/

在testbot目錄下運行部署命令以及:

scrapyd-deploycurl http://localhost:6800/schedule.json -d project=testbot -d spider=test_spider

在 http://localhost:6800/ 查看爬蟲運行狀態。 運行結果

如果爬蟲運行結束,你應該能夠在資料庫中的test_scrapy表中看到結果,如下圖所示:
項目地址

https://github.com/clayandgithub/helloscrapy 後記

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.