目錄
目錄 前言 本文 環境配置 只用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 後記
無