【爬虫项目】房天下二手房爬取

爬虫目标

爬取房天下指定地区的所在小区小区链接小区地址户型总价单价

mark

使用的模块:requestslxmlrejson

爬虫结构

以下结构可以很好的进行多线程或者协程的扩展。

参数类

class Tool():
    # 需要爬取的城市
    city = "成都"

    # 爬取页数
    page = 2

    # 城市列表 获取所以城市的URL的方法在文末,这里只截取了一部分
    city_url = {'成都': 'https://cd.esf.fang.com', '郴州': 'https://chenzhou.esf.fang.com'}

解析网页获取信息

# 获取房子的信息
def get_fang_infor(url):
    # 信息
    fang_list = list()

    # 获取网页信息
    r = requests.get(url=url)
    r.encoding = r.apparent_encoding
    # 这里的错误处理是在爬取第二页之后,URL需要获取一个参数
    try:
        href = re.search(r'//location.href="(.*?)";',r.text).group(1)
    except AttributeError:
        pass
    else:
        r = requests.get(url=href)
        r.encoding = r.apparent_encoding
    # 解析网页
    html = etree.HTML(r.text)
    dl_html = html.xpath('//div[@class="shop_list shop_list_4"]/dl')
    for dl in dl_html:
        # 小区名称
        house = dl.xpath('.//p[@class="add_shop"]/a/@title')
        if house == list():
            continue
        # 小区链接
        house_url = url + dl.xpath('.//p[@class="add_shop"]/a/@href')[0]
        # 小区地址
        house_add = dl.xpath('.//p[@class="add_shop"]/span/text()')
        # 户型等    去除前后符号
        house_types = [a.strip() for a in dl.xpath('.//p[@class="tel_shop"]/text()')]
        # 总价
        all_price = dl.xpath('.//dd[@class="price_right"]/span[1]/b/text()')[0] + dl.xpath('.//dd[@class="price_right"]/span/text()')[0]
        # 单价
        price = dl.xpath('.//dd[@class="price_right"]/span[2]/text()')
        # 组合数据
        infor = {
            # 小区名称
            "house":house[0],
            # 小区地址
            "house_add":house_add[0],
            # 小区链接
            "house_url":house_url,
            # 户型
            "house_type":house_types[0],
            # 大小
            "house_size":house_types[1][:-2],
            # 楼层
            "floor":house_types[2],
            # 方向
            "direction":house_types[3],
            # 修建日期
            "xj_date" :house_types[4],
            # 总价
            "all_price":all_price,
            # 单价
            "price":price[0][:-3]
        }
        fang_list.append(infor)
    return fang_list

获取所有链接

返回一个所有链接的list()

# 获取页数连接
def get_pages():
    url = Tool.city_url[Tool.city]
    pages_list = [url]
    for num in range(2,Tool.page + 1):
        pages_list.append(url + "/house/i3{}/".format(num))
    return pages_list

主程序入口

if __name__ == '__main__':
    pages_list = get_pages()
    print(pages_list) # 打印链接列表
    for page in pages_list:
        print(page)   # 当前爬取的链接
        fang_list = get_fang_infor(page)
        print(fang_list)

mark

获取所有城市的URL

def get_city_url():
    url = "https://esf.fang.com/esfcities.aspx"
    r = requests.get(url=url,timeout=5)
    r.encoding = r.apparent_encoding
    # 匹配 城市 & url
    city_url_lists = json.loads(re.search(r"var cityJson=(.*?),];",r.text).group(1)+ "]")
    # 重新组合格式
    city_url_dic = dict() #{,...}
    for a in city_url_lists:
        city_url_dic = {**city_url_dic , **{a.get("name"):"https:" + a.get("url")}}
    print(city_url_dic)

mark

发表评论 / Comment

用心评论~