使用Django开发爬虫系统

在本文中,我们将介绍如何使用Django开发一个简单但功能强大的爬虫系统。我们将使用Python编写爬虫,并将爬取到的数据存储到Django模型中,然后通过Django的管理页面管理这些数据。

1. 介绍

爬虫系统用于从互联网上收集信息,常用于数据分析、搜索引擎等领域。我们选择使用Django作为开发框架,因为它提供了强大的数据库管理和Web开发功能,能够帮助我们快速搭建一个稳健的爬虫系统。

2. 环境设置

首先确保您已经安装了Python,并使用pip安装了Django和其他必要的库:

pip install django requests beautifulsoup4

3. 创建Django项目

使用Django命令行工具创建一个新的项目:

django-admin startproject mycrawler
cd mycrawler

4. 定义模型

models.py文件中定义一个模型来存储爬取到的数据:

from django.db import modelsclass Article(models.Model):title = models.CharField(max_length=100)content = models.TextField()created_at = models.DateTimeField(auto_now_add=True)def __str__(self):return self.title

运行数据库迁移命令以创建数据库表:

python manage.py makemigrations
python manage.py migrate

5.具体代码

from django.shortcuts import render
from django.http import HttpResponse
from django.http import JsonResponse
import json
import bag
import re
from bs4 import BeautifulSoup
from tqdm import tqdm
import time
import randomdef index(request):return render(request, 'index.html')def get_url(city_name, item):session = bag.session.create_session()for cookie in bag.Bag.read_json(r'./static/cookies.json'):session.cookies.set(cookie['name'], cookie['value'])session.headers['Connection'] = 'close'js_data = bag.Bag.read_json('./static/city.json')judge = js_data.get(city_name)if judge:city = judge.split('/')[-1]js_data1 = bag.Bag.read_json('./static/menu.json')judge1 = js_data1.get(item)if judge1:return judge1.format(city), sessiondef get_shops(request):if request.method == 'POST':try:data = json.loads(request.body)if not bool(data.get('city')) and not bool(data.get('shopLink')):return JsonResponse({'message': '请选择城市'}, status=200)elif not bool(data.get('city')) and bool(data.get('shopLink')):  # 处理传入具体链接后续开发passelse:url, session = get_url(data.get('city'), data.get('selectedType'))def get_types():  # 正常传参pattern = re.compile(r'<a.*?href="(.*?)".*?<span>(.*?)</span></a>', re.S)if bool(url):resp = session.get(url)html = BeautifulSoup(resp.text, 'html.parser')soup = html.findAll('div', id='classfy')links = re.findall(pattern, str(soup))return linkselse:return Nonedef get_shop():links = get_types()pattern = re.compile(r'<div class="tit">.*?<a.*?data-shopid="(.*?)".*?href="(.*?)".*?title="(.*?)"'r'(?:.*?<div class="star_icon">.*?<span class="(.*?)"></span>.*?<b>(.*?)</b>)?'r'(?:.*?<b>(.*?)</b>)?'r'(?:.*?<div class="tag-addr">.*?<span class="tag">(.*?)</span>.*?<em class="sep">.*?<span class="tag">(.*?)</span>)?',re.S)number = re.compile(r'data-ga-page="(.*?)"', re.S)result = []print(len(links))for link in links[11:12]:  # 获取第一页resp = session.get(link[0])time.sleep(random.randint(1, 10))page = [int(i) for i in re.findall(number, resp.text)]page_num = sorted(page, reverse=True)[0]html = BeautifulSoup(resp.text, 'html.parser')soup = html.findAll('li', class_='')for i in soup:for j in re.findall(pattern, str(i)):result.append(j)if page_num >= 2:  # 获取第一页往后for count in tqdm(range(page_num)):try:resp1 = session.get(link[0] + 'p{}'.format(count + 1))time.sleep(random.randint(1, 5))# time.sleep(0.5)html1 = BeautifulSoup(resp1.text, 'html.parser')soup1 = html1.findAll('li', class_='')for k in soup1:info = pattern.search(str(k))if info:groups = list(info.groups())for i in range(len(groups)):if not groups[i]:groups[i] = 'null'result.append(tuple(groups))except Exception as e:print(e)continueelse:passreturn resultend = get_shop()bag.Bag.save_excel(end, f'./{data.get("city")}_{data.get("selectedType")}.xlsx')return JsonResponse({'message': 'Data received successfully'}, status=200)except json.JSONDecodeError as e:return JsonResponse({'error': 'Invalid JSON format'}, status=400)else:return JsonResponse({'error': 'Only POST requests are allowed'}, status=405)

index.html

<!DOCTYPE html>
<html>
<head><meta charset="utf-8" /><title>首页</title><link rel="stylesheet" href="../static/css/page.css" /><script type="text/javascript" src="../static/js/jquery.min.js" ></script><script type="text/javascript" src="../static/js/index.js" ></script>
</head>
<body><div class="left"><div class="bigTitle">爬虫管理系统</div><div class="lines"><div onclick="pageClick(this)" data-html="/text.html" data-title="文本爬虫"><img src="../static/img/icon-1.png" />文本爬虫</div><div onclick="pageClick(this)" data-html="/image.html" data-title="图片爬虫"><img src="../static/img/icon-2.png" />图片爬虫</div><div onclick="pageClick(this)" data-html="/music.html" data-title="音乐爬虫"><img src="../static/img/icon-3.png" />音乐爬虫</div><div onclick="pageClick(this)" data-html="/video.html" data-title="视频爬虫"><img src="../static/img/icon-4.png" />视频爬虫</div></div></div><div class="top"><div class="leftTiyle" id="flTitle">基于python实现的网络爬虫</div><div class="thisUser">当前用户:互联网民工</div></div><div class="content" id="contentDiv"></div><script>function pageClick(element) {var clickedElement = $(element);$('#contentDiv').empty();var htmlPath = clickedElement.attr('data-html');var pageTitle = clickedElement.attr('data-title');$.ajax({url: htmlPath,dataType: 'html',success: function (data) {$('#contentDiv').html(data);$('#flTitle').text(pageTitle); // 设置标题},error: function (xhr, status, error) {// 处理加载失败的情况}});}$(document).ready(function() {var defaultContent = "欢迎使用爬虫管理系统!请点击左侧功能以查看详细内容。"$('#contentDiv').html(defaultContent);});</script>
</body>
</html>

6. 部署

将Django应用部署到生产环境时,请确保使用安全的方法,并考虑使用Docker进行容器化部署,使用Nginx和Gunicorn进行Web服务器和应用服务器的配置等。

7. 体验地址

爬虫管理系统

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/806412.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Gin环境搭建详解

Gin环境搭建详解&#xff1a; 要安装Gin软件包&#xff0c;需要先安装Go并设置Go工作区。Gin环境搭建步骤如下&#xff1a; 【Gin框架】Gin环境搭建 Gin程序的热加载 Gin路由 GET POST PUT DELETE 1. 下载并安装 gin &#xff1a; $ go get -u github.com/gin-gonic/gin 2. …

Centos7下docker的jenkins下载并配置jdk与maven【图文教程】

个人记录 进入目录 cd /usr/local/JDK下载与配置 OpenJDK官网 下载安装 wget https://download.java.net/openjdk/jdk18/ri/openjdk-1836_linux-x64_bin.tar.gz解压 tar -zxvf openjdk-1836_linux-x64_bin.tar.gz ls ls jdk-18/编辑配置文件 vim /etc/profile配置环境变…

elementui树形组件自定义高亮颜色

1、需求描述&#xff1a;点击按钮切换树形的章节&#xff0c;同时高亮 2、代码实现 1&#xff09;style样式添加 <style> .el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content {background-color: #81d3f8 !important; //高亮颜色colo…

【C++题解】1005 - 已知一个圆的半径,求解该圆的面积和周长

问题&#xff1a;1005 - 已知一个圆的半径&#xff0c;求解该圆的面积和周长 类型&#xff1a;基础问题、小数运算 题目描述&#xff1a; 已知一个圆的半径&#xff0c;求解该圆的面积和周长。 输入&#xff1a; 输入只有一行&#xff0c;只有 1 个整数。 输出&#xff1a…

IJKPLAYER源码分析-OpenGL ES渲染

1 前言 IJKPLAYER在视频render之时&#xff0c;并非简单使用SDL渲染API&#xff0c;而是用了OpenGL ES&#xff0c;再分别在Android和iOS平台做视频的显示&#xff1b;一言以蔽之&#xff0c;OpenGL ES并不能做到直接在窗口上render并显示&#xff0c;而是需要一个中间媒介。这…

“AI程序员上岗:垂类大模型应用蓬勃发展“

AI程序员正在步入工作岗位&#xff0c;垂类大模型应用正迎来蓬勃发展的时期。随着人工智能大模型在各行业深入应用&#xff0c;像能自动编写代码的“AI员工”、智能客服的改进以及工业AI控制器的开发无需耗费大量时间&#xff0c;IT、工业生产、金融、服务营销等领域的垂类大模…

javaWeb网上零食销售系统

1 绪 论 目前&#xff0c;我国的网民数量已经达到7.31亿人&#xff0c;随着互联网购物和互联网支付的普及&#xff0c;使得人类的经济活动进入了一个崭新的时代。淘宝&#xff0c;京东等网络消费平台功能的日益完善&#xff0c;使得人们足不出户就可以得到自己想要的东西。如今…

[leetcode]remove-duplicates-from-sorted-list-ii

. - 力扣&#xff08;LeetCode&#xff09; 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,3,4,4,5] 输出&#xff1a;[1,2,5]示例 2&…

SpringCloudAlibaba-整合openfeign和loadbalence(三)

目录地址&#xff1a; SpringCloudAlibaba整合-CSDN博客 因为是order服务&#xff0c;调用user和product服务&#xff1b;所以这里在order模块操作&#xff1b; 1.引入依赖 <!--openfeign--> <dependency><groupId>org.springframework.cloud</groupId…

TestOps、TestDev、AIOps、NoOps

工具见&#xff1a;Katalon Platform | Integrations for End-to-End Software Testing 对于开发、测试、和运维又做了更为细节的划分&#xff1a; DevOps 开发兼运维 TestDev 开发兼测试 TestOps 测试兼运维 DevOps 和TestDev更注重编码能力&#xff08;本质就是开发&…

分类模型绘制决策边界、过拟合、评价指标

文章目录 1、线性逻辑回归决策边界1.2、使用自定义函数绘制决策边界1.3、三分类的决策边界1.4、多项式逻辑回归决策边界 2、过拟合和欠拟合2.2、欠拟合2.3、过拟合 3、学习曲线4、交叉验证5、泛化能力6、混淆矩阵7、PR曲线和ROC曲线 x2可以用x1来表示 1、线性逻辑回归决策边界 …

HarmonyOS 开发-阻塞事件冒泡

介绍 本示例主要介绍在点击事件中&#xff0c;子组件enabled属性设置为false的时候&#xff0c;如何解决点击子组件模块区域会触发父组件的点击事件问题&#xff1b;以及触摸事件中当子组件触发触摸事件的时候&#xff0c;父组件如果设置触摸事件的话&#xff0c;如何解决父组…

odoo中定期发送摘要邮件

在Odoo中&#xff0c;定期发送摘要邮件是一种常见的需求&#xff0c;特别是对于管理层或团队领导来说&#xff0c;他们可能希望在每天或每周定期收到系统的摘要信息&#xff0c;以便及时了解业务的进展情况。下面是如何在Odoo中实现定期发送摘要邮件的方法&#xff1a; 1. 创建…

HTML和markdown

总体情况 <p>在html的用处 在vscode中使用markdown [Markdown] 使用vscode开始Markdown写作之旅 - 知乎

如何训练自己的ChatGPT?需要多少训练数据?

近年&#xff0c;聊天机器人已经是很常见的AI技术。小度、siri、以及越来越广泛的机器人客服&#xff0c;都是聊天机器人的重要适用领域。然而今年&#xff0c;ChatGPT的面世让这一切都进行到一个全新的高度&#xff0c;也掀起了大语言模型&#xff08;LLM&#xff09;的热潮。…

MLT媒体程序框架01:概述

MLT官网 概述 MLT是一个开源的多媒体框架&#xff0c;专为电视广播而设计和开发。它为广播公司、视频编辑器、媒体播放器、转码器、网络流媒体和更多类型的应用程序提供了一个工具包。该系统的功能是通过各种现成的工具、XML创作组件和基于API的可扩展插件提供的。 它是通过…

python使用uiautomator2操作雷电模拟器9并遇到解决adb 连接emulator-5554 unauthorized问题

之前写过一篇文章 python使用uiautomator2操作雷电模拟器_uiautomator2 雷电模拟器-CSDN博客 上面这篇文章用的是雷电模拟器4&#xff0c;雷电模拟器4.0.78&#xff0c;android版本7.1.2。 今天有空&#xff0c;再使用雷电模拟器9&#xff0c;android版本9来测试一下 uiauto…

对接阿里云实时语音转文字的思路

将上述概念转化为详细代码需要一定的步骤。这里&#xff0c;我们将根据之前讨论的服务划分&#xff0c;创建一个简化的框架来模拟这个流程。注意&#xff0c;由于空间限制和简化目的&#xff0c;某些实现细节会被省略或简化&#xff0c;你可能需要根据实际情况进行调整。 1. 配…

华为2024年校招实习硬件-结构工程师机试题(四套)

华为2024年校招&实习硬件-结构工程师机试题&#xff08;四套&#xff09; &#xff08;共四套&#xff09;获取&#xff08;WX: didadidadidida313&#xff0c;加我备注&#xff1a;CSDN 华为硬件结构题目&#xff0c;谢绝白嫖哈&#xff09; 结构设计工程师&#xff0c;结…

FineBI概述

FineBI是一款商业智能&#xff08;BI&#xff09;软件&#xff0c;旨在帮助企业从数据中获取见解并做出更明智的业务决策。 具体来说&#xff0c;FineBI的主要功能和特点包括&#xff1a; 数据连接与整合&#xff1a;FineBI能够连接到各种数据源&#xff0c;如数据库、数据仓…