接下来,我们将分几篇文章来实现对图书的增删改查功能,主要的功能如下:
1.增:新增图书信息
2.删:图书下架

3.改:图书信息的修改
4.查:图书信息的获取
而在本篇中主要介绍图书信息的采集和展示,也就是增删改查中的查询功能。需要实现以下功能的开发:
1.豆瓣图书的爬取和存储
2.豆瓣图书展示功能的前端实现
3.豆瓣图书展示功能的后端实现
4.豆瓣图书展示功能的前端修改
(一). 你愿意手动造“轮子”吗?
首先来思考个问题,如果你是一个测试开发,某天要实现这样一个常规的功能,你会按部就班的手动去写代码吗?对于日常开发来说,时间无疑是非常紧迫的,在这样一个环境下,能手动拷贝的就不要手动去敲,所以正如我上文说的那样,能做CV工程师就做CV工程师,把更多的时间腾出来实现更具挑战性的工作。
我们选择去网上找,如果你打开gitee或者github,会看到非常多的豆瓣爬虫项目,这里面的选择空间很大,根据开发语言、star、以及你最终想要实现的效果来筛选,就让我们一步步开始吧。
(二). 爬虫工程的创建
1.在D盘下创建一个空的目录叫crawler,在这个目录下打开cmd,然后使用git clone
https://gitee.com/jykgl/python-crawler-django-project.git 将项目克隆下来。
2.使用pycharm打开python-crawler-django-project这个目录,这个爬虫项目就加载出来了。
(三). 爬虫工程的介绍
1.topbook:这是一个django项目,它的结构主要是:
app:子应用,下面有模型类models,子路由urls,视图类views等
static:静态目录,主要存放css、js等静态文件
templates:模板目录,下面主要存放html页面
这是一个前段后不分离的项目,因此你会看到html文件里使用了很多模板变量。
对于这个项目,我们只需要使用到里面的模型类对象,其他我们用不到,因为我们自己的图书web系统会实现和它同样的功能。
2.douban:这是一个使用Scrapy框架实现的豆瓣爬虫项目,在这个项目里,我们只需要修改下pipelines.py中的数据库配置方式,将这里的数据库配置改为我们自己的图书web系统的数据库,然后执行后,爬取豆瓣的数据会落入对应的数据库。
(四). 爬虫工程依赖的安装
这里根据作者README.md里面的内容,依次安装好这些依赖:pypiwin32,lxml,twisted,scrapy,Microsoft Visual C++ 14.0以上 编译环境 数据库连接模块,pymysql,django框架,数据库操作的库mysqlclient,这里不做详述,但建议使用pipenv做好环境隔离,避免冲突。
(五). book模型类
将topbook项目app子应用下的models.py中的内容,拷贝到我们项目book子应用下的models.py中。这里需要注意一下,我删除了部分无关的字段。
from django.db import models
class Book(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=64)
score = models.CharField(max_length=32)
img_src = models.CharField(max_length=64, null=True)
publish_detail = models.CharField(max_length=255)
slogan = models.CharField(max_length=255)
publish_house = models.CharField(max_length=32, null=True)
detail_addr = models.CharField(max_length=255, null=True)
comment_people = models.CharField(max_length=32, null=True)
class Meta:
db_table = 'book'
(六). book数据表迁移
在运行爬虫之前,我们要执行两项操作:1. 创建表; 2. 修改爬虫项目的数据库配置。我们先来做第一项。使用makemigrations和migrate命令就可以实现数据表的迁移。
(七). 爬虫项目配置修改
在爬虫项目里,数据库配置是放在pipelines.py文件中,因此我们需要修改以下数据库的连接 host、用户名、密码、数据库名、数据表名:
from itemadapter import ItemAdapter
import urllib.request
import os
import pymysql
class DoubanPipeline:
def process_item(self, item, spider):
info = [item['title'], item['score'], item['publish_detail'], item['slogan'], item['publish_house'], item['img_src'], item['detail_addr'], item['comment_people']]
# 修改点 1:host
# 修改点 2:user、password
# 修改点 3:database
connection = pymysql.connect(host='localhost', user='root', password='123456', database='web-development', charset='utf8')
try:
with connection.cursor() as cursor:
# 修改点 4:表名
sql = 'insert into book (title, score, publish_detail, slogan, publish_house, img_src, detail_addr, comment_people) values (%s, %s, %s, %s, %s, %s, %s, %s)' affectedcount = cursor.execute(sql, info)
print('成功修改{0}条数据'.format(affectedcount))
connection.commit()
except pymysql.DatabaseError:
connection.rollback()
finally:
connection.close()
return item
(八). 执行爬虫项目
爬虫项目的作者在spiders目录下为我们创建了一个爬虫book,因此我们只需要执行scrapy crawl book 就可以爬取豆瓣图书并且存储到我们的数据表book中,但这里有个问题,当爬取到一半的时候,会报错:AttributeError: 'BookSpider' object has no attribute 'make_requests_from_url'。
这是因为新版本的Scrapy框架已丢弃了这个函数,但是并没有完全移除,虽然函数已经移除,但是还是在book.py中用到了它,因此会出现这个问题。这就需要在book.py的内部重写一下这个方法。
……
由于作者版权要求,仅展示文章的一部分,如需阅读完整版文章,可以私信回复”文章“即可免费获取。
最后:1)关注+私信回复:“测试”,可以免费领取一份10G软件测试工程师面试宝典文档资料。
2)关注+私信回复:"入群" 就可以邀请你进入软件测试群学习交流~~