下面是“Django结合使用Scrapy爬取数据入库的方法示例”的完整攻略。
一、准备工作
在开始使用Django和Scrapy之前,首先需要安装相关的软件包。下面是安装步骤:
- 安装Python3:可以在Python官网上下载Python3的安装包,根据系统版本进行下载安装;
- 安装Django:可以使用pip命令安装Django。在命令行输入:
pip install django
; - 安装Scrapy:同样使用pip命令安装Scrapy。在命令行输入:
pip install scrapy
; - 安装mysqlclient:如果你要将数据存储在MySQL数据库中,需要安装mysqlclient。可以通过pip命令安装,即在命令行输入:
pip install mysqlclient
;
安装完成之后,你需要创建一个Django项目。在命令行中输入:
django-admin startproject example_project
二、创建Scrapy爬虫
在创建Scrapy爬虫之前,你需要先确定爬取的网站和数据结构。这里以爬取豆瓣电影TOP250为例。
- 在命令行中输入以下代码,创建一个Scrapy项目:
scrapy startproject douban_movies
- 在douban_movies/spiders/目录下创建Spider代码文件,并将以下代码粘贴至其中:
import scrapy
from douban_movies.items import DoubanMoviesItem
class DoubanMovies(scrapy.Spider):
name = 'movies'
allowed_domains = ['douban.com']
start_urls = [
'https://movie.douban.com/top250'
]
def parse(self, response):
item = DoubanMoviesItem()
movies = response.xpath('//div[@class="info"]')
for movie in movies:
item['title'] = movie.xpath('div[@class="hd"]/a/span[1]/text()').extract_first().strip()
item['star'] = movie.xpath('div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()').extract_first()
item['quote'] = movie.xpath('div[@class="bd"]/p[@class="quote"]/span/text()').extract_first()
yield item
- 在douban_movies/items.py中创建一个DoubanMoviesItem类,用于保存爬取的数据:
import scrapy
class DoubanMoviesItem(scrapy.Item):
title = scrapy.Field()
star = scrapy.Field()
quote = scrapy.Field()
- 在settings.py中添加以下配置,用于生成JSON格式文件:
FEED_URI = 'movies.json'
FEED_FORMAT = 'json'
至此,Scrapy爬虫的代码已经完成。
三、Django操作数据库
在使用Scrapy爬取数据之前,你需要确定要将数据存储在哪个类型的数据库中,这里以MySQL为例。
- 在settings.py中添加以下配置,用于配置数据库连接:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'example_project_db',
'USER': 'root',
'PASSWORD': '',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
- 在命令行中输入以下命令,创建一个Django应用:
cd example_project
python manage.py startapp movies
- 在movies/models.py中创建一个Movie类,用于定义MySQL数据库表的结构:
from django.db import models
class Movie(models.Model):
title = models.CharField(max_length=128)
star = models.CharField(max_length=16)
quote = models.TextField()
def __str__(self):
return self.title
- 在命令行中输入以下代码,创建数据库表:
python manage.py makemigrations
python manage.py migrate
至此,Django操作数据库的代码已经完成。
四、Django结合Spacy爬取数据入库
Django结合Scrapy爬取数据入库的方法主要分为两个步骤:爬取数据和存储数据。
- 爬取数据
在Scrapy项目根目录下执行以下代码即可启动爬虫:
scrapy crawl movies
该命令将会输出爬取到的所有数据,同时在当前路径下生成movies.json文件,其中包含了全部数据。
- 存储数据
在命令行中输入以下代码,运行Django应用:
python manage.py runserver
在web浏览器中访问http://localhost:8000/
,验证Django应用是否正常运行。
在Django应用中,我们使用views.py来处理请求。在movies/views.py中添加以下代码:
from django.shortcuts import render
from .models import Movie
import json
def save_movies(request):
with open('movies.json', 'r') as f:
movies = json.load(f)
for movie in movies:
m = Movie(title=movie['title'], star=movie['star'], quote=movie['quote'])
m.save()
return render(request, 'result.html')
该代码通过读取movies.json文件,将爬取到的数据保存到MySQL数据库中。
在movies/urls.py中添加以下代码:
from django.urls import path
from . import views
urlpatterns = [
path('save/', views.save_movies, name='save_movies'),
]
在example_project/urls.py中添加以下代码:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('movies/', include('movies.urls')),
]
至此,Django结合Scrapy爬取数据入库的代码已经完成。
五、另一种方法示例
在Scrapy项目中,还可以使用pipelines来存储数据到MySQL数据库中。具体步骤如下:
- 安装pymysql包,用于连接MySQL数据库:
pip install pymysql
- 在Scrapy项目中添加以下代码,连接MySQL数据库:
import pymysql
class MySQLPipeline(object):
def __init__(self):
self.conn = pymysql.connect(
host='localhost',
user='root',
password='',
db='example_db',
charset='utf8'
)
self.cursor = self.conn.cursor()
def process_item(self, item, spider):
sql = 'INSERT INTO douban_movies (title, star, quote) VALUES ("{}", "{}", "{}")'.format(
item['title'], item['star'], item['quote']
)
self.cursor.execute(sql)
self.conn.commit()
return item
def close_spider(self, spider):
self.cursor.close()
self.conn.close()
- 在settings.py中添加以下配置:
ITEM_PIPELINES = {
'douban_movies.pipelines.MySQLPipeline': 300,
}
至此,我们使用Scrapy和pipelines爬取数据并存储到MySQL数据库的代码已经完成。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django结合使用Scrapy爬取数据入库的方法示例 - Python技术站