Python 爬58同城 城市租房信息

本文介绍了一种使用Python进行网页爬取的方法,具体目标为58同城网站上的租房信息。通过解析网页结构并利用lxml和cssselect库定位所需数据,该爬虫能够自动抓取房屋标题、价格、支付方式等详细信息,并将结果保存为CSV文件。

爬取完会自动生成csv电子表格文件,含有房价、押付、链接等信息

环境
py2.7
pip install lxml
pip install cssselect
 
 1 #coding:utf-8
 2 import csv
 3 import urllib2
 4 import lxml.html
 5 import time
 6 import sys
 7 from lxml.cssselect import CSSSelector
 8 import threading
 9 reload(sys)
10 sys.setdefaultencoding('utf8')
11 
12 print "请输入要爬取得城市简称例如bj(北京):"
13 CITY=str(raw_input(">>>"))
14 def download(url, user_agent='Google', num_retries=2):
15 
16     headers = {'User-agent': user_agent}
17     request = urllib2.Request(url, headers=headers)
18     try:
19         html = urllib2.urlopen(request).read()
20     except urllib2.URLError as e:
21         html = None
22         if num_retries > 0:
23             if hasattr(e, 'code') and 500 <= e.code < 600:
24                 return download(url, num_retries-1)
25     return html
26 
27 
28 def get_data(url):
29     html_text_detail = download(url)
30     try:
31         tree = lxml.html.fromstring(html_text_detail)
32         house_ext = CSSSelector('div.house-pay-way > span:nth-child(3)')
33         house_title = CSSSelector('div.main-wrap > div.house-title > h1')
34         house_pay_way1 = CSSSelector('div.house-pay-way > span:nth-child(1)')
35         house_pay_way2 = CSSSelector('div.house-pay-way > span:nth-child(2)')
36         print house_title(tree)[0].text_content()
37         print '%s|%s' % (house_pay_way1(tree)[0].text_content(), house_pay_way2(tree)[0].text_content())
38 
39         for i in range(7):
40             for j in range(2):
41                 css = 'div.house-desc-item > ul.f14 > li:nth-child(%s) > span:nth-child(%s)' % (i+1, j+1)
42                 house_info = CSSSelector(css)
43                 data = [
44                 ('标题 : ',house_title(tree)[0].text_content(), '#',url),
45                 ('价格: ',house_pay_way1(tree)[0].text_content(), '#'),
46                 ('压付: ',house_pay_way2(tree)[0].text_content(), '#'),
47                 ('详情: ',house_info(tree)[0].text_content().replace(' ', ''), '#')]
48                 with open('%s_houses.csv'%CITY,'ab+') as csvfile:
49                     writer = csv.writer(csvfile,lineterminator='\n')
50                     writer.writerows(data)
51 
52     except TypeError as e:
53         pass
54     except IndexError as e:
55         pass
56 
57 def get_url(html):
58     tree = lxml.html.fromstring(html)
59     sel = CSSSelector('div.mainbox > div.main > div.content > div.listBox > ul.listUl > li > div.des > h2 > a')
60     url_list = []
61     for i in sel(tree):
62         if i.get('href') not in url_list:
63             url_list.append(i.get('href'))
64     return url_list
65 
66 
67 if __name__ == '__main__':
68     url_index = 'http://%s.58.com/chuzu/'%CITY
69     html_text_list = download(url_index)
70     url_list = get_url(html_text_list)
71 
72     for url_detail in url_list:
73         thr = threading.Thread(target=get_data, args=(url_detail,))
74         thr.start()
75 
76         time.sleep(0.001)
py58.py

 

转载于:https://www.cnblogs.com/cutesnow/p/7161692.html

好的,这是一个比较具体的问题,我可以为你提供一些思路和参考代码。 首先,我们需要了解58同城二手房信息的页面结构和数据请求方式。通过分析网页源代码和浏览器开发者工具,可以发现58同城二手房信息的页面是采用Ajax技术加载的,数据请求方式是POST请求,请求参数中包含了城市、区域、价格等筛选条件。 接下来,我们可以使用Python的requests模块发送POST请求,获取二手房信息的JSON数据。然后,使用Python的json模块解析JSON数据,提取出我们需要的房源信息,例如房源名称、总价、单价、房间数、面积、朝向、楼层等信息。 最后,我们可以使用Python的pandas模块将房源信息存储到CSV文件中,方便后续的数据分析和处理。 下面是一个简单的代码示例,仅供参考: ```python import requests import json import pandas as pd # 设置请求头信息 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} # 设置POST请求参数 data = { 'PGTID': '0d100000-0000-1e9c-0d96-1d72c30b2f0e', 'ClickID': '1', 'comm_id': '0', 'created': '7', 'curPage': '1', 'datainfo': 'eyJwYWdlIjoxLCJ0eXBlIjoxLCJjaXR5IjoxLCJjYXRlZ29yeSI6IjIwMjEtMDYtMDEiLCJhbGwiOiIiLCJwYXJhbXMiOiIiLCJ1dGlsaXR5IjoiIiwic3RhdHVzIjoiIiwiYWpheCI6IiJ9', 'from': '1', 'isfirst': 'true', 'local': '1', 'order': 'time', 'over': '0', 'param': '2_1_0_0_0_0_0', 'propertytype': '1', 'room': '0', 'showMore': '1', 'shownow': '0', 'sign': 'dfc3f07bcfd1ad6c124a3d7b5fbc4c6b', 'source': 'list', 'sug': '0', 'w': '1' } # 发送POST请求,获取JSON数据 url = 'https://appapi.58.com/house/listV3?' response = requests.post(url, headers=headers, data=data) json_data = json.loads(response.text) # 解析JSON数据,提取房源信息 house_list = [] for item in json_data['data']['list']: house_info = {} house_info['title'] = item['title'] house_info['total_price'] = item['price'] house_info['unit_price'] = item['unitprice'] house_info['room_num'] = item['room'] house_info['area'] = item['area'] house_info['orientation'] = item['orient'] house_info['floor'] = item['floor'] house_list.append(house_info) # 将房源信息存储到CSV文件中 df = pd.DataFrame(house_list) df.to_csv('house_info.csv', index=False) ``` 这段代码可以58同城二手房信息的第一页数据,并将房源信息存储到名为house_info.csv的CSV文件中。如果需要取多页数据,可以通过修改POST请求参数中的curPage参数来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值