$ F+ @7 Z' Y& X ) Z" I1 l9 L/ f, s+ m- Zclass ErshoufangSpider(scrapy.Spider):7 d. J6 o3 S' D) `2 T5 O- F
name = 'ErshoufangSpider' ) p7 V* k: T' ] 4 Q) ^$ i: q8 e& H def __init__(self, name=None, **kwargs): 1 l+ O4 W& {: S3 S! v7 p super().__init__(name=None, **kwargs)* l2 u3 }6 U) i) M! D) _
if getattr(self, 'city', None) is None: 5 i- |4 w `) A$ m setattr(self, 'city', 'sz') 0 h4 D' w. ^+ C. z self.allowed_domains = ['%s.lianjia.com' % getattr(self, 'city')] 9 x) f" r" N9 F# m6 E9 u0 M; ?8 }- e- z8 e7 b$ l
def start_requests(self): 4 z* e; ]3 J- P' m6 I, ] city = getattr(self, 'city')# V; C B% c% ~
urls = ['https://%s.lianjia.com/ershoufang/pg%d/' % (city, i) " ~7 B+ H' d& h, ^) ` for i in range(1, 101)] 1 H S/ o& z/ ]0 E! ~ for url in urls:; Q: W* s$ u7 |/ {3 ^
yield scrapy.Request(url, self.parse, headers={'Referer': url}) % g5 r8 L O6 l% z; e; ?! g4 o6 X. I+ A
def parse(self, response: TextResponse): : E. y/ K9 s1 T3 Z' j items = response.css('ul.sellListContent li') 9 u/ u' @5 g6 W for li in items:8 i' D" Y% G5 k( E
item = ScrapyLianjiaErshoufangItem()* c" {' {9 K; A) k6 ^1 }4 R
item['title'] = li.css('div.title a::text').get().replace(':', '').replace(',', ' ').replace("\n", '') * F% Y/ F: b/ Z4 {3 j* N" R% z house_infos = li.css('div.address .houseInfo::text').re(4 _0 Y5 p8 ?6 b; t0 ?1 X1 g @
r'\|\s+(.*)\s+\|\s+(.*)平米\s+\|\s+(.*)\s+\|\s+(.*)\s+\|\s+(.*)') 6 N* D! v( p6 j. G item['room'] = house_infos[0]/ Y2 n) b" {% h
item['area'] = house_infos[1]: N% n6 i1 |1 }
item['orientation'] = house_infos[2]) `/ L% K* a) t* }- @
item['decoration'] = house_infos[3] 5 B) T( \. w' d' L6 N item['elevator'] = house_infos[4] : Q! [4 Z7 X) ]6 O item['xiaoqu'] = li.css('div.address a::text').get()* ^1 |, R8 k4 I' r4 J* y% h0 |
item['flood'] = li.css('div.flood .positionInfo::text').get().replace('-', '').strip()8 E0 _4 c! b# t& X9 \; \
item['location'] = li.css('div.flood .positionInfo a::text').get(): r$ e9 k8 K6 P2 u' `" \$ J
follow_infos = li.css('div.followInfo::text').re(r'(.*)人关注\s+/\s+共(.*)次带看\s+/\s+(.*)发布')& B, h2 ]7 T: g# e: e
item['follow_number'] = follow_infos[0] 4 V( q7 g1 S% | item['look_number'] = follow_infos[1] , [: K* C; ~6 ?0 o' j9 a4 [ item['pub_duration'] = follow_infos[2]0 v5 v3 s7 I* `6 `! x4 u! X
item['total_price'] = li.css('div.priceInfo div.totalPrice span::text').get() 0 b6 f3 H* j: `% s7 g: ?/ f5 I unit_price = li.css('div.priceInfo .unitPrice span::text').re(r'单价(.*)元/平米')8 U) ~' M u* h8 u4 U: S$ g. B
item['unit_price'] = unit_price[0] 7 V: D0 ~5 q& H5 \' U) P item['total_unit'] = li.css('div.totalPrice::text').get() % V4 y. h0 x' k- h) a# X item['crawl_time'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') 1 O t5 w" s. p4 D9 Q item['house_id'] = self.genearteMD5(''.join((str(item['title']), str(item['room']), str(item['area']), v: N3 f- l# H0 c; e ~* R' E
str(item['orientation']), str(item['elevator']), , G$ w V6 @8 T% O h str(item['xiaoqu']),! i; a, v. z3 g1 y* T+ v+ _
str(item['flood']), str(item['location'])))) 3 Z2 F8 Y6 j9 S% W yield item3 Z+ x" n7 M% A! Z! l
8 D0 [2 f/ s k+ P. J5 L def genearteMD5(self, text): + T; ^% z( H# ` # 创建md5对象 9 P8 W, P; ?% a" Y1 | hl = hashlib.md5()% \5 k& N0 S) B& A: u0 _% k
hl.update(text.encode(encoding='utf-8')) ?7 I0 @; D3 q6 t7 T
return hl.hexdigest() ' e" ]& ~" N% L1 r7 m) L3 e g1 l# J) h: G( C. o e3 m2 y5 o7 `" e: ~18 Q; O0 G# K7 A* v8 e
2+ u# `1 J$ Q: k0 u9 U* n4 s
3# \/ c4 I' X0 @0 L" q6 J
43 `- g' d% a( d1 ?' v
5+ E6 x& f, ~* _& @) ]' F( ]. M, X7 r
6) h* ? G0 ]) I9 W9 q1 B: j }
7. @2 i; @0 C% g, |6 s& G" k7 n
8 8 U9 P& ^5 w$ z3 C; J9 0 F6 I4 I j% l1 n7 H/ P10 ; o2 Q' K$ w/ `8 y% A+ Z11; f; V1 n6 G; _! E& J$ ^
12 . _5 l; u$ ]1 W* {* {13) H/ L: J( k0 d$ i' {( e
14$ z/ t8 [7 q! J- h* G
15 f6 p5 g2 Y# T& ^4 ]7 F169 L/ c9 C) f& w1 E* m
17$ m7 |, L. O( P, Y
18 ( {4 d* b. m4 }% Q* l7 b198 [% K# n) c4 z* d
20/ I' |. m& G) g6 t4 C" R: t
21 9 O H# k2 q! U8 y" |9 m5 z7 A22/ h* }0 L2 F, P$ R3 U
23 $ o% a; c% Y5 s24 3 V) f. Y ?. T# ~# }2 `- u25; |4 e9 i% U3 @& z4 {
26# b# s) Z& [% N( c( T8 I6 U7 r2 R5 x
27. ~* S. ^) [+ r3 Y+ }- k
28) B' r1 I# D5 x0 V7 p7 l
29- \" Y0 B& v5 K j: p! ]
30 Z4 L/ W# ]8 B4 K+ j$ _3 @31 # _' m1 U+ i2 f32 5 V7 [1 B: ?, p6 u) _+ p/ K337 }' a1 f0 `9 _; O8 I e( j" k+ B m
34 , z9 X5 u5 s' f: \9 ?352 d! Q* _8 z' E( ?; t3 N
36 1 T4 E. {% M( i, X" ?) X37 " W$ n5 x; s2 @) `2 w0 c. b! Y& u, q38 9 L( X* H# ^9 b) G% {) n. R! O39; L+ z* \( |& [. Q( ~
40. l6 `7 _$ { a, o, f: M8 k
41 9 O* _: o" ^# ^5 q0 I' J42 ' z; o0 Y6 `2 G+ I/ W; F# f438 p5 Z7 I3 M; H; N1 f5 ~
44 5 A. W; G* R4 ^# j45 % a6 v8 g V6 I46 / b) b' i' K# {# ]1 t8 c47 1 o4 M# ^5 A- H: ~& f48 " Y0 f" b( y; c8 h! ]% E% R2 K. H. l7 b49 + ~3 ^! K& k( N7 z505 k2 t' m( B; h
51 5 X# _% w5 D+ q52 0 {/ Y( |4 y F% t; k1 L53! C/ a, P& v5 P: g" U( `
54* c% c) b. w; M7 C4 Y t' X0 k( I
55 ( y% P8 _7 ]- k- x56 ; T3 J# L0 g1 C( R$ i- I573 f% v" U' Z9 a7 L
58 # a; w/ n% E3 @; w59- Q Z6 W) X- [* I
60 : \2 J9 z) w5 |/ @' h1 d7 C# m& p
6 E: T$ o4 ~& q" [7 l( T5 F0 x) B$ l! W: e5 J# q
( `. R0 ^. n D' K & D+ t6 ]- O$ z3 {/ S# G " G y/ x3 n! K: b/ p6 P( @: ?! T* g n
5 G. C2 ? x1 e, M o( o, y
+ C9 f- I+ z' @2 [
- [7 P X3 K. {0 ]$ O4 n3 g
2 v8 v% H% Q( Z L" J
" E8 h: ]6 }3 U/ Z( V6 G6 H( Z$ B5 ^( z- @3 S) N# I: e' J
3 Q' o* F, O* u( f' e
$ ~+ Y5 [" {0 o. m: U5 ^ * @) y7 x$ i" |全套资料下载地址:https://download.csdn.net/download/sheziqiong/855852802 N8 z( t+ V5 M! Q1 T3 s" x1 I
全套资料下载地址:https://download.csdn.net/download/sheziqiong/85585280 * \' Q4 m& V- D9 W: `4 S8 |+ l————————————————3 e( }! \) U2 m% W5 [
版权声明:本文为CSDN博主「biyezuopin」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。% i, _9 a7 B" y
原文链接:https://blog.csdn.net/sheziqiong/article/details/1268144182 Y% R: J/ ]& V; ?, L
8 F `& }( F, c, c2 u7 E5 r