当前位置: 首页 > news >正文

基于Web的爬虫系统设计与实现

全套资料下载地址:https://download.csdn.net/download/sheziqiong/85585280
全套资料下载地址:https://download.csdn.net/download/sheziqiong/85585280
目 录
1 绪论 1
1.1 选题背景及意义 1
1.1.1选题背景 1
1.1.2目的及意义 1
1.2 国内外发展现状 2
1.2.1 爬虫技术概述 2
1.2.2 爬虫设计者所面临问题和反爬虫技术的现状 4
1.3 研究主要内容 7
1.4 章节安排 8
2 系统开发环境及技术介绍 9
2.1 Robot协议对本设计的影响 9
2.2 爬虫 10
2.2.1 工作原理 10
2.2.2 工作流程 10
2.2.3 抓取策略 10
2.3 Scrapy架构 11
2.3.1 Scrapy:开源爬虫架构 11
2.3.2 Scrapy框架结构 11
2.3.3 两种继承的爬虫模式 13
2.4 MongoDB数据库 14
2.4.1 NoSQL数据库介绍 14
2.4.2 MongoDB数据库介绍 15
2.5 python web框架Django 15
2.5.1 Django框架介绍 15
2.5.2 MTV模式 15
2.5.3 ORM模式 15
2.5.4 template模板语言 16
2.5.5 Django工作机制 16
2.6 semantic UI开发框架 17
2.6.1 semantic介绍 17
2.6.2 semantic开发 17
2.7 高德地图API 17
3 可行性分析及需求分析 19
3.1 业务需求分析 19
3.2 功能性需求分析 19
3.2.1 数据爬取功能 19
3.2.2 数据可视化功能 20
3.3 可行性分析 21
3.3.1 技术可行性 21
3.3.2 经济可行性 21
3.3.3 法律可行性 22
4 总体设计 23
4.1 系统逻辑层次 23
4.2 系统分布式设计 24
4.3 系统功能设计 25
4.4 系统数据库设计 26
4.4.1 数据库环境搭建 26
4.4.2 数据库表设计 27
5 功能模块的设计与实现 28
5.1 数据爬取模块 28
5.1.1 爬取策略的设计 28
5.1.2 网页数据提取 30
5.1.3 去重与增量爬取 32
5.2 反反爬虫模块 33
5.2.1 模拟浏览器行为 33
5.2.2 动态代理IP 35
5.2.3 爬虫异常处理 36
5.3 数据存储模块 37
5.4 数据可视化模块 38
6 功能模块测试 42
6.1 测试环境及工具 42
6.2 系统功能测试 42
6.2.1 数据爬取功能测试 42
6.2.2 数据存储功能测试 44
6.2.3 数据反反爬虫功能测试 46
6.2.4 数据可视化功能测试 47
结束语 48
参考文献 49
致谢 50
3 可行性分析及需求分析
3.1 业务需求分析
本次通过对链家网广州二手房房源网站进行了研究分析,目标实现一个房源信息爬取的系统。本系统被用来解决互联网上关于房源信息繁杂,房源信息分散,无法通过短时间的用户浏览获得所需要的所有数据,其房源推荐系统数据来源严重不足等问题。本系统的目标是将链家网广州二手房的房源数据爬取下来,存储为较为干净的数据源,为房源推荐系统和数据分析者提供房价分析所需要的数据。
本系统的基本业务是围绕二手房房源信息展开的,应该完成的基本业务功能应该包括两方面的内容:
1.系统需要爬取链家网上的二手房房源信息
本系统本身并不生成房源信息数据,它所获得的房源数据来源是互联网房屋交易网站链家网。因为链家网并不向用户开放自己的数据库,所以系统需要通过爬取技术将来源网站上的所需数据获取得到。
2.系统需要对爬取到的数据进行数据可视化
本系统获取到的数据是存储在数据库中的,当需要对爬取数据进行查看时,特别是爬取到的房源数据量很大的时候,数据查看很不方便,而且数据库浏览界面太过单一,无法突出数据特点,所以通过使用界面以数据可视化的形式将爬取到的房源数据展示出来。
3.2 功能性需求分析
3.2.1 数据爬取功能
数据爬取功能是指将房源信息数据从数据来源网站爬取下来的功能。本系统是面向二手房信息的分布式爬取,原始数据来源于链家网广州二手房。分布式爬取是使用一个Master服务器和多个Slave服务器快速的对网页进行爬取,加快爬取速度和效率;Master端负责对目录页中的URL进行爬取和存储,Slave端负责对详情页的URL进行爬取和存储。

import scrapy
from scrapy.http.response.text import TextResponse
from datetime import datetime
import hashlib

from scrapy_lianjia_ershoufang.items import ScrapyLianjiaErshoufangItem


class ErshoufangSpider(scrapy.Spider):
    name = 'ErshoufangSpider'

    def __init__(self, name=None, **kwargs):
        super().__init__(name=None, **kwargs)
        if getattr(self, 'city', None) is None:
            setattr(self, 'city', 'sz')
        self.allowed_domains = ['%s.lianjia.com' % getattr(self, 'city')]

    def start_requests(self):
        city = getattr(self, 'city')
        urls = ['https://%s.lianjia.com/ershoufang/pg%d/' % (city, i)
                for i in range(1, 101)]
        for url in urls:
            yield scrapy.Request(url, self.parse, headers={'Referer': url})

    def parse(self, response: TextResponse):
        items = response.css('ul.sellListContent li')
        for li in items:
            item = ScrapyLianjiaErshoufangItem()
            item['title'] = li.css('div.title a::text').get().replace(':', '').replace(',', ' ').replace("\n", '')
            house_infos = li.css('div.address .houseInfo::text').re(
                r'\|\s+(.*)\s+\|\s+(.*)平米\s+\|\s+(.*)\s+\|\s+(.*)\s+\|\s+(.*)')
            item['room'] = house_infos[0]
            item['area'] = house_infos[1]
            item['orientation'] = house_infos[2]
            item['decoration'] = house_infos[3]
            item['elevator'] = house_infos[4]
            item['xiaoqu'] = li.css('div.address a::text').get()
            item['flood'] = li.css('div.flood .positionInfo::text').get().replace('-', '').strip()
            item['location'] = li.css('div.flood .positionInfo a::text').get()
            follow_infos = li.css('div.followInfo::text').re(r'(.*)人关注\s+/\s+共(.*)次带看\s+/\s+(.*)发布')
            item['follow_number'] = follow_infos[0]
            item['look_number'] = follow_infos[1]
            item['pub_duration'] = follow_infos[2]
            item['total_price'] = li.css('div.priceInfo div.totalPrice span::text').get()
            unit_price = li.css('div.priceInfo .unitPrice span::text').re(r'单价(.*)元/平米')
            item['unit_price'] = unit_price[0]
            item['total_unit'] = li.css('div.totalPrice::text').get()
            item['crawl_time'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            item['house_id'] = self.genearteMD5(''.join((str(item['title']), str(item['room']), str(item['area']),
                                                         str(item['orientation']), str(item['elevator']),
                                                         str(item['xiaoqu']),
                                                         str(item['flood']), str(item['location']))))
            yield item

    def genearteMD5(self, text):
        # 创建md5对象
        hl = hashlib.md5()
        hl.update(text.encode(encoding='utf-8'))
        return hl.hexdigest()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
全套资料下载地址:https://download.csdn.net/download/sheziqiong/85585280
全套资料下载地址:https://download.csdn.net/download/sheziqiong/85585280

相关文章:

  • Kubernets---配置 Pod 使用投射卷作存储
  • springcloud和分布式微服务学习笔记
  • 【“在路上”疫情信息检测】
  • `算法知识` 模意义下的乘法逆元
  • 微信小程序 | 游戏开发之接宝石箱子游戏
  • 丙烯酰氧乙基三甲基氯化铵(DAC)接枝聚苯乙烯伯胺微球微粒/聚苯乙烯包覆硅胶复合微球
  • 拿下Transformer
  • WPS-系统右键:开启后无法显示
  • C++学习笔记(1)--- 常量、数据类型、运算符
  • AI在工业机器人系统中的应用
  • mybatis一级缓存、二级缓存的意义是什么?
  • 在Github上封神的JDK源码,看完竟吊打了面试官,厉害了
  • 拿捏了,阿里2022最新JDK源码深度解析小册,Github全站热榜第二
  • 前端开发:JS中向对象中添加对象的方法
  • Vim编辑器常用操作手册
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • Elasticsearch 参考指南(升级前重新索引)
  • ES学习笔记(12)--Symbol
  • IDEA常用插件整理
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • JS专题之继承
  • MaxCompute访问TableStore(OTS) 数据
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • 爱情 北京女病人
  • 强力优化Rancher k8s中国区的使用体验
  • 小程序button引导用户授权
  • 学习Vue.js的五个小例子
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 走向全栈之MongoDB的使用
  • Hibernate主键生成策略及选择
  • ​力扣解法汇总946-验证栈序列
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #HarmonyOS:Web组件的使用
  • (2)STL算法之元素计数
  • (AngularJS)Angular 控制器之间通信初探
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (图)IntelliTrace Tools 跟踪云端程序
  • (学习日记)2024.01.09
  • (转)负载均衡,回话保持,cookie
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .net打印*三角形
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • @JsonFormat与@DateTimeFormat注解的使用
  • @SpringBootApplication 包含的三个注解及其含义
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成