基于Django的网页版知网爬虫的实现

之前写了一个知网爬虫,一直想着能不能把他作为一个网页应用分享出来。正好自己也想学习一下Django框架,看到了todolist就想着能不能把他改成一个网页版的知网爬虫应用。在这个实现中用到了rabbitmq和celery技术解决爬虫在工作时耗时的问题。最后工作的效果可以点击这里效果图
在教程方面我参考了这个教程

新建Django项目

我在Pycharm中编写的该项目,在新建工程的时候就有选择新建Django项目的选项,具体这里的操作在教程方面说的都很清楚了,我这里就不加赘述了。
在新建好Django项目之后就是新建一个应用,我给我的应用起名为todolist。
我是在github上找到的一个todolist工程。这个工程的作者在文档中非常详细的描述了整个工程以及如何运行,我在其基础上添加使用了celery工具。

使用celery工具

celery可以很方便的处理耗时的问题,例如可以把发送邮件等耗时的工作交给celery进行。celery可以和django非常简单的结合在一起。在这里我参考了杨仕航的博客其中对于celery的描述和如何在django中使用celery有着非常详尽的描述。
我在views.py中的add_todolist方法中调用celery的tasks中的方法来建立爬虫。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def add_todolist(request):
if request.method == "POST":
body = request.POST['body']
add_date = datetime.datetime.now()
tag_type = 0
print(add_date)
print(body)
#add.delay(5,6)
cnki_spider.delay(body, add_date)
if body:
Todolist.objects.create(
body=body,
add_date=add_date,
tag_type=tag_type,
)
return HttpResponseRedirect('/todolist/')
else:
return HttpResponseRedirect('/todolist/')

cnki_spider.delay(body, add_date)这句话就是来调用爬虫的。
在知网工作完成后下载文件我使用了下面的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def download_todolist(request):
rowid = request.POST['rowid']
todolist_id = Todolist.objects.get(id=rowid)
print(todolist_id)
#todolist_id.add_date = request.POST['add_date']
def readFile(fn, buf_size=262144):#大文件下载,设定缓存大小
f = open(fn, "rb")
while True:#循环读取
c = f.read(buf_size)
if c:
yield c
else:
break
f.close()
the_file_name = "data_out_"+str(todolist_id.add_date)[11:19]+".xls"
print(the_file_name)
response = StreamingHttpResponse(readFile(the_file_name))
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment;filename="{0}"'.format(the_file_name)

return response

安装rabbitmq

在celery信息交互中我选择使用rabbitmq,因为之前用过,相对安装配置环节较为熟悉,安装rabbitmq可以参考我之前的博客.

启动项目

之前写的知网爬虫不需要做什么改动就可以直接拿来工作。只需要在爬虫工作结束后修改数据库中该条目的状态,从而可以让用户点击下载按钮对结果文件进行下载。
首先启动项目的命令为:

1
python manage.py runserver

在启动项目之后,使用下面的命令启动celery:

1
celery -A FirstWebsite worker -l info

还可以安装flower来监控celery的运行。安装命令为pip install flower,运行监控命令为:

1
celery flower -A proj --address=127.0.0.1 --port=5555

使用帮助

在输入框中添加需要爬取的关键字点击add按钮就可以了。当爬取完成后请刷新网页,如果完成,就会出现下载按钮,下载结果文件,点击delete按钮会删除记录和数据,

需要注意的

因为服务器带宽和存储有限,目前限制爬虫最多能爬取1000页,超过的部分会自动忽略。

本文作者:Qiu Qingyu
版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 CN许可协议。转载请注明出处!
本文永久链接:http://qiuqingyu.cn/2017/06/15/基于Django的网页版知网爬虫的实现/