QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2584|回复: 0
打印 上一主题 下一主题

[其他资源] 基于Web的爬虫系统设计与实现

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2022-9-14 17:06 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    基于Web的爬虫系统设计与实现- V0 N! G/ B- d! y4 Q5 I7 k# I" k
    6 X6 S* i2 S. E0 L8 r
    全套资料下载地址:https://download.csdn.net/download/sheziqiong/85585280
    - A8 H; Y) }' t6 K全套资料下载地址:https://download.csdn.net/download/sheziqiong/85585280
    $ `% b) M: ]$ Q2 w# [3 z2 H目 录# j" [" N9 c7 p  B* A% h
    1 绪论 1
    5 l. Y2 o. c8 ~. p# g  K1 n/ }1.1 选题背景及意义 1* w' V& n8 \- P, r
    1.1.1选题背景 1! f7 c5 x, T0 L" B/ v' m6 V
    1.1.2目的及意义 1
    1 l  U8 n7 B( ]' V1.2 国内外发展现状 2
      W$ N1 K6 G( L; V" y# D1 p' h1.2.1 爬虫技术概述 2, o6 P( p9 _3 C6 t0 d
    1.2.2 爬虫设计者所面临问题和反爬虫技术的现状 4: z3 x2 M+ P+ ]) n) n& p
    1.3 研究主要内容 7
    3 _/ i6 a9 @3 }% b1.4 章节安排 8
    , p. s- j3 O% |' R) [* }. q2 系统开发环境及技术介绍 90 O. w7 d  u: m: ]0 h- \$ y
    2.1 Robot协议对本设计的影响 9+ J1 ~7 x3 t2 H  M
    2.2 爬虫 10
    5 h5 W7 _+ C# g2 [2.2.1 工作原理 10
    * ]/ T4 N7 x1 T) O5 P5 G2.2.2 工作流程 100 q  X1 u$ S& g( |" Z7 G3 V. W
    2.2.3 抓取策略 10
    6 G9 A5 z- @" z; J3 c7 W5 J+ F2.3 Scrapy架构 11
    6 X5 L# ]8 `+ _. e/ \; R; a# r2.3.1 Scrapy:开源爬虫架构 113 I% L6 E) c2 {2 \
    2.3.2 Scrapy框架结构 11* H7 @( k& r3 q) l
    2.3.3 两种继承的爬虫模式 13  w3 _- x3 W" N0 ^* [
    2.4 MongoDB数据库 14" x8 ]$ D$ Y# a7 a
    2.4.1 NoSQL数据库介绍 144 O, v4 m) q: z
    2.4.2 MongoDB数据库介绍 15* [7 ?& e5 H" ^5 ^
    2.5 python web框架Django 15" y3 r$ u# i3 f$ g  D. Y
    2.5.1 Django框架介绍 15
    0 Q9 F, D; {3 y' R5 u% r/ ^2.5.2 MTV模式 15
    ! M) w# U4 A& J" o% p2.5.3 ORM模式 15
    * ~( g  C' {# @5 J2.5.4 template模板语言 160 |1 p3 x0 u( m8 V/ Q
    2.5.5 Django工作机制 16% R% b: S6 R* e
    2.6 semantic UI开发框架 17/ r  E2 r; L- A- f  d/ J3 e% p
    2.6.1 semantic介绍 178 x; W/ F, N1 Z6 v
    2.6.2 semantic开发 17
    & K& k+ V. b2 G% l2 |2.7 高德地图API 176 @8 p( p+ Z- m7 M# T) O$ p
    3 可行性分析及需求分析 19
    * k$ d6 @% H0 `% F  `* j% e3.1 业务需求分析 19& |8 |0 z. S8 h- M- h  }7 t
    3.2 功能性需求分析 19
    , Y9 h/ a. a+ j$ h7 Y) R# x3.2.1 数据爬取功能 19
    : Z  ~. L. a% W) m- S3.2.2 数据可视化功能 20
    1 i) M1 {8 P. Z. Y; f; i3.3 可行性分析 21# d3 r6 l; e+ J" J& l) ~5 W0 O4 q
    3.3.1 技术可行性 21
    0 n( N' ^& Y0 w7 K. q# F3.3.2 经济可行性 21( `: f+ p' J3 A5 U% \
    3.3.3 法律可行性 22/ {- h2 F# _6 o2 g5 j8 e
    4 总体设计 23# r! p0 T' M( a  z# a
    4.1 系统逻辑层次 238 V: z. S/ T' M. i- @8 l0 p
    4.2 系统分布式设计 24. [* S, C# D0 z) |
    4.3 系统功能设计 25
    $ j. @# V+ p1 P' w# D4.4 系统数据库设计 26
    " H: ?5 k, D- N* }4.4.1 数据库环境搭建 26' l4 P& Z* a) S
    4.4.2 数据库表设计 27
    1 y- r* W6 U+ w% A- ]  K5 功能模块的设计与实现 288 w9 I$ M1 p) q- M) N+ s" _
    5.1 数据爬取模块 28
    2 M1 D; j% z( M- ^% V9 M6 [& z7 `5.1.1 爬取策略的设计 28
    : M: v/ ]8 m3 M; B1 w% ~5.1.2 网页数据提取 30
    4 Z0 [! H% t$ q% W# g; v. Y5.1.3 去重与增量爬取 32
    9 n- R  Y/ ~; G* n2 D0 U  z9 ^6 U5.2 反反爬虫模块 33
    8 {9 g; C4 Y) _1 H( Y5.2.1 模拟浏览器行为 338 [1 J; k3 L, o/ N- V# G
    5.2.2 动态代理IP 35& K! S8 B4 H2 n+ F. ?6 d
    5.2.3 爬虫异常处理 36
    8 m  Y9 R: }/ M  b5.3 数据存储模块 379 t+ R+ F' c4 x4 ~0 M0 |
    5.4 数据可视化模块 38
    # U8 p; p! E0 g& J2 [6 功能模块测试 42
    . p( S$ d- X) |. y) D6.1 测试环境及工具 42
    % d( Z4 }8 A. E2 [7 B* i" L6.2 系统功能测试 42
    1 `6 _6 s7 |3 _  e, R6.2.1 数据爬取功能测试 42
    " H9 H7 G$ M9 d: f9 T) c1 N  n# ^6.2.2 数据存储功能测试 441 b9 F$ B1 s" u4 Q5 r( b+ P
    6.2.3 数据反反爬虫功能测试 46  \( h- i" V! K2 N
    6.2.4 数据可视化功能测试 47/ A- y3 M4 U$ s, j1 A; [5 X
    结束语 48# D5 w4 v& f2 ^8 s
    参考文献 490 [% B2 [4 |7 s# Z' s
    致谢 50
    ) i* X" H; V. N$ Y0 f- a3 可行性分析及需求分析
    / \- E, G1 }/ |. p6 F3 P4 R3.1 业务需求分析
    ! Y, q# T3 s8 T7 n8 h本次通过对链家网广州二手房房源网站进行了研究分析,目标实现一个房源信息爬取的系统。本系统被用来解决互联网上关于房源信息繁杂,房源信息分散,无法通过短时间的用户浏览获得所需要的所有数据,其房源推荐系统数据来源严重不足等问题。本系统的目标是将链家网广州二手房的房源数据爬取下来,存储为较为干净的数据源,为房源推荐系统和数据分析者提供房价分析所需要的数据。
    1 I# ~: {2 g% I/ W& Z本系统的基本业务是围绕二手房房源信息展开的,应该完成的基本业务功能应该包括两方面的内容:
    ! ^% O$ H2 C8 i  ~( T5 F8 G1.系统需要爬取链家网上的二手房房源信息
    ; u8 O% \* O' q本系统本身并不生成房源信息数据,它所获得的房源数据来源是互联网房屋交易网站链家网。因为链家网并不向用户开放自己的数据库,所以系统需要通过爬取技术将来源网站上的所需数据获取得到。
    ) Y0 l: m* v: }5 y* v0 v2.系统需要对爬取到的数据进行数据可视化1 ^( j' @2 }& ~; a
    本系统获取到的数据是存储在数据库中的,当需要对爬取数据进行查看时,特别是爬取到的房源数据量很大的时候,数据查看很不方便,而且数据库浏览界面太过单一,无法突出数据特点,所以通过使用界面以数据可视化的形式将爬取到的房源数据展示出来。4 G& n7 z! n1 e- ~
    3.2 功能性需求分析
    + A0 M% k* u) }; f- l+ U' g3.2.1 数据爬取功能0 c% w2 z" ?2 S8 ]/ {
    数据爬取功能是指将房源信息数据从数据来源网站爬取下来的功能。本系统是面向二手房信息的分布式爬取,原始数据来源于链家网广州二手房。分布式爬取是使用一个Master服务器和多个Slave服务器快速的对网页进行爬取,加快爬取速度和效率;Master端负责对目录页中的URL进行爬取和存储,Slave端负责对详情页的URL进行爬取和存储。  C+ `# Q; ^) k9 \. p* T

    8 N/ k% M, W5 O/ o, U" c5 H' ?import scrapy9 q7 w/ t1 g) z$ J0 \
    from scrapy.http.response.text import TextResponse& C% X1 T9 E9 n4 U' R
    from datetime import datetime2 s  V! K5 y9 O# }+ G6 q
    import hashlib
    $ \* Z' t5 `; X
    . d' G. s/ ?) ]& e" Q: Sfrom scrapy_lianjia_ershoufang.items import ScrapyLianjiaErshoufangItem
    ( _5 c; a9 o+ V! v  H; M2 a( a# r

    ; v7 t0 n4 L! s' n: gclass ErshoufangSpider(scrapy.Spider):
    % k7 U8 s; w  ~6 f+ u4 ?: G    name = 'ErshoufangSpider'0 n. R2 n8 K/ x& P  `* u8 Q

    7 j$ O, S: F+ G7 i; Q    def __init__(self, name=None, **kwargs):
    - t9 j5 b0 k$ A+ ?* Q) L9 s        super().__init__(name=None, **kwargs)! n% W- S; O- [& W% L
            if getattr(self, 'city', None) is None:
    % c$ b7 w* |) K% c5 n            setattr(self, 'city', 'sz')
    5 z- r8 t" s+ D; L# M        self.allowed_domains = ['%s.lianjia.com' % getattr(self, 'city')]( w) ~9 X; _, T  S7 q
    7 G+ M: b6 t# Y8 w: E  I3 w+ A
        def start_requests(self):
    0 @3 q4 Z7 d% d" j. a2 m8 ~- g        city = getattr(self, 'city')6 @* T( d- O0 E
            urls = ['https://%s.lianjia.com/ershoufang/pg%d/' % (city, i)
    0 o7 d, m4 X: O- S+ z8 Q                for i in range(1, 101)]* U" ^  L0 U: y) y" n! J
            for url in urls:1 t$ G! X% l; v( R  e5 {
                yield scrapy.Request(url, self.parse, headers={'Referer': url})4 Q. [. T  I8 O$ e

    6 P+ m, q* C+ h* l. m8 J    def parse(self, response: TextResponse):
    9 P5 s) T6 }: n% o# w7 B        items = response.css('ul.sellListContent li')
    ! S/ e+ l" h9 F        for li in items:" X- ~9 E' O/ K, R4 \  o9 ?
                item = ScrapyLianjiaErshoufangItem()
    3 l1 b4 I9 S% O- P1 G            item['title'] = li.css('div.title a::text').get().replace(':', '').replace(',', ' ').replace("\n", ''): L. m( H8 V7 z' b" Y; ~: Z
                house_infos = li.css('div.address .houseInfo::text').re(8 F1 S% h& `) _% [
                    r'\|\s+(.*)\s+\|\s+(.*)平米\s+\|\s+(.*)\s+\|\s+(.*)\s+\|\s+(.*)')
    2 u, R" x5 \# |* B            item['room'] = house_infos[0], p! \' d3 Y4 V4 y# D% i
                item['area'] = house_infos[1]1 ?+ }! y' @1 ?1 Y6 G' y
                item['orientation'] = house_infos[2]
    3 K9 C" _7 y4 k4 N7 Y+ D3 K            item['decoration'] = house_infos[3]
    4 Q: g0 |( [" c& f3 q            item['elevator'] = house_infos[4]8 x+ z6 C: f. Y- P' L, \
                item['xiaoqu'] = li.css('div.address a::text').get()
    $ B7 v) [1 F0 _5 o            item['flood'] = li.css('div.flood .positionInfo::text').get().replace('-', '').strip()) X' H$ \. c  b2 C
                item['location'] = li.css('div.flood .positionInfo a::text').get()( q3 [+ W4 R: O  o
                follow_infos = li.css('div.followInfo::text').re(r'(.*)人关注\s+/\s+共(.*)次带看\s+/\s+(.*)发布')
    % A& l( o+ D0 V: H+ b            item['follow_number'] = follow_infos[0]. ?8 {. V, T( ]3 B  l2 _
                item['look_number'] = follow_infos[1]. B3 B7 z, C7 g5 I! X+ R  h5 w
                item['pub_duration'] = follow_infos[2]5 x  E6 n4 e8 @* }$ Y: g
                item['total_price'] = li.css('div.priceInfo div.totalPrice span::text').get(). J" E( k  N! C' ]2 }
                unit_price = li.css('div.priceInfo .unitPrice span::text').re(r'单价(.*)元/平米'), i, `1 I; H" V
                item['unit_price'] = unit_price[0]
    5 w. i1 W- V: E            item['total_unit'] = li.css('div.totalPrice::text').get(). ]; i+ {: R4 C
                item['crawl_time'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    0 X& `5 N6 G( d& S9 H; T# j* l* M            item['house_id'] = self.genearteMD5(''.join((str(item['title']), str(item['room']), str(item['area']),
    & r$ K; R* ~( \                                                         str(item['orientation']), str(item['elevator']),
    $ s! u0 u7 X# w1 x* a* }- |                                                         str(item['xiaoqu']),
    2 `% N$ E8 }2 T) x. y                                                         str(item['flood']), str(item['location']))))* ]: g4 d; c8 ]: j3 K" R
                yield item
    $ ^0 f( ~! l" {
    - h/ p6 o$ y% x% \1 V3 t1 ~5 L, p    def genearteMD5(self, text):
    - @3 M& i: ~. S( r% p5 C3 Z* y        # 创建md5对象
      v, l# C& F8 N        hl = hashlib.md5()* G; L* a& ~& `; n# d( q, l
            hl.update(text.encode(encoding='utf-8'))2 G/ L  W. k- z# B+ m
            return hl.hexdigest()* w  r9 ]7 q& w

    6 N/ p% j4 s0 J+ M8 C7 f3 w' n5 [& S, t# H0 _
    1
    & C" r- ?3 g( E7 p3 \/ b. S2
    : o; \$ R$ N( n. a3
    5 ~- l0 c- H- k$ K4
    5 H! o7 T; q5 r5
      B) g0 h) A! o$ s! y# x6
    6 y5 t% Y+ r+ O" }, l5 d8 m& y7
    : l7 J$ a1 Z: K: Q* T" Y; u9 M( D8+ G3 }$ q% x) X! Z
    9
    $ `) g: q7 w4 D" d. x) R10, Z" G5 Z2 y! H* v, \  n
    11
    ; e$ H" N; ?$ L( h/ P2 e% T12
    6 }3 k2 {# n) {: d4 ?; R130 P  a! H: l6 p
    14/ `2 y9 O) w, K5 m& N
    157 W1 i% b# C2 g+ l/ c
    16
    ) ~* E3 J! z) k17
    9 M! S/ y: P2 ^: O5 h18$ E/ y7 _, f3 L: X4 Y" a
    19" J7 Y7 M# y7 Z" ^( p" D
    20* z9 Q) y+ \; c4 t' F6 ]
    21( w: d0 S/ V. d/ B( ^1 w
    22) b* B1 O. d, s" ~9 a9 ?1 Y
    23
    ! m6 K2 [; f- X) I) h1 }24
    ( K- k- e# k: l- |% v  Q25
    9 ]# p* J# q& J5 }/ H3 _) M26
    0 K9 `' ~8 ~7 L" G' N0 A279 Y+ V4 n* e6 O7 _$ x1 E: y
    28
    $ [  |5 U& o/ {, N9 @) S6 J295 r4 a2 Z6 I( R* Z, \
    301 E' B8 _; d& |1 E1 r
    31+ E9 o+ P! R/ E" F0 a
    32' ?0 M- A9 `* t7 S6 ]8 R
    33
    " F+ {- ?3 J, v3 z: Z349 V2 ]2 K" y; W0 |* O
    35
    . f! h3 }6 L- h! n36
    ( u* C; ~" B- t3 A9 z379 F! l$ B4 j: H1 j9 x
    38. ~9 a( I% a1 W& o. y# w! V9 f
    39
    ( s/ {0 g- @1 V! ^  L9 u402 g' U8 q0 @7 u) J
    416 m2 m! y2 g+ S8 Y6 x
    424 R! T; U- S+ L
    43
    . z% E5 u$ {) {$ P- y/ I44" u. m. P9 d5 s9 S9 P& o. S
    45
    3 N3 I$ d) M: }9 B" x, N46
    6 C5 m8 C+ o: Z/ \- W$ H47
    ) X0 ^4 v9 h  i486 C$ p, h  S) H
    49
    & V3 o1 P' }3 J+ w3 ~7 m; k50
    : I2 O6 P$ n2 p, j, X$ E1 q51
    5 n; n  {% q4 T. c# V527 J) j6 P6 u& F% u0 A
    536 n. b1 w( v3 w0 U+ o9 a+ ]( {
    54
    ; |6 @* i8 ]# a/ ~9 F55" s7 C9 q# d' n9 z8 T9 V9 N& R
    56
    2 T' h( A# Y6 U% N) H57% `: A" @' Q5 k8 a- }
    58
    ) y! z5 B- p! @59! g& ]- v+ Z; F/ X2 t6 q) y- Y+ F
    604 h+ t4 }# n+ ?
    5 q' }& ]$ x; o4 s$ j1 |

    " _, L+ p5 Z, K# d0 L* I8 C# q: h
    ! y8 ]2 u2 x  _  J# V4 }# ?8 d# J3 U5 A, N

    / H5 E( O# D& D8 c
    $ S# e3 t1 a" X% Z7 x$ `
    1 F. \! b- D$ v- o' u
    ; |. g( E1 r" Q3 g: A* p/ M1 a# I% v. _

    2 j+ Z4 o- S  q/ K% Q2 k
    2 f( \% `% @  ^5 b, `6 K; c* b# v+ m' C5 R4 f
    0 [+ Y* e' [! B0 f0 F' q/ I4 ]
    - l/ C: b( [: Q. L; a: x  z

    7 E% W& T% t3 m3 A* i% y9 m9 `: K2 u7 J1 Y! d- n
    全套资料下载地址:https://download.csdn.net/download/sheziqiong/855852806 b0 f: @& V$ ~; h3 Z7 w: K
    全套资料下载地址:https://download.csdn.net/download/sheziqiong/85585280
    4 j8 X9 ?6 X4 T3 I( d————————————————/ m/ q( M1 Z1 S+ q, ?2 y+ [# d
    版权声明:本文为CSDN博主「biyezuopin」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    . }4 ]8 f5 k# A+ a% e原文链接:https://blog.csdn.net/sheziqiong/article/details/126814418; I6 l0 e! \( k1 T4 g2 |& N
    : N6 P: {2 q6 I0 h1 [

    0 L% a- x6 A3 P  F
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2025-8-16 07:28 , Processed in 0.476489 second(s), 50 queries .

    回顶部