通过看别人写的已经是可以知道个大概了,接下来就是对照着网页来获取采集一些信息,本文获取到的信息没有转得很深入,只停留在带标签的数据程度,着重爬的方法和如何找页面数据(需要会用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数据