实时爬取二手房数据

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

#coding=utf-8
import time
import json
from multiprocessing import Pool
import requests
from bs4 import BeautifulSoup
import re
import pandas as pd
import pymongo
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

def generate_allurl(user_in_nub, user_in_city):  # 生成url
    url = 'http://' + user_in_city + '.lianjia.com/ershoufang/pg{}/'
    for url_next in range(1, int(user_in_nub)):
        writer_to_text(url.format(url_next))
        yield url.format(url_next)


def get_allurl(generate_allurl):  # 分析url解析出每一页的详细url
    get_url = requests.get(generate_allurl, 'lxml')
    if get_url.status_code == 200:
        #re_set = re.compile('<li.*?class="clear">.*?<a.*?class="img.*?".*?href="(.*?)"')
        re_set = re.compile('target="_blank" href="(/ershoufang/.*?)" class="img js_triggerGray"')
        re_get = re.findall(re_set, get_url.text)
        return re_get


def open_url(re_get):  # 分析详细url获取所需信息
    res = requests.get(re_get)
    if res.status_code == 200:
        info = {}
        soup = BeautifulSoup(res.text, 'lxml')
        info['标题'] = soup.select('.header-title')[0].text
        info['总价'] = soup.select('.price-num')[0].text + '万'
        info['每平方售价'] = soup.select('.u-bold')[0].text + '元/平'
        info['房间']=soup.select('.main-item')[0].text.split()[0]
        info['装修'] = soup.select('.main-item')[0].text.split()[1]
        info['朝向'] = soup.select('.main-item')[1].text.split()[0]
        info['楼层'] = soup.select('.main-item')[1].text.split()[1]
        info['面积'] = soup.select('.main-item')[2].text.split()[0]
        info['建造时间'] = soup.select('.main-item')[2].text.split()[1]
        info['小区名称'] = soup.select('.u-link')[0].text
        info['所在区域'] = soup.select('.u-link')[1].text + ':' + soup.select('.u-link')[2].text
        info['链家编号'] = str(re_get)[33:].rsplit('.html')[0]
        #for i in soup.select('.base li'):
        #    i = str(i)
        #    if '</span>' in i or len(i) > 0:
        #        key, value = (i.split('</span>'))
        #        info[key[24:]] = value.rsplit('</li>')[0]
        #for i in soup.select('.transaction li'):
        #    i = str(i)
        #    if '</span>' in i and len(i) > 0 and '抵押信息' not in i:
        #        key, value = (i.split('</span>'))
        #        info[key[24:]] = value.rsplit('</li>')[0]
        print(info)
        return info


def update_to_MongoDB(one_page):  # update储存到MongoDB
    if db[Mongo_TABLE].update({'链家编号': one_page['链家编号']}, {'$set': one_page}, True): #去重复
        print('储存MongoDB 成功!')
        return True
    return False


def pandas_to_xlsx(info):  # 储存到xlsx
    pd_look = pd.DataFrame(info)
    pd_look.to_excel('链家二手房.xlsx', sheet_name='链家二手房')


def writer_to_text(list):  # 储存到text
    with open('lianjia.txt', 'a')as f:
        f.write(json.dumps(list, ensure_ascii=False) + '\n')
        f.close()


def main(url):
    #time.sleep(5)
    writer_to_text(open_url('http://sh.lianjia.com'+url))    #储存到text文件
    # update_to_MongoDB(list)   #储存到Mongodb


if __name__ == '__main__':
    #user_in_city = input('输入爬取城市:')
    #user_in_nub = input('输入爬取页数:')

    Mongo_Url = 'localhost'
    Mongo_DB = 'Lianjia'
    Mongo_TABLE = 'Lianjia' + '\n' + str('zs')
    client = pymongo.MongoClient(Mongo_Url)
    db = client[Mongo_DB]
    pool = Pool()
    for i in generate_allurl('3', 'sh'):
        writer_to_text(i)
        pool.map(main, [url for url in get_allurl(i)])

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

使用XPath爬取二手房数据可按以下步骤进行: ### 获取小区id构造链接 通过XPath获取到小区id后,可构造每个小区二手房的详细信息的链接。小区详情页的链接前面部分是固定的,如“https://cs.lianjia.com/xiaoqu/” ,后面接上小区id即可。通过构造不同小区的url链接,就能获取不同小区的详细信息[^1]。 ### 爬取特定页面房源信息 以链家网为例,爬取其前五页二手房房源信息,可使用以下代码: ```python import requests from lxml import etree # 爬取前五页的房源信息 for page in range(1, 6): url = f"https://cs.lianjia.com/ershoufang/pg{page}" # 发送请求并获取网页内容 response = requests.get(url) html = response.text # 使用lxml库和xpath解析网页内容 selector = etree.HTML(html) house_list = selector.xpath('//ul[@class="sellListContent"]/li') # 解析每个房源的信息 for house in house_list: name = house.xpath('.//div[@class="title"]/a/text()')[0] location1 = house.xpath('.//div[@class="flood"]/div/a/text()')[0] location2 = house.xpath('.//div[@class="flood"]/div/a/text()')[1] location = location1 + '-' + location2 unit_price = house.xpath('.//div[@class="priceInfo"]/div[@class="unitPrice"]/span/text()')[0] total_price = house.xpath('.//div[@class="priceInfo"]/div[@class="totalPrice totalPrice2"]/span/text()')[0] + "万" print(f'【名称】:{name}, 【位置】:{location}, 【单价】:{unit_price}, 【总价】:{total_price}') ``` 该代码通过循环遍历前五页的房源信息,使用XPath表达式提取每个房源的名称、位置、单价和总价等信息并打印输出[^2]。 ### XPath路径表达式基础 XPath使用路径表达式在XML文档中选取节点,节点通过沿着路径或者step来选取。常见的路径表达式有: - `nodename`:选取此节点的所有子节点。 - `/`:从根节点选取。 - `//`:从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 - `.`:选取当前节点。 - `..`:选取当前节点的父节点。 - `@`:选取属性。 [^3]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值