Python获取anjuke房源信息方法实操

通过看别人写的已经是可以知道个大概了,接下来就是对照着网页来获取采集一些信息,本文获取到的信息没有转得很深入,只停留在带标签的数据程度,着重爬的方法和如何找页面数据(需要会用F12功能,会JS的应该都不难)

一、数据网页分析获取链接(按价格排序)

我们看网页链接,得到规律

第一页:

https://nanning.anjuke.com/sale/xixiangtang/o4/

第二页、三页...,规律我们用个i来做循环

i = 'o4-p' + str(i)

url = r"https://nanning.anjuke.com/sale/xixiangtang/"+i+"/#filtersort"

然后进入关键的步骤,拿取每页链接里面的<a>标签里的详细数据页链接,通过对网页的查看源代码,可以得到<a>标签都在class为house-title的<div>里面,所以我们就可以通过BeauifulSoup去拿到网页源后获得<a>标签里的内容,这里获取href和title内容:

r = requests.get(url=url, headers=headers) #url就是上面找到的url
        soup = BeautifulSoup(r.text, 'lxml')
        for j in soup.find_all(name='div', attrs={'class': 'house-title'}):
            community = str(j)
            if '''target="_blank"''' in community:
                #print(community)
                rex1 = re.compile("href=\"(.+?)\"")
                rex2 = re.compile("title=\"(.+?)\"")
                community_url = rex1.findall(community)[0]
                community_name = rex2.findall(community)[0]

二、拿到详细页面的href后(即community_url),就是获取详细页面所需要的信息,同样也是通过BeautifulSoup来拿到

r = requests.get(url=community_url, headers=headers)
    soup = BeautifulSoup(r.text, 'lxml')

接下来获取想要的信息,截图红色框框里面是我想要拿到的信息(上面的总价和下面的一些房屋基本信息):

 

 这里同样要看源码的代码,找到想要信息的关键。

上面"X万"这个信息的相同处在class名为info-tag的<span>标签里

下面的房屋信息的数据在class名为houseInfo-content的<div>标签里

因此我们把拿到的数据分别放入列表:

listInfo1 = soup.find_all(name='span', attrs={'class': 'info-tag'})

str1 = '"'+listInfo1[0].get_text()+'"'

listInfo2 = soup.find_all(name='li', attrs={'class': 'houseInfo-detail-item'})

for s2 in range(8):
            str2 = '"'+listInfo2[s2].get_text()+'"'

这里注意,我们获得的数据是多于想要的,所以我们可以用range控制一下数据范围

三、封装好所有的信息后,我们就存入一个txt里面

def export_communityInfo(xiaoquInfo_list):
    '''导出小区信息'''
    with open('anjuke-xixiangtang二手房信息.txt', 'a', encoding='utf-8') as file:
        file.write(','.join(xiaoquInfo_list))
        file.write('\n')

txt得到的信息就是我们想要的信息:

 

 贴爬虫全代码:

import socket
import re
import requests
from bs4 import BeautifulSoup
#from urllib import request
'''第一步:爬取小区信息'''
def export_communityInfo(xiaoquInfo_list):
    '''导出小区信息'''
    with open('anjuke-南宁xixiangtang二手房信息-(6月).txt', 'a', encoding='utf-8') as file:
        file.write(','.join(xiaoquInfo_list))
        file.write('\n')
def test_pachong():
    for i in range(1, 2):
        if i == 1:
            url = r"https://nanning.anjuke.com/sale/xixiangtang/o4/"
        else:
            i = 'o4-p' + str(i)
            url = r"https://nanning.anjuke.com/sale/xixiangtang/"+i+"/#filtersort"
        headers = {'user-agent': 'my-test/0.0.1'}
        r = requests.get(url=url, headers=headers)
        print('infotest1')
        soup = BeautifulSoup(r.text, 'lxml')
        for j in soup.find_all(name='div', attrs={'class': 'house-title'}):
            community = str(j)
            if '''target="_blank"''' in community:
                rex1 = re.compile("href=\"(.+?)\"")
                rex2 = re.compile("title=\"(.+?)\"")
                community_url = rex1.findall(community)[0]
                community_name = rex2.findall(community)[0]
                try:
                    get_communityInfo(community_url, community_name)
                except:
                    print('{}的{}异常, url是{}'.format(i, community_name, community_url))
def get_communityInfo(community_url, community_name):
    '''获取某个小区的信息'''
    headers = {'user-agent': 'my-test/0.0.1'}
    r = requests.get(url=community_url, headers=headers)
    soup = BeautifulSoup(r.text, 'lxml')
    xiaoquInfo_list = []
    community_name = '"' + community_name + '"'
    xiaoquInfo_list.append(community_name)
    getTotalPriceAndDetailInfo(soup,xiaoquInfo_list)
    xiaoquInfo_list.pop()
    export_communityInfo(xiaoquInfo_list)
    print('已爬取{}的信息'.format(community_name),'----')
def getTotalPriceAndDetailInfo(soup,xiaoquInfo_list):
    try:
        listInfo1 = soup.find_all(name='span', attrs={'class': 'info-tag'})
        num = len(listInfo1)
        #for s1 in range(1):
        str1 = '"'+listInfo1[0].get_text()+'"'
        print(str1)
        str1.replace(' ', '')
        str1.replace("\n", "")
        xiaoquInfo_list.append(str1)
    except:
        listInfo1 = '空1'
        print(listInfo1)
    try:
        listInfo2 = soup.find_all(name='div', attrs={'class': 'houseInfo-content'})
        num = len(listInfo2)
        for s2 in range(8):
            str2 = '"'+listInfo2[s2].get_text()+'"'
            str2.replace(' ', '')
            str2.replace("\n", "")
            xiaoquInfo_list.append(str2)
    except:
        listInfo2 = '空2'
        print(listInfo2)
test_pachong()

记得引用import库的要安装相应的库,https://blog.csdn.net/nzzl54/article/details/95348061文章里面提到的

====================补充======================

txt不好看数据,我们可以通过pandas库转成exel更直观(这里在上面爬虫获取了更多的数据源,前20页数据,注意txt的空格和换行问题导致的数据问题,这里生成的txt还没有能找到很好的解决方法)

import pandas as pd
'''第二步:数据清洗'''
def clean_data():
    '''数据清洗'''
    pd.set_option('display.max_columns', None)  # 显示所有列
    column_name = ['信息名称', '总价', '所属小区', '房屋户型', '房屋单价', '位置地址','建筑面积','参考首付','建造年代']
    xiaoqu_data = pd.read_csv(r'anjuke-南宁xixiangtang二手房信息-(6月).txt', names=column_name, encoding='utf-8', engine='python')
    xiaoqu_data.to_excel(r"南宁xixiangtang小区数据.xlsx", encoding='gbk', index=False)
clean_data()

转换完成后就能得到exel数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值