Python实现的链家网站的爬虫第三部分。

本系列文将以链家南京站为例,使用Python实现链家二手房源信息的爬虫,将数据爬取,并存入数据库中,以便使用。

本系列第一部分为基础:

如何高效地爬取链家的房源信息(一)

本系列第二部分为爬取小区信息:

如何高效地爬取链家的房源信息(二)

本文是第三部分,爬取在售二手房信息并存入数据库,部分代码依赖于第一部分,同时依赖于第二部分的结果。

在前文中已经获取了小区信息,并存在了数据库中,直接读库遍历小区进行爬取:

def do_xiaoqu_zaishou_spider(db_xq,db_zs):

"""

批量爬取小区在售

"""

count=0

xq_list=db_xq.fetchall()

for xq in xq_list:

xiaoqu_zaishou_spider(db_cj,xq[0])

count+=1

print ('have spidered zaishou %d xiaoqu %s' % (count,xq[0]))

print( 'done')

对某一个小区内的所有在售房源进行爬取,需要分页:

def xiaoqu_zaishou_spider(db_cj, xq_url=u"https://nj.lianjia.com/xiaoqu/1411000000391/"):

"""

爬取小区在售

"""

url = xq_url.replace('xiaoqu/','ershoufang/c');

try:

req = urllib.request.Request(url, headers=hds[random.randint(0, len(hds) - 1)])

source_code = urllib.request.urlopen(req, timeout=10).read()

plain_text = source_code.decode('utf-8')

soup = BeautifulSoup(plain_text,"html.parser")

except (urllib.request.HTTPError, urllib.request.URLError) as e:

print(e)

exception_write('xiaoqu_zaishou_spider', xq_url)

return

except Exception as e:

print(e)

exception_write('xiaoqu_zaishou_spider', xq_url)

return

content = soup.find('div', {'class': 'page-box house-lst-page-box'})

total_pages = 0

if content:

d = "d=" + content.get('page-data')

loc = {}

glb = {}

exec(d, glb, loc);

total_pages = loc['d']['totalPage']

threads = []

for i in range(total_pages):

tmp= u'ershoufang/pg%dc'% (i + 1)

url_page = url.replace('ershoufang/c',tmp);

t = threading.Thread(target=zaishou_spider, args=(db_cj, url_page))

threads.append(t)

for t in threads:

t.start()

for t in threads:

t.join()

爬取单个页面内的在售信息:

def zaishou_spider(db_cj, url_page=u"https://nj.lianjia.com/chengjiao/pg4c1411000000142/"):

"""

爬取页面链接中的在售

"""

try:

req = urllib.request.Request(url_page, headers=hds[random.randint(0, len(hds) - 1)])

source_code = urllib.request.urlopen(req, timeout=10).read()

plain_text = source_code.decode('utf-8');

soup = BeautifulSoup(plain_text,"html.parser")

except (urllib.request.HTTPError, urllib.request.URLError) as e:

print(e)

exception_write('zaishou_spider', url_page)

return

except Exception as e:

print(e)

exception_write('zaishou_spider', url_page)

return

cjs = soup.find('ul', {'class': 'sellListContent'});

cj_list = cjs.findAll('li', {})

for cj in cj_list:

info_dict = {}

title = cj.find('div', {'class': 'title'});

houseInfo = cj.find('div', {'class': 'houseInfo'});

positionInfo = cj.find('div', {'class': 'positionInfo'});

followInfo = cj.find('div', {'class': 'followInfo'});

tag = cj.find('div', {'class': 'tag'});

totalPrice = cj.find('div', {'class': 'totalPrice'});

unitPrice = cj.find('div', {'class': 'unitPrice'});

href = title.find('a')

if not href:

continue

info_dict.update({u'链接': href.attrs['href']})

content = title.text

info_dict.update({u'房子描述': content})

content = houseInfo.text.split('|')

#有可能有别墅项,有可能无部分项

if content:

info_dict.update({u'小区名称': content[0].strip()})

if content[1].find(u'墅') != -1:

i=1;

else:

i=0;

if len(content) >= 2+i:

info_dict.update({u'户型': content[1+i].strip()})

if len(content) >= 3+i:

info_dict.update({u'面积': content[2+i].strip()})

if len(content) >= 4+i:

info_dict.update({u'朝向': content[3+i].strip()})

if len(content) >= 5+i:

info_dict.update({u'装修': content[4+i].strip()})

if len(content) >= 6+i:

info_dict.update({u'电梯': content[5+i].strip()})

content = positionInfo.text.split('-')

if len(content) >= 2:

info_dict.update({u'楼层年代楼型': content[0].strip()})

info_dict.update({u'区域': content[1].strip()})

else:

info_dict.update({u'区域': content[0].strip()})

content = followInfo.text.split('/')

for cont in content:

if cont.find(u'关注') != -1:

info_dict.update({u'关注': cont.strip()})

elif cont.find(u'带看') != -1:

info_dict.update({u'带看': cont.strip()})

elif cont.find(u'发布') != -1:

info_dict.update({u'发布时间': cont.strip()})

if tag != None:

tagall=tag.findAll('span')

for span in tagall:

if span.attrs['class'][0] ==u'taxfree':

info_dict.update({u'税费': span.text})  # 满几年

elif span.attrs['class'][0] ==u'subway':

info_dict.update({u'地铁': span.text})

elif span.attrs['class'][0] ==u'haskey':

info_dict.update({u'限制': span.text})

info_dict.update({u'挂牌价': totalPrice.text})

info_dict.update({u'挂牌单价': unitPrice.text})

command = gen_zaishou_insert_command(info_dict)

db_zs.execute(command, 1)

爬取的在售房源信息将被存储到数据库表中。


在接下来将说明如何爬取历史成交二手房信息,敬请期待。

长按进行关注。

如何高效地爬取链家的房源信息(三)相关推荐

  1. 如何高效地爬取链家的房源信息(四)

    "Python实现的链家网站的爬虫第四部分,最后一部分." 本系列文将以链家南京站为例,使用Python实现链家二手房源信息的爬虫,将数据爬取,并存入数据库中,以便使用. 本系列第 ...

  2. 如何高效地爬取链家的房源信息(二)

    "Python实现的链家网站的爬虫第二部分." 本系列文将以链家南京站为例,使用Python实现链家二手房源信息的爬虫,将数据爬取,并存入数据库中,以便使用. 本系列第一部分: 如 ...

  3. 如何高效地爬取链家的房源信息(一)

    "Python实现的链家网站的爬虫第一部分." 在之前的文章,以链家成都站为例,分析过链家网站数据的爬取,文章如下: 干货!链家二手房数据抓取及内容解析要点 但是,当时没有根据分析 ...

  4. python+selenium爬取链家网房源信息并保存至csv

    python+selenium爬取链家网房源信息并保存至csv 抓取的信息有:房源', '详细信息', '价格','楼层', '有无电梯 import csv from selenium import ...

  5. python 爬虫实践 (爬取链家成交房源信息和价格)

    简单介绍 pi: 简单介绍下,我们需要用到的技术,python 版本是用的pyhon3,系统环境是linux,开发工具是vscode:工具包:request 爬取页面数据,然后redis 实现数据缓存 ...

  6. 如何爬取链家网页房源信息

    由于个人安装的Python版本是2.7的,因此此后的相关代码也是该版本. 爬取网页所有信息  利用urllib2包来抓取网页的信息,先介绍下urllib2包的urlopen函数.  urlopen:将 ...

  7. 一、如何爬取链家网页房源信息

    由于个人安装的Python版本是2.7的,因此此后的相关代码也是该版本. 爬取网页所有信息 利用urllib2包来抓取网页的信息,先介绍下urllib2包的urlopen函数. urlopen:将网页 ...

  8. 爬取链家所有房源信息(在售、成交、租房)

    环境:Windows10+Anaconda python3.6.5+Spyder 目标:抓取链家北京地区所有房源信息. 打开链家官网 https://bj.lianjia.com/ .粗略的浏览了一下 ...

  9. Python爬取链家成都二手房源信息

    作者 | 旧时晚风拂晓城 编辑 | JackTian 来源 | 杰哥的IT之旅(ID:Jake_Internet) 转载请联系授权(微信ID:Hc220066) 公众号后台回复:「成都二手房数据」,获 ...

最新文章

  1. python获取数据库查询的元数据_Python数据库、MySQL存储引擎、使用分区表、更改表结构、获取数据库元数据...
  2. 计算机二级各个科目的区别,计算机二级考试的各个科目的内容及区别.doc
  3. elasticsearch与PHP版本要求
  4. Exception processing async thread queue
  5. 算法:用户喜好--Map与List配合下的查找
  6. kotlin 查找id_Kotlin程序在矩阵中查找偶数和奇数的频率
  7. 判别Linux是CentOs还是Ubuntu的最简单方法
  8. 第二十七期:Deepfake视频正在快速传播,也许区块链能够阻止这波“瘟疫”
  9. 如何升级docker的版本 ?
  10. java山地自行车怎么看型号_怎么看捷安特山地车型号 请问有知道捷安特自行车型号...
  11. 低代码和零代码火了,十大利器推荐!
  12. Linux 命令(76)—— kill 命令
  13. 如何用tomcat发布自己的Java项目
  14. C#_自动化测试3_controll IE
  15. android上的单片机编程软件下载,AVR单片机编程软件(AVR_fighter)
  16. 生成各种格式的 Excel 文件示例
  17. 2.3.1 浮点数的表示
  18. c51数字钟c语言程序,51单片机电子时钟C语言程序
  19. Python入门(10)——宝可梦数据集探索
  20. Vue开发之基础路由

热门文章

  1. Xcode可重用代码块code snippets
  2. 源码推荐:collectionView拖拽,仿凤凰FM iOS 局部监听键盘再也不会挡住输入框
  3. jupyter notebook出现cannot import name 'create_prompt_application'问题(Died Kernel)
  4. 整理的一点MD5资料(第一部分)
  5. 洛谷P3723 [AH2017/HNOI2017]礼物(FFT)
  6. 深入理解 python 元类
  7. Spring Boot 教程(三): Spring Boot 整合Mybatis
  8. 苹果手表可以运行 ruby 脚本了
  9. Cacti Weathermap添加主机在线状态图示检测
  10. Access sql语句创建表及字段类型