python爬取链家房屋及经纬度信息-以宁波为例

铺垫工作

1:寻找你需要的城市的url。

2 :获取每栋房屋的详情url。

3:获取具体信息

4:利用百度API解析地址返回经纬度(其实在链家的网站上已经返回了经纬度,但是不知道为何拿不到res.text,有待研究)

# encoding: utf-8

import json
import requests
from bs4 import BeautifulSoup
import re
import sys

reload(sys)
sys.setdefaultencoding('utf-8')


for i in range(100):
#循环构造url
    url = 'http://nb.lianjia.com/ershoufang/pg{}/'
    k=url.format(i)

   #添加请求头,否则会被拒绝
    headers = {'user-agent': 'my-app/0.0.1'}
    res = requests.get(k,headers=headers)
#基于正则表达式来解析网页内容,拿到所有的详情url
#原始可能是这么做的,但是后来发现bs4给我们提供了更方便的方法来取得各元素的内容
#正则表达式最重要的两个东西,.任意匹配字符,*匹配任意次数,?以html结束
    text=res.text
    re_set = re.compile('https://nb.lianjia.com/ershoufang/[0-9]*.?html')
    re_get = re.findall(re_set, text)
    
for name in re_get:
        res = requests.get(name, headers=headers)
        info = {}
        text2 = res.text
       #基于bs4来解析,再也不用写正则了。
        soup = BeautifulSoup(text2, 'lxml')
        info['标题'] = soup.select('.main')[0].text
        info['总价'] = soup.select('.total')[0].text
        info['每平方售价'] = soup.select('.unitPriceValue')[0].text
        info['参考总价'] = soup.select('.taxtext')[0].text
        info['建造时间'] = soup.select('.subInfo')[2].text
        info['小区名称'] = soup.select('.info')[0].text
        info['所在区域'] = soup.select('.info a')[0].text + ':' + soup.select('.info a')[1].text
        info['链家编号'] = str(re_get)[33:].rsplit('.html')[0]

        # 根据地址获取对应经纬度,通过百度的api接口来进行
        mc=soup.select('.info')[0].text
        location='宁波'+mc
        api_url = 'http://api.map.baidu.com/geocoder/v2/?address={}&output=json&ak=百度申请的秘钥'.format(location)
        data = requests.get(api_url)
        result = json.loads(data.text)
        print(result)
        try:
            longitude = result['result']['location']['lng']
            latitude = result['result']['location']['lat']
        except Exception as e:
            print('Error:这个地点没有查到对应的经纬度---- %s' % str(e))
            longitude = [0]
            latitude = [0]
k=1

 

你可能感兴趣的:(python)