libcraigscrape 1.1.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,6 +1,11 @@
1
1
  == Change Log
2
2
 
3
- === Release 1.1
3
+ === Release 1.1.1 (January 20, 2013)
4
+ - A new posting format showed up(posting_hil_cto_011913.html), added to specs and wrote handling code
5
+ - Fixed a bug affecting the parsing of dates on some postings
6
+ - Listing specs were failing due to the year change, resolved, and added a timecop dependency to development
7
+
8
+ === Release 1.1 (December 25, 2012)
4
9
  - ruby 1.9.3 support
5
10
  - migrated from rails 2 gems to rails 3
6
11
  - Replaced Net:Http with typhoeus
@@ -11,10 +16,10 @@ default timezone in your reports.
11
16
  - added support for enable_starttls_auto and tls in craigwatch (Thanks olek!)
12
17
  - added erb evaluation support to the craigwatch definition file (Thanks olek!)
13
18
 
14
- === Release 1.0
19
+ === Release 1.0 (February 13, 2011)
15
20
  - Replaced hpricot dependency with Nokogiri. Nokogiri should be faster and more reliable. Whoo-hoo!
16
21
 
17
- === Release 0.9.1
22
+ === Release 0.9.1 (January 5, 2011)
18
23
  - Added support for posting_has_expired? and expired post recognition
19
24
  - Fixed a weird bug in craigwatch that would cause a scrape to abort if a flagged_for_removal? was encountered when using certain (minimal) filtering
20
25
 
data/Gemfile CHANGED
@@ -4,9 +4,11 @@ gem 'htmlentities', '~>4.3'
4
4
  gem 'nokogiri', '>= 1.4.4'
5
5
  gem 'activerecord', '~>3.2.9'
6
6
  gem 'activesupport', '~>3.2.9'
7
- gem 'rspec'
8
7
  gem 'kwalify', '~>0.7'
9
8
  gem 'actionmailer', '~>3.2.9'
10
9
  gem 'sqlite3', '~>1.3'
11
10
  gem 'typhoeus', '~>0.5'
12
11
  gem 'money', '~>5.0.0'
12
+
13
+ gem 'timecop', '~>0.5.9'
14
+ gem 'rspec', '~>2.12.0'
@@ -53,7 +53,7 @@ class CraigScrape::Listings < CraigScrape::Scraper
53
53
  # Let's make sense of the h4 tag, and then read all the p tags below it
54
54
  if HEADER_DATE.match he_decode(el.inner_html)
55
55
  # Generally, the H4 tags contain valid dates. When they do - this is easy:
56
- current_date = Date.parse [$1, $2].join('/')
56
+ current_date = most_recent_date $1, $2
57
57
  elsif html.at('h4:last-of-type') == el
58
58
  # There's a specific bug in craigslist, where these nonsense h4's just appear without anything relevant inside them.
59
59
  # They're safe to ignore if they're not the last h4 on the page. I fthey're the last h4 on the page,
@@ -176,11 +176,11 @@ class CraigScrape::Listings < CraigScrape::Scraper
176
176
  if p_element.at_xpath(XPATH_POST_DATE)
177
177
  # Post 12/3
178
178
  if /\A([^ ]+) ([\d]+)\Z/.match p_element.at_xpath(XPATH_POST_DATE).content.strip
179
- ret[:post_date] = Date.parse [$1, $2].join('/')
179
+ ret[:post_date] = most_recent_date $1, $2
180
180
  end
181
181
  elsif SUMMARY_DATE.match he_decode(p_element.children[0])
182
182
  # Old style
183
- ret[:post_date] = Date.parse [$1, $2].join('/')
183
+ ret[:post_date] = most_recent_date $1, $2
184
184
  end
185
185
 
186
186
  if title_anchor
@@ -193,4 +193,18 @@ class CraigScrape::Listings < CraigScrape::Scraper
193
193
  ret
194
194
  end
195
195
 
196
+ private
197
+
198
+ # This method takes a month & day, and returns the most recent Date in the
199
+ # past for this date.
200
+ def most_recent_date(month, day)
201
+ now = Time.now.utc
202
+
203
+ # This ensures we always generate a time in the past, by guessing the year
204
+ # and subtracting one if we guessed wrong
205
+ ret = Date.parse [month, day, now.year].join('/')
206
+ ret = Date.parse [month, day, now.year-1].join('/') if ret > now.to_date
207
+
208
+ ret
209
+ end
196
210
  end
@@ -15,7 +15,7 @@ class CraigScrape::Posting < CraigScrape::Scraper
15
15
  POST_DATE = /Date:[^\d]*((?:[\d]{2}|[\d]{4})\-[\d]{1,2}\-[\d]{1,2}[^\d]+[\d]{1,2}\:[\d]{1,2}[ ]*[AP]M[^a-z]+[a-z]+)/i
16
16
  LOCATION = /Location\:[ ]+(.+)/
17
17
  HEADER_LOCATION = /\((.+)\)$/
18
- POSTING_ID = /PostingID\:[ ]*([\d]+)/
18
+ POSTING_ID = /Posting[ ]?ID\:[ ]*([\d]+)/
19
19
  REPLY_TO = /(.+)/
20
20
  PRICE = /((?:^\$[\d]+(?:\.[\d]{2})?)|(?:\$[\d]+(?:\.[\d]{2})?$))/
21
21
 
@@ -29,9 +29,19 @@ class CraigScrape::Posting < CraigScrape::Scraper
29
29
  REQUIRED_FIELDS = %w(contents posting_id post_time header title full_section)
30
30
 
31
31
  XPATH_USERBODY = "//*[@id='userbody']"
32
+ XPATH_POSTINGBODY = "//*[@id='postingbody']"
33
+
32
34
  XPATH_BLURBS = "//ul[@class='blurbs']"
33
- XPATH_PICS = "//*[@class='tn']/a/@href"
34
- XPATH_REPLY_TO = "//*[@class='dateReplyBar']/small/a"
35
+ XPATH_PICS = ["//*[@class='tn']/a/@href",
36
+ # For some posts (the newest ones on 01/20/12) we find the images:
37
+ "//*[@id='thumbs']/a/@href"
38
+ ].join('|')
39
+ XPATH_REPLY_TO = ["//*[@class='dateReplyBar']/small/a",
40
+ # For some posts (the newest ones on 01/20/12) we find the reply to this way:
41
+ "//*[@class='dateReplyBar']/*[@id='replytext']/following-sibling::a"
42
+ ].join('|')
43
+ XPATH_POSTINGBLOCK = "//*[@class='postingidtext' or @class='postinginfos']"
44
+ XPATH_POSTED_DATE = "//*[@class='postinginfos']/*[@class='postinginfo']/date"
35
45
 
36
46
  # This is really just for testing, in production use, uri.path is a better solution
37
47
  attr_reader :href #:nodoc:
@@ -81,6 +91,10 @@ class CraigScrape::Posting < CraigScrape::Scraper
81
91
  (html_head / "*[@class='bchead']//a").each do |a|
82
92
  @full_section << he_decode(a.inner_html) unless a['id'] and a['id'] == 'ef'
83
93
  end if html_head
94
+
95
+ # For some posts (the newest ones on 01/20/12) craigslist is pre-pending
96
+ # a silly "CL" to the section. Let's strip that:
97
+ @full_section.delete_at(0) if @full_section[0] == 'CL'
84
98
  end
85
99
 
86
100
  @full_section
@@ -104,9 +118,16 @@ class CraigScrape::Posting < CraigScrape::Scraper
104
118
  # Time, reflects the full timestamp of the posting
105
119
  def post_time
106
120
  unless @post_time
107
- cursor = html_head.at 'hr' if html_head
108
- cursor = cursor.next until cursor.nil? or POST_DATE.match cursor.to_s
109
- @post_time = DateTime.parse($1) if $1
121
+ if html.at_xpath(XPATH_POSTED_DATE)
122
+ # For some posts (the newest ones on 01/20/12) craigslist made this really
123
+ # easy for us.
124
+ @post_time = DateTime.parse(html.at_xpath(XPATH_POSTED_DATE))
125
+ else
126
+ # The bulk of the post time/dates are parsed via a simple regex:
127
+ cursor = html_head.at 'hr' if html_head
128
+ cursor = cursor.next until cursor.nil? or POST_DATE.match cursor.to_s
129
+ @post_time = DateTime.parse($1) if $1
130
+ end
110
131
  end
111
132
 
112
133
  @post_time
@@ -124,7 +145,7 @@ class CraigScrape::Posting < CraigScrape::Scraper
124
145
  @posting_id = $1.to_i if POSTING_ID.match html_footer.to_s
125
146
  else
126
147
  # Post 12/3
127
- @posting_id = $1.to_i if POSTING_ID.match html.xpath("//*[@class='postingidtext']").to_s
148
+ @posting_id = $1.to_i if POSTING_ID.match html.xpath(XPATH_POSTINGBLOCK).to_s
128
149
  end
129
150
 
130
151
  @posting_id
@@ -133,7 +154,17 @@ class CraigScrape::Posting < CraigScrape::Scraper
133
154
  # String, The full-html contents of the post
134
155
  def contents
135
156
  unless @contents
136
- @contents = user_body if html_source
157
+ @contents = if html.at_xpath(XPATH_POSTINGBODY)
158
+ # For some posts (the newest ones on 01/20/12) craigslist made this really
159
+ # easy for us.
160
+ html.at_xpath(XPATH_POSTINGBODY).children.to_s
161
+ elsif html_source
162
+ # Otherwise we have to parse this in a convoluted way from the userbody
163
+ # section:
164
+ user_body
165
+ end
166
+
167
+ # This helps clean up the whitespace around the sides, in case we got any:
137
168
  @contents = he_decode(@contents).strip if @contents
138
169
  end
139
170
 
@@ -0,0 +1,163 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>2 dr Chevy on 30s fs/trade donk - $20 (Any)</title>
5
+ <meta name="robots" content="NOARCHIVE,NOFOLLOW">
6
+ <meta name="viewport" content="user-scalable=1;">
7
+ <link type="text/css" rel="stylesheet" media="all" href="http://www.craigslist.org/styles/clnew.css?v=119f539293f850705f1debff3effaa21">
8
+
9
+ <!--[if lt IE 9]>
10
+ <script type="text/javascript" src="http://www.craigslist.org/js/html5shiv.js?v=ed7af45dcbda983c8455631037ebcdda"></script>
11
+ <![endif]-->
12
+ </head>
13
+
14
+ <body class="posting">
15
+
16
+ <article class="container">
17
+ <header class="bchead">
18
+ <div class="contents">
19
+ <a href="http://www.craigslist.org/about/sites">CL</a> &gt; <a href="http://tampa.craigslist.org/">tampa bay</a> &gt; <a href="http://tampa.craigslist.org/hil/">hillsborough co</a> &gt; <a href="http://tampa.craigslist.org/hil/sss/">all for sale / wanted</a> &gt; <a href="http://tampa.craigslist.org/hil/cto/">cars &amp; trucks - by owner</a>
20
+ </div>
21
+ </header>
22
+
23
+ <section class="body">
24
+ <section class="dateReplyBar">
25
+
26
+ <script type="text/javascript"><!--
27
+ var isPreview = "";
28
+ var postingTitle = "2 dr Chevy on 30s fs/trade donk - $20 (Any)";
29
+ var bestOf = "";
30
+ var postingURL = "http%3A%2F%2Ftampa.craigslist.org%2Fhil%2Fcto%2F3516252529.html";
31
+ var displayEmail = "t5kjj-3516252529@sale.craigslist.org";
32
+
33
+ --></script>
34
+
35
+
36
+ <button id="reply_button">Reply</button>
37
+
38
+ <span id="replytext">Reply to:</span> <a href="mailto:t5kjj-3516252529@sale.craigslist.org?subject=2%20dr%20Chevy%20on%2030s%20fs%2Ftrade%20donk%20-%20%2420%20(Any)%20-%20%2420%20(Any)&amp;body=%0A%0Ahttp%3A%2F%2Ftampa.craigslist.org%2Fhil%2Fcto%2F3516252529.html%0A">t5kjj-3516252529@sale.craigslist.org</a><sup> [<a href="http://www.craigslist.org/about/help/replying_to_posts" target="_blank">?</a>]</sup>
39
+
40
+ <div id="returnemail"> </div>
41
+
42
+
43
+ <aside id="flags">
44
+ <span id="flagChooser" class="tsb">
45
+ flag <sup>[<a href="http://www.craigslist.org/about/help/flags_and_community_moderation">?</a>]</sup> :
46
+ <a id="flag16" href="/flag/?flagCode=16&amp;postingID=3516252529"
47
+ title="Wrong category, wrong site, discusses another post, or otherwise misplaced">
48
+ miscategorized</a>
49
+ <a id="flag28" href="/flag/?flagCode=28&amp;postingID=3516252529"
50
+ title="Violates craigslist Terms Of Use or other posted guidelines">
51
+ prohibited</a>
52
+ <a id="flag15" href="/flag/?flagCode=15&amp;postingID=3516252529"
53
+ title="Posted too frequently, in multiple cities/categories, or is too commercial">
54
+ spam</a>
55
+ <a id="flag9" href="/flag/?flagCode=9&amp;postingID=3516252529"
56
+ title="Should be considered for inclusion in the Best-Of-Craigslist">
57
+ best of</a>
58
+ </span>
59
+ </aside>
60
+
61
+ </section>
62
+
63
+ <h2 class="postingtitle">2 dr Chevy on 30s fs/trade donk - $20 (Any)</h2>
64
+
65
+ <section id="userbody">
66
+
67
+
68
+
69
+ <script type="text/javascript">
70
+ <!--
71
+ imgList = ["http://images.craigslist.org/3G53I93Hc5L85Kf5H7d120fddd0157c831762.jpg","http://images.craigslist.org/3F83J73Hb5L75Gb5J2d12f3a7aa165da01cad.jpg","http://images.craigslist.org/3I43m13N85K25Fd5Hed120641f1962feb153b.jpg","http://images.craigslist.org/3Ld3J53H35Gb5Ff5Jfd12984fcb8d2d721dd9.jpg"];
72
+ // -->
73
+ </script>
74
+ <figure class="iw">
75
+
76
+ <div id="thumbs">
77
+
78
+ <a href="http://images.craigslist.org/3G53I93Hc5L85Kf5H7d120fddd0157c831762.jpg" title="1">
79
+ <img src="http://images.craigslist.org/thumb/3G53I93Hc5L85Kf5H7d120fddd0157c831762.jpg" alt="image 1">
80
+ </a>
81
+
82
+ <a href="http://images.craigslist.org/3F83J73Hb5L75Gb5J2d12f3a7aa165da01cad.jpg" title="2">
83
+ <img src="http://images.craigslist.org/thumb/3F83J73Hb5L75Gb5J2d12f3a7aa165da01cad.jpg" alt="image 2">
84
+ </a>
85
+
86
+ <a href="http://images.craigslist.org/3I43m13N85K25Fd5Hed120641f1962feb153b.jpg" title="3">
87
+ <img src="http://images.craigslist.org/thumb/3I43m13N85K25Fd5Hed120641f1962feb153b.jpg" alt="image 3">
88
+ </a>
89
+
90
+ <a href="http://images.craigslist.org/3Ld3J53H35Gb5Ff5Jfd12984fcb8d2d721dd9.jpg" title="4">
91
+ <img src="http://images.craigslist.org/thumb/3Ld3J53H35Gb5Ff5Jfd12984fcb8d2d721dd9.jpg" alt="image 4">
92
+ </a>
93
+
94
+ </div>
95
+ <div id="ci">
96
+ <img id="iwi" src="http://images.craigslist.org/3G53I93Hc5L85Kf5H7d120fddd0157c831762.jpg" alt="">
97
+ </div>
98
+ </figure>
99
+
100
+ <section id="postingbody">
101
+ One of the baddest 2 door chevys u will ever see on the road way way to much to list car is in Paint shop now getting painted house of color real candy red all the way through the car everything on car is brand new from the motor (no other one like it) and to the lift (done by underground rim king) fiberglass digital dash this is a one of a kind only car I have ever seen with a see through hood on it car has everything I want 20,000 cash or close to it but.... I will trade for either one of the following: a tahoe, or pick up,hummer h2,silver ado, Sierra,Dually, range rover,porsche suv,avalanche,magnum,charger,cls 500,745,range rover,infinity of any kind im open just send me a text or email either one is good or a vert!!! I will drive to u or meet u half way o yea and the rims are 30's floaters (786)257-7215 Cj text me<br>
102
+ <br>
103
+ <br>
104
+ <br>
105
+ <br>
106
+ Donk,floaters,trade,Chevy,lift,lifted,22,24,26,28,30,32,vert,candy,pearl,ect:
107
+ </section>
108
+ <section class="cltags"><!-- START CLTAGS -->
109
+ <ul class="blurbs">
110
+ <li> <!-- CLTAG GeographicArea=Any -->Location: Any</li>
111
+ <li>it's NOT ok to contact this poster with services or other commercial interests</li></ul><!-- END CLTAGS -->
112
+ </section>
113
+ <div class="postinginfos">
114
+ <p class="postinginfo">Posting ID: 3516252529</p>
115
+ <p class="postinginfo">Posted: <date>2013-01-08, 2:09PM EST</date></p>
116
+
117
+ <p class="postinginfo"><a href="https://accounts.craigslist.org/eaf?postingID=3516252529&amp;token=U2FsdGVkX18yOTk2NTI5OU8UM46U_bRTZNEvki7uj1feLDXHsvDa3PzGnpiBdmQ5zhwh4H3WpKobWR7oWCdAeIzotsAemmnT" class="tsb">email to a friend</a></p>
118
+ </div>
119
+ </section>
120
+
121
+ <aside class="tsb">
122
+ <p><a href="http://www.craigslist.org/about/scams">Avoid scams, deal locally!</a>
123
+
124
+ <em>Do NOT wire funds (Western Union, Moneygram).</em>
125
+
126
+ Beware cashier checks, money orders, shipping, non-local buyers/sellers.
127
+
128
+ <a href="http://www.craigslist.org/about/scams">More info</a></p>
129
+ </aside>
130
+
131
+
132
+
133
+
134
+ </section>
135
+ <footer>
136
+ <ul class="clfooter">
137
+ <li>Copyright &copy; 2013 craigslist, inc.</li>
138
+ <li><a href="http://www.craigslist.org/about/terms.of.use">terms of use</a></li>
139
+ <li><a href="http://www.craigslist.org/about/privacy_policy">privacy</a></li>
140
+ <li><a href="/forums/?forumID=8">feedback</a></li>
141
+ </ul>
142
+ </footer>
143
+
144
+ </article>
145
+
146
+
147
+ <script type="text/javascript"><!--
148
+ var pagetype = "posting";
149
+ var pID = "3516252529";
150
+ var wwwurl = "http://www.craigslist.org";
151
+
152
+ --></script>
153
+
154
+ <script type="text/javascript" src="http://www.craigslist.org/js/jquery-1.7.2.js?v=89700834f1601ac3ebc3e5fb3302c040"></script>
155
+ <script type="text/javascript" src="http://www.craigslist.org/js/postings.js?v=6c6be350266b68cc30281042524287ee"></script>
156
+ <script type="text/javascript" src="http://www.craigslist.org/js/formats.js?v=c6b5dd14b3181897a51f2136efcfacaf"></script>
157
+
158
+
159
+
160
+
161
+ </body>
162
+ </html>
163
+
@@ -0,0 +1,143 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>2002 Jaguar X-Type 90,000 miles - $4900 (Tampa/Brandon)</title>
5
+ <meta name="robots" content="NOARCHIVE,NOFOLLOW">
6
+ <meta name="viewport" content="user-scalable=1;">
7
+ <link type="text/css" rel="stylesheet" media="all" href="http://www.craigslist.org/styles/clnew.css?v=119f539293f850705f1debff3effaa21">
8
+
9
+ <!--[if lt IE 9]>
10
+ <script type="text/javascript" src="http://www.craigslist.org/js/html5shiv.js?v=ed7af45dcbda983c8455631037ebcdda"></script>
11
+ <![endif]-->
12
+ </head>
13
+
14
+ <body class="posting">
15
+
16
+ <article class="container">
17
+ <header class="bchead">
18
+ <div class="contents">
19
+ <a href="http://www.craigslist.org/about/sites">CL</a> &gt; <a href="http://tampa.craigslist.org/">tampa bay</a> &gt; <a href="http://tampa.craigslist.org/hil/">hillsborough co</a> &gt; <a href="http://tampa.craigslist.org/hil/sss/">all for sale / wanted</a> &gt; <a href="http://tampa.craigslist.org/hil/cto/">cars &amp; trucks - by owner</a>
20
+ </div>
21
+ </header>
22
+
23
+ <section class="body">
24
+ <section class="dateReplyBar">
25
+
26
+ <script type="text/javascript"><!--
27
+ var isPreview = "";
28
+ var postingTitle = "2002 Jaguar X-Type 90,000 miles - $4900 (Tampa/Brandon)";
29
+ var bestOf = "";
30
+ var postingURL = "http%3A%2F%2Ftampa.craigslist.org%2Fhil%2Fcto%2F3559534414.html";
31
+ var displayEmail = "xxnxb-3559534414@sale.craigslist.org";
32
+
33
+ --></script>
34
+
35
+
36
+ <button id="reply_button">Reply</button>
37
+
38
+ <span id="replytext">Reply to:</span> <a href="mailto:xxnxb-3559534414@sale.craigslist.org?subject=2002%20Jaguar%20X-Type%2090%2C000%20miles%20-%20%244900%20(Tampa%2FBrandon)%20-%20%244900%20(Tampa%2FBrandon)&amp;body=%0A%0Ahttp%3A%2F%2Ftampa.craigslist.org%2Fhil%2Fcto%2F3559534414.html%0A">xxnxb-3559534414@sale.craigslist.org</a><sup> [<a href="http://www.craigslist.org/about/help/replying_to_posts" target="_blank">?</a>]</sup>
39
+
40
+ <div id="returnemail"> </div>
41
+
42
+
43
+ <aside id="flags">
44
+ <span id="flagChooser" class="tsb">
45
+ flag <sup>[<a href="http://www.craigslist.org/about/help/flags_and_community_moderation">?</a>]</sup> :
46
+ <a id="flag16" href="/flag/?flagCode=16&amp;postingID=3559534414"
47
+ title="Wrong category, wrong site, discusses another post, or otherwise misplaced">
48
+ miscategorized</a>
49
+ <a id="flag28" href="/flag/?flagCode=28&amp;postingID=3559534414"
50
+ title="Violates craigslist Terms Of Use or other posted guidelines">
51
+ prohibited</a>
52
+ <a id="flag15" href="/flag/?flagCode=15&amp;postingID=3559534414"
53
+ title="Posted too frequently, in multiple cities/categories, or is too commercial">
54
+ spam</a>
55
+ <a id="flag9" href="/flag/?flagCode=9&amp;postingID=3559534414"
56
+ title="Should be considered for inclusion in the Best-Of-Craigslist">
57
+ best of</a>
58
+ </span>
59
+ </aside>
60
+
61
+ </section>
62
+
63
+ <h2 class="postingtitle">2002 Jaguar X-Type 90,000 miles - $4900 (Tampa/Brandon)</h2>
64
+
65
+ <section id="userbody">
66
+
67
+
68
+
69
+
70
+ <section id="postingbody">
71
+ 2002 Jaguar X-Type, automatick, 90,000 miles, cold ac, grey with black leather, power windows, power seats, power mirrors, power door locks with keyless entry, power sunroof, wood trim and more, looks and runs great. Call 727-439-3027<br>
72
+ <br>
73
+ <a href="http://s730.beta.photobucket.com/user/brianvangelov/media/DSC00390_zpsc95bcf98.jpg.html" target="_blank" rel="nofollow"><img src="http://i730.photobucket.com/albums/ww303/brianvangelov/DSC00390_zpsc95bcf98.jpg" border="0" alt=" photo DSC00390_zpsc95bcf98.jpg"></a><br>
74
+ <a href="http://s730.beta.photobucket.com/user/brianvangelov/media/DSC00392_zps1b90d33c.jpg.html" target="_blank" rel="nofollow"><img src="http://i730.photobucket.com/albums/ww303/brianvangelov/DSC00392_zps1b90d33c.jpg" border="0" alt=" photo DSC00392_zps1b90d33c.jpg"></a><br>
75
+ <a href="http://s730.beta.photobucket.com/user/brianvangelov/media/DSC00395_zps0047f176.jpg.html" target="_blank" rel="nofollow"><img src="http://i730.photobucket.com/albums/ww303/brianvangelov/DSC00395_zps0047f176.jpg" border="0" alt=" photo DSC00395_zps0047f176.jpg"></a><br>
76
+ <a href="http://s730.beta.photobucket.com/user/brianvangelov/media/DSC00398-1_zps4b01580d.jpg.html" target="_blank" rel="nofollow"><img src="http://i730.photobucket.com/albums/ww303/brianvangelov/DSC00398-1_zps4b01580d.jpg" border="0" alt=" photo DSC00398-1_zps4b01580d.jpg"></a><br>
77
+ <a href="http://s730.beta.photobucket.com/user/brianvangelov/media/DSC00401-1_zps69e67678.jpg.html" target="_blank" rel="nofollow"><img src="http://i730.photobucket.com/albums/ww303/brianvangelov/DSC00401-1_zps69e67678.jpg" border="0" alt=" photo DSC00401-1_zps69e67678.jpg"></a><br>
78
+ <a href="http://s730.beta.photobucket.com/user/brianvangelov/media/DSC00404_zps1dfd3717.jpg.html" target="_blank" rel="nofollow"><img src="http://i730.photobucket.com/albums/ww303/brianvangelov/DSC00404_zps1dfd3717.jpg" border="0" alt=" photo DSC00404_zps1dfd3717.jpg"></a><br>
79
+ <a href="http://s730.beta.photobucket.com/user/brianvangelov/media/DSC00406_zps370a3ffa.jpg.html" target="_blank" rel="nofollow"><img src="http://i730.photobucket.com/albums/ww303/brianvangelov/DSC00406_zps370a3ffa.jpg" border="0" alt=" photo DSC00406_zps370a3ffa.jpg"></a><br>
80
+ <a href="http://s730.beta.photobucket.com/user/brianvangelov/media/DSC00411_zps8584b52e.jpg.html" target="_blank" rel="nofollow"><img src="http://i730.photobucket.com/albums/ww303/brianvangelov/DSC00411_zps8584b52e.jpg" border="0" alt=" photo DSC00411_zps8584b52e.jpg"></a><br>
81
+ <a href="http://s730.beta.photobucket.com/user/brianvangelov/media/DSC00412_zpsbf6b145b.jpg.html" target="_blank" rel="nofollow"><img src="http://i730.photobucket.com/albums/ww303/brianvangelov/DSC00412_zpsbf6b145b.jpg" border="0" alt=" photo DSC00412_zpsbf6b145b.jpg"></a><br>
82
+ <a href="http://s730.beta.photobucket.com/user/brianvangelov/media/DSC00415_zps0341d9d2.jpg.html" target="_blank" rel="nofollow"><img src="http://i730.photobucket.com/albums/ww303/brianvangelov/DSC00415_zps0341d9d2.jpg" border="0" alt=" photo DSC00415_zps0341d9d2.jpg"></a><br>
83
+ <a href="http://s730.beta.photobucket.com/user/brianvangelov/media/DSC00421_zpsa71182c6.jpg.html" target="_blank" rel="nofollow"><img src="http://i730.photobucket.com/albums/ww303/brianvangelov/DSC00421_zpsa71182c6.jpg" border="0" alt=" photo DSC00421_zpsa71182c6.jpg"></a>
84
+ <a href="http://s730.beta.photobucket.com/user/brianvangelov/media/DSC00417_zpsf5f23e08.jpg.html" target="_blank" rel="nofollow"><img src="http://i730.photobucket.com/albums/ww303/brianvangelov/DSC00417_zpsf5f23e08.jpg" border="0" alt=" photo DSC00417_zpsf5f23e08.jpg"></a>
85
+
86
+
87
+ </section>
88
+ <section class="cltags"><!-- START CLTAGS -->
89
+ <ul class="blurbs">
90
+ <li> <!-- CLTAG GeographicArea=Tampa/Brandon -->Location: Tampa/Brandon</li>
91
+ <li>it's NOT ok to contact this poster with services or other commercial interests</li></ul><!-- END CLTAGS -->
92
+ </section>
93
+ <div class="postinginfos">
94
+ <p class="postinginfo">Posting ID: 3559534414</p>
95
+ <p class="postinginfo">Posted: <date>2013-01-20, 4:24PM EST</date></p>
96
+ <p class="postinginfo">Edited: <date>2013-01-20, 4:29PM EST</date></p>
97
+ <p class="postinginfo"><a href="https://accounts.craigslist.org/eaf?postingID=3559534414&amp;token=U2FsdGVkX185MzkxOTM5MVHhcYWkNEGOrpcgNp5LTCIMLn1P89eQPunu8KznqIaCbpbs6a8EjVA9h6W0UxpQTYZTx0fy1BIt" class="tsb">email to a friend</a></p>
98
+ </div>
99
+ </section>
100
+
101
+ <aside class="tsb">
102
+ <p><a href="http://www.craigslist.org/about/scams">Avoid scams, deal locally!</a>
103
+
104
+ <em>Do NOT wire funds (Western Union, Moneygram).</em>
105
+
106
+ Beware cashier checks, money orders, shipping, non-local buyers/sellers.
107
+
108
+ <a href="http://www.craigslist.org/about/scams">More info</a></p>
109
+ </aside>
110
+
111
+
112
+
113
+
114
+ </section>
115
+ <footer>
116
+ <ul class="clfooter">
117
+ <li>Copyright &copy; 2013 craigslist, inc.</li>
118
+ <li><a href="http://www.craigslist.org/about/terms.of.use">terms of use</a></li>
119
+ <li><a href="http://www.craigslist.org/about/privacy_policy">privacy</a></li>
120
+ <li><a href="/forums/?forumID=8">feedback</a></li>
121
+ </ul>
122
+ </footer>
123
+
124
+ </article>
125
+
126
+
127
+ <script type="text/javascript"><!--
128
+ var pagetype = "posting";
129
+ var pID = "3559534414";
130
+ var wwwurl = "http://www.craigslist.org";
131
+
132
+ --></script>
133
+
134
+ <script type="text/javascript" src="http://www.craigslist.org/js/jquery-1.7.2.js?v=89700834f1601ac3ebc3e5fb3302c040"></script>
135
+ <script type="text/javascript" src="http://www.craigslist.org/js/postings.js?v=6c6be350266b68cc30281042524287ee"></script>
136
+ <script type="text/javascript" src="http://www.craigslist.org/js/formats.js?v=c6b5dd14b3181897a51f2136efcfacaf"></script>
137
+
138
+
139
+
140
+
141
+ </body>
142
+ </html>
143
+