如何使用Python深度采集链家二手房源详细信息?

2026-05-21 20:002阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1339个文字,预计阅读时间需要6分钟。

如何使用Python深度采集链家二手房源详细信息?

链家二手房源数据深度采集:本部分实践基于上一个博客获取的数据,具体参考网址如下:[网址链接]。爬虫逻辑:[提取网页链接]-[设置动态IP]-[获取详细信息]。


链家二手房源数据深度采集

这部分的实践是基于上一个博客获得的数据,具体的​​参考网址​​如下:

爬虫逻辑 :–> –>

函数式编程:

函数1:url_extract(database,table,field) → 函数
database:数据库
table:源数据mongo集合对象
field:url字段

函数2:get_data(ui,d_h,ips,table) → 函数
ui:数据信息网页
d_h:user-agent信息
ips:代理设置
table:mongo集合对象

前期准备并封装第一个函数

上一个博客已经完成了分页中各个列表里面标题所对应的url(链接)采集,这里只需要加载一下即可

  • 导入相关库、代码分区和配置数据库
  • import re
    import requests
    import time
    from bs4 import BeautifulSoup
    import pymongo

    if __name__ == '__main__':
    myclient = pymongo.MongoClient("mongodb://localhost:27017/")
    db = myclient['链家二手房_1']
    datatable = db['data_1']
  • 数据提取
  • dlst = datatable.find()
    print(dlst)
    print(dlst[0])

    输出结果为:(dlst是一个可以迭代的对象,这里取出第一个元素示例)


    3) 封装第一个函数

    def url_extract(database,table,field):
    '''函数
    database:数据库
    table:源数据mongo集合对象
    field:url字段
    '''
    dlst = table.find()
    lst = []
    for item in dlst:
    lst.append(item[field])
    return lst

    urllst = url_extract(db,datatable,'链接')[:10]
    print(urllst)

    输出结果为:(网页均可以打开)

    ​[‘​​​​bj.lianjia.com/ershoufang/101106641912.html’​​​​​, ‘​​​​bj.lianjia.com/ershoufang/101106120874.html’​​​,

    ​​‘​​​​bj.lianjia.com/ershoufang/101106506136.html’​​​​​, ‘​​​​bj.lianjia.com/ershoufang/101106369778.html’​​​,

    ​​‘​​​​bj.lianjia.com/ershoufang/101106678537.html’​​​​​, ‘​​​​bj.lianjia.com/ershoufang/101106148748.html’​​​,

    ​​‘​​​​bj.lianjia.com/ershoufang/101106628849.html’​​​​​, ‘​​​​bj.lianjia.com/ershoufang/101104451607.html’​​​,

    ​​‘​​​​bj.lianjia.com/ershoufang/101104041998.html’​​​​​, ‘​​​​bj.lianjia.com/ershoufang/101106586759.html’​​​]

    如何使用Python深度采集链家二手房源详细信息?

    数据标签定位

    由于前一个博文已经测试了网址可以进行正常的数据请求响应,这里就不再进行测试了,以某一页面为例,进行试错,直接确定采集的字段(标题可以直接通h1获取),如下

  • 房价信息对应的标签
  • 基础信息对应的标签
  • 交易信息对应的标签
  • 经纬度对应的标签
    这里可以通过网页里面的出现的位置,然后复制到坐标拾取器里面,查看经纬度,然后复制经度的前面的数字,在源代码(不是检查页面)中找到相应的位置
  • 在源代码页面选择查找,输入116(因为上面搜到的只是大致的地址,但是前面的经度是没有问题的),就会出现对应的位置信息
  • 获取标签中的内容数据

    这里还是以该页面为例,获取里面标签的对应内容,进行试错

    urllst = url_extract(db,datatable,'链接')[:10]

    u = urllst[0]
    r = requests.get(u,headers = dic_headers, cookies = dic_cookies)
    soup = BeautifulSoup(r.text, 'lxml')
    dic = {}
    dic['标题'] = soup.h1.text
    price = soup.find('div', class_="price").text
    dic['总价_万'] = re.search(r'(\d+)万', price).group(1)
    dic['单价_元'] = re.search(r'(\d+)元', price).group(1)

    base_info = soup.find('div', class_="base").find('ul').find_all('li')
    for li in base_info:
    st = re.split(r'<.*?>',str(li))
    dic[st[2]] = st[3]

    transaction_info = soup.find('div', class_="transaction").find('ul').find_all('li')
    for li in transaction_info:
    st = re.split(r'<.*?>',str(li))
    dic[st[2]] = st[4].replace('\n','').replace(' ','')

    loc = re.search(r"resblockPosition:'([\d.]+),([\d.]+)'",r.text)
    dic['lng'] = loc.group(1)
    dic['lat'] = loc.group(2)

    print(dic)

    输出的结果为:

    封装第二个函数及输出可视化

    关于base_info和transaction_info获取的过程有点难度

    def get_data(ui,d_h,d_c,ips,table):
    ''' 函数
    ui:数据信息网页
    d_h:user-agent信息
    ips:代理设置
    table:mongo集合对象
    '''
    r = requests.get(ui,headers = d_h, cookies = d_c)
    soup = BeautifulSoup(r.text, 'lxml')
    dic = {}
    dic['标题'] = soup.h1.text
    price = soup.find('div', class_="price").text
    dic['总价_万'] = re.search(r'(\d+)万', price).group(1)
    dic['单价_元'] = re.search(r'(\d+)元', price).group(1)

    base_info = soup.find('div', class_="base").find('ul').find_all('li')
    for li in base_info:
    st = re.split(r'<.*?>',str(li))
    dic[st[2]] = st[3]

    transaction_info = soup.find('div', class_="transaction").find('ul').find_all('li')
    for li in transaction_info:
    st = re.split(r'<.*?>',str(li))
    dic[st[2]] = st[4].replace('\n','').replace(' ','')

    loc = re.search(r"resblockPosition:'([\d.]+),([\d.]+)'",r.text)
    dic['lng'] = loc.group(1)
    dic['lat'] = loc.group(2)
    table.insert_one(dic)

    最后的可视化代码如下

    urllst = url_extract(db,datatable,'链接')[:100]

    errorlst = []
    count = 1
    for u in urllst:
    print("程序正在休息......")
    time.sleep(5)
    try:
    get_data(u,dic_headers,dic_cookies,'a', datatable2)
    print(f'成功采集{count}条数据')
    count += 1
    except:
    errorlst.append(u)
    print('数据采集失败,网址为:',u)

    输出结果:


    数据库中的数据


    本文共计1339个文字,预计阅读时间需要6分钟。

    如何使用Python深度采集链家二手房源详细信息?

    链家二手房源数据深度采集:本部分实践基于上一个博客获取的数据,具体参考网址如下:[网址链接]。爬虫逻辑:[提取网页链接]-[设置动态IP]-[获取详细信息]。


    链家二手房源数据深度采集

    这部分的实践是基于上一个博客获得的数据,具体的​​参考网址​​如下:

    爬虫逻辑 :–> –>

    函数式编程:

    函数1:url_extract(database,table,field) → 函数
    database:数据库
    table:源数据mongo集合对象
    field:url字段

    函数2:get_data(ui,d_h,ips,table) → 函数
    ui:数据信息网页
    d_h:user-agent信息
    ips:代理设置
    table:mongo集合对象

    前期准备并封装第一个函数

    上一个博客已经完成了分页中各个列表里面标题所对应的url(链接)采集,这里只需要加载一下即可

  • 导入相关库、代码分区和配置数据库
  • import re
    import requests
    import time
    from bs4 import BeautifulSoup
    import pymongo

    if __name__ == '__main__':
    myclient = pymongo.MongoClient("mongodb://localhost:27017/")
    db = myclient['链家二手房_1']
    datatable = db['data_1']
  • 数据提取
  • dlst = datatable.find()
    print(dlst)
    print(dlst[0])

    输出结果为:(dlst是一个可以迭代的对象,这里取出第一个元素示例)


    3) 封装第一个函数

    def url_extract(database,table,field):
    '''函数
    database:数据库
    table:源数据mongo集合对象
    field:url字段
    '''
    dlst = table.find()
    lst = []
    for item in dlst:
    lst.append(item[field])
    return lst

    urllst = url_extract(db,datatable,'链接')[:10]
    print(urllst)

    输出结果为:(网页均可以打开)

    ​[‘​​​​bj.lianjia.com/ershoufang/101106641912.html’​​​​​, ‘​​​​bj.lianjia.com/ershoufang/101106120874.html’​​​,

    ​​‘​​​​bj.lianjia.com/ershoufang/101106506136.html’​​​​​, ‘​​​​bj.lianjia.com/ershoufang/101106369778.html’​​​,

    ​​‘​​​​bj.lianjia.com/ershoufang/101106678537.html’​​​​​, ‘​​​​bj.lianjia.com/ershoufang/101106148748.html’​​​,

    ​​‘​​​​bj.lianjia.com/ershoufang/101106628849.html’​​​​​, ‘​​​​bj.lianjia.com/ershoufang/101104451607.html’​​​,

    ​​‘​​​​bj.lianjia.com/ershoufang/101104041998.html’​​​​​, ‘​​​​bj.lianjia.com/ershoufang/101106586759.html’​​​]

    如何使用Python深度采集链家二手房源详细信息?

    数据标签定位

    由于前一个博文已经测试了网址可以进行正常的数据请求响应,这里就不再进行测试了,以某一页面为例,进行试错,直接确定采集的字段(标题可以直接通h1获取),如下

  • 房价信息对应的标签
  • 基础信息对应的标签
  • 交易信息对应的标签
  • 经纬度对应的标签
    这里可以通过网页里面的出现的位置,然后复制到坐标拾取器里面,查看经纬度,然后复制经度的前面的数字,在源代码(不是检查页面)中找到相应的位置
  • 在源代码页面选择查找,输入116(因为上面搜到的只是大致的地址,但是前面的经度是没有问题的),就会出现对应的位置信息
  • 获取标签中的内容数据

    这里还是以该页面为例,获取里面标签的对应内容,进行试错

    urllst = url_extract(db,datatable,'链接')[:10]

    u = urllst[0]
    r = requests.get(u,headers = dic_headers, cookies = dic_cookies)
    soup = BeautifulSoup(r.text, 'lxml')
    dic = {}
    dic['标题'] = soup.h1.text
    price = soup.find('div', class_="price").text
    dic['总价_万'] = re.search(r'(\d+)万', price).group(1)
    dic['单价_元'] = re.search(r'(\d+)元', price).group(1)

    base_info = soup.find('div', class_="base").find('ul').find_all('li')
    for li in base_info:
    st = re.split(r'<.*?>',str(li))
    dic[st[2]] = st[3]

    transaction_info = soup.find('div', class_="transaction").find('ul').find_all('li')
    for li in transaction_info:
    st = re.split(r'<.*?>',str(li))
    dic[st[2]] = st[4].replace('\n','').replace(' ','')

    loc = re.search(r"resblockPosition:'([\d.]+),([\d.]+)'",r.text)
    dic['lng'] = loc.group(1)
    dic['lat'] = loc.group(2)

    print(dic)

    输出的结果为:

    封装第二个函数及输出可视化

    关于base_info和transaction_info获取的过程有点难度

    def get_data(ui,d_h,d_c,ips,table):
    ''' 函数
    ui:数据信息网页
    d_h:user-agent信息
    ips:代理设置
    table:mongo集合对象
    '''
    r = requests.get(ui,headers = d_h, cookies = d_c)
    soup = BeautifulSoup(r.text, 'lxml')
    dic = {}
    dic['标题'] = soup.h1.text
    price = soup.find('div', class_="price").text
    dic['总价_万'] = re.search(r'(\d+)万', price).group(1)
    dic['单价_元'] = re.search(r'(\d+)元', price).group(1)

    base_info = soup.find('div', class_="base").find('ul').find_all('li')
    for li in base_info:
    st = re.split(r'<.*?>',str(li))
    dic[st[2]] = st[3]

    transaction_info = soup.find('div', class_="transaction").find('ul').find_all('li')
    for li in transaction_info:
    st = re.split(r'<.*?>',str(li))
    dic[st[2]] = st[4].replace('\n','').replace(' ','')

    loc = re.search(r"resblockPosition:'([\d.]+),([\d.]+)'",r.text)
    dic['lng'] = loc.group(1)
    dic['lat'] = loc.group(2)
    table.insert_one(dic)

    最后的可视化代码如下

    urllst = url_extract(db,datatable,'链接')[:100]

    errorlst = []
    count = 1
    for u in urllst:
    print("程序正在休息......")
    time.sleep(5)
    try:
    get_data(u,dic_headers,dic_cookies,'a', datatable2)
    print(f'成功采集{count}条数据')
    count += 1
    except:
    errorlst.append(u)
    print('数据采集失败,网址为:',u)

    输出结果:


    数据库中的数据