目录
课题项目源码功能介绍
基于Python大数据技术进行网络爬虫的设计,框架使用Scrapy.
系统设计支持以下技术栈
前端开发框架:vue.js
数据库 mysql 版本不限
后端语言框架支持:
1 java(SSM/springboot)-idea/eclipse
2.python(flask/django)–pycharm/vscode
3.Nodejs+Vue.js -vscode
4.php(thinkphp/laravel)-hbuilderx/vscode
数据库工具:Navicat/SQLyog等都可以
具体实现截图
开发流程
1)环境搭建
搭建符合课题开发的环境。如果采用支持高可用的系统(例如hdfs,Hbase,Flink,Spark 等),集群至少3台服务器;
2)数据采集。可选项,根据课题需要完成数据采集的设计与开发。
3)数据预处理。
对于有缺失值的记录,按照自己定义的规则或补充或舍弃处理,对于类型数据按照规则映射为数值;对于不平衡数据需要有相应的处理措施。
4)数据存储。
必须使用数据库保存数据。 推荐使用NoSQL数据库,如 MongoDB、 Redis 等数据库,也可以使用关系数据库保存数据,如 MySQL;开发过程需要包括数据库需求分析、数据库设计、数据库建立、数据输入等部分。
5) 数据分析与预测
使用合理的数据计算框架实现数据分析,例如:Tensorflow/Pytorch、Hadoop、hive、Spark等;根据课题选择、比较各算法性能;构造出基于最佳算法的框架,编程实现并测试选取不同参数时对算法性能的影响;
6) 数据可视化
对模型建立、数据分析结果用不同可视化方式进行可视化分析。此部分可以增加对用户/会员管理功能。推荐采用B/S结构实现。
2.具体要求:
1)独立开发设计系统的模块程序,遵循软件工程开发周期进行,包括需求分析、总体方案制定、详细设计和功能规划、编程实现、调试等;
2)所开的系统能正常运行在所选的平台上,并实现相关模块的功能;
3)提供系统模块框架分析图、模块功能说明图、系统平台设计图、各分模块实现框图,在设计文档中体现;
Scrapy爬虫框架
网络爬虫是依靠预先设定好的规则而进行自动的抓取网络信息的过程 。网络爬虫通过解析网页,自动获取网页的数据。相较于人工去获取网页数据,无疑是要方便许多。本文使用 Python 的 Requests 库和 Beautifulsoup 库去解析链家网页,获取数据。同样是网络爬虫的一种。当然,网络爬虫也是有缺点的,它在对网页进行爬取时,可能会触发网页的反爬机制,从而导致失败。所以在编写爬虫程序的时候就要想办法绕过反爬机制,增加了工作量。而且网络爬虫必须要遵守相关法律法 规,不能够恶意的去爬取一些网站的信息。
Scrapy是一个Python编写的强大,灵活的网络爬虫框架和数据提取工具。它使用异步I/O网络库Twisted进行高效的爬取,并将提取到的数据存储到多种格式中。然而,在需要大规模爬取复杂的网站时,单机爬虫速度会受到限制。为了解决这个问题,Scrapy提供了分布式爬虫系统
爬虫核心代码展示
import scrapy
import pymysql
import pymssql
from ..items import xiangmuItem
import time
import re
import random
import platform
import json
import os
from urllib.parse import urlparse
import requests
import emoji
class xiangmuSpider(scrapy.Spider):
name = 'xiangmuSpider'
spiderUrl = 'https://url网址'
start_urls = spiderUrl.split(";")
protocol = ''
hostname = ''
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# 列表解析
def parse(self, response):
_url = urlparse(self.spiderUrl)
self.protocol = _url.scheme
self.hostname = _url.netloc
plat = platform.system().lower()
if plat == 'windows_bak':
pass
elif plat == 'linux' or plat == 'windows':
connect = self.db_connect()
cursor = connect.cursor()
if self.table_exists(cursor, 'xiangmu') == 1:
cursor.close()
connect.close()
self.temp_data()
return
list = response.css('ul.subject-list li.subject-item')
for item in list:
fields = xiangmuItem()
fields["laiyuan"] = self.remove_html(item.css('div.pic a.nbg::attr(href)').extract_first())
if fields["laiyuan"].startswith('//'):
fields["laiyuan"] = self.protocol + ':' + fields["laiyuan"]
elif fields["laiyuan"].startswith('/'):
fields["laiyuan"] = self.protocol + '://' + self.hostname + fields["laiyuan"]
fields["fengmian"] = self.remove_html(item.css('div.pic a.nbg img::attr(src)').extract_first())
fields["xiaoshuoming"] = self.remove_html(item.css('div.info h2 a::attr(title)').extract_first())
detailUrlRule = item.css('div.pic a.nbg::attr(href)').extract_first()
if self.protocol in detailUrlRule:
pass
elif detailUrlRule.startswith('//'):
detailUrlRule = self.protocol + ':' + detailUrlRule
else:
detailUrlRule = self.protocol + '://' + self.hostname + detailUrlRule
fields["laiyuan"] = detailUrlRule
yield scrapy.Request(url=detailUrlRule, meta={'fields': fields}, callback=self.detail_parse)
# 详情解析
def detail_parse(self, response):
fields = response.meta['fields']
try:
if '(.*?)' in '''div#info span a::text''':
fields["zuozhe"] = re.findall(r'''div#info span a::text''', response.text, re.S)[0].strip()
else:
if 'zuozhe' != 'xiangqing' and 'zuozhe' != 'detail' and 'zuozhe' != 'pinglun' and 'zuozhe' != 'zuofa':
fields["zuozhe"] = self.remove_html(response.css('''div#info span a::text''').extract_first())
else:
fields["zuozhe"] = emoji.demojize(response.css('''div#info span a::text''').extract_first())
except:
pass
# 去除多余html标签
def remove_html(self, html):
if html == None:
return ''
pattern = re.compile(r'<[^>]+>', re.S)
return pattern.sub('', html).strip()
# 数据库连接
def db_connect(self):
type = self.settings.get('TYPE', 'mysql')
host = self.settings.get('HOST', 'localhost')
port = int(self.settings.get('PORT', 3306))
user = self.settings.get('USER', 'root')
password = self.settings.get('PASSWORD', '123456')
try:
database = self.databaseName
except:
database = self.settings.get('DATABASE', '')
if type == 'mysql':
connect = pymysql.connect(host=host, port=port, db=database, user=user, passwd=password, charset='utf8')
else:
connect = pymssql.connect(host=host, user=user, password=password, database=database)
return connect
# 断表是否存在
def table_exists(self, cursor, table_name):
cursor.execute("show tables;")
tables = [cursor.fetchall()]
table_list = re.findall('(\'.*?\')',str(tables))
table_list = [re.sub("'",'',each) for each in table_list]
if table_name in table_list:
return 1
else:
return 0
论文书写大纲
绪论
1.系统分析
1.1需求分析
1.2所采用的技术关键
2系统总体设计
2.1总体功能
2.2处理流程设计
3系统详细设计
3.1概念结构设计
3.2数据库设计
3.3数据模块设计
4系统调试与测试
4.1测试环境简介
4.2测试目标
4.3测试方法
4,4程序测试
5结论
参考文献
致谢
详细视频演示
请联系我获取更详细的演示视频
源码获取
文章最下方名片联系我即可~
标签:颈椎病,python,fields,self,爬虫,detailUrlRule,可视化,connect,import From: https://blog.csdn.net/abo2020/article/details/144460918