目录

  • 1.简介
  • 2. 爬虫思路
    • 2.1 网页分析
    • 2.2 详情页分析
    • 2.3 不同页码的爬取
    • 2.4 解决链家只显示100页数据
    • 2.5 简单的反爬与进度条显示
  • 3. 总结

1.简介

  最近帮同学爬取了链家在售二手房的信息,这是本人学习爬虫以来爬取数据最多的一次,就想着写个博客记录一下。
  本次爬虫是利用python+jupyter notebook实现的,用到的第三方库如下:

import pandas as pd # 数据存储
import requests # 网页内容获取
import re # 解析数据
from lxml import etree # 解析数据
import random
import time # 反反爬
from fastprogress import master_bar,progress_bar # 进度条显示

2. 爬虫思路

2.1 网页分析

  本次爬取链家网站中温州二手房的信息https://wz.lianjia.com/ershoufang/:

  通过F12(或单击右键选择检查)打开浏览器自带的抓包工具,然后根据下图中的顺序点击鼠标,然后就得到了网页源码中含有的第一套房产的信息:

  通过对上图进行分析,可以通过正则表达式来获取到每个二手房详情页的url,先来测试一下,看一看获取到的源码和上面看到的是否一致:

def ua():"""随机获取一个浏览器用户信息"""user_agents = ['Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11','Opera/9.25 (Windows NT 5.1; U; en)','Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)','Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.5 (like Gecko) (Kubuntu)','Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12','Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.2.9','Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.7 (KHTML, like Gecko) Ubuntu/11.04 Chromium/16.0.912.77 Chrome/16.0.912.77 Safari/535.7','Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0',]agent = random.choice(user_agents)return {'User-Agent': agent}def get(url):"""获取网页源码url: 目标网页的地址return:网页源码"""res = requests.get(url=url, headers = ua())return res.textdef get_url(res_text):"""获取源码中每个二手房详情页的urlres_text:网页源码return:列表形式的30个二手房详情页的url"""re_f = '<a class="" href="(.*?)" target="_blank"'url_list = re.findall(re_f, res_text)return url_list

  如下图所示,成功得到了第一页中每套二手房的详情页的url。然后我们再对二手房的详情页进行分析

2.2 详情页分析

  通过2.1的操作现在成功拿到了详情页的url,打开详情页的链接后,接下来先用于上一小节相同的方式对网页进行分析:

  我们通过对网页的分析发现,详情页的房屋信息任然是保存再网页源码中的,现在我们可以尝试着获取房屋的标题:

def get_else_data(res_text):res_text = etree.HTML(res_text)title = res_text.xpath("//div[@class='sellDetailHeader']//h1/@title")return dict(zip(['标题'], [title]))

  ok,成功了,这说明我们可以通过同样的方式获取房屋的其它信息。
  根据我同学的要求,通过Xpath对网页源码就行解析,这样就能得到想要的数据了:

def get_data(res_text):"""获取房屋的详细数据"""res_text = etree.HTML(res_text)# 获取房屋的标题title = res_text.xpath("//div[@class='sellDetailHeader']//h1/@title")# 获取房屋的总价total_price = res_text.xpath("//div[@class='overview']//div/span/text()")[2]# 获取房屋的单价price = res_text.xpath("//div[@class='overview']//div/span/text()")[3]# 获取房屋的地段place = res_text.xpath("//div[@class='overview']//div/span/a/text()")## 房屋基本信息获取# 获取房屋基本信息的标题lab = res_text.xpath("//div[@class='base']//span/text()")# 获取房屋基本信息的内容val = res_text.xpath("//div[@class='base']//li/text()")## 获取房源交易信息# 获取房源交易标题key1 = res_text.xpath("//div[@class='transaction']//span[1]//text()")# 获取房源交易信息内容trans = res_text.xpath("//div[@class='transaction']//span[2]//text()")## 获取房源特色信息# 获取房源特色标题key = res_text.xpath("//div[@class='baseattribute clear']/div[@class='name']/text()")# 获取房源特色内容val1 = res_text.xpath("//div[@class='baseattribute clear']/div[@class='content']/text()")# 返回包含上述信息的字典return dict(zip(['标题', '总价格', '单价', '地段'] + lab + key1 + key,[title, total_price, price, place] + val + trans + val1))


  通过上面的代码就能得到想要的房屋的全部的基本信息。到此就实现了对某一页的房屋信息的爬取,并且通过对房屋详情页url列表的遍历,也能实现对某一页中全部30个房屋信息的爬取,接下来的问题就是如何实现爬取不同页码的内容?

2.3 不同页码的爬取

  其实再爬虫过程中实现翻页操作非常的简单,只需要对比不同页码的网页之间的url的不同,找到其中的规律,根据找到的规律,就能完美实现翻页的操作了。
  下面对比链家二手房不同页码网页之间的url差别:


  通过上面的对比发现,链家是通过在首页的url(https://qd.lianjia.com/ershoufang/)之后加上pg页码/来实现的翻页操作,对此我们可以遍历我们想要爬取的页码,再对页码就行遍历形成对应的url,这样就能实现对不同页码的爬取。
  在分析页码的过程中我们发现链家只显示100页的数据也就是3000个房屋的基本信息,这样的数据量太少了,没达到我同学的要求,那我们该咋办呢?

2.4 解决链家只显示100页数据

  通过简单的分析,我们想到了通过按区来爬取数据。选取页码为100的区,这样就能得到房屋基本信息,通过简单的分析网页的url:
  链家网站分区分页的url是由首页的url(https://qd.lianjia.com/ershoufang/)+各区的拼音/+pg页码/构成的,通过便利各区和页码列表我们就能得到我们想要的网页的url。

2.5 简单的反爬与进度条显示

  找到了想要爬取网页的url接下来就可以进行爬虫操作了,但是由于本次爬取的数据较多,代码运行时间较长,我们的爬虫很可能在运行过程中会被检测出来,在爬取数据的时候链家回对爬虫发起的请求进行人机验证,这样爬虫就不能正常运行。为了解决这个问题我们采取了以下的措施:

  • 请求头伪装浏览器用户信息
  • 进度条展示当前爬取页码
  • 两次爬虫之间间隔一段时间
  • 每爬5页就保存一下数据。
def main(qu,start_pg=1, end_pg=100, download_times=1):"""爬虫程序qu: 传入要爬取的qu的拼音的列表start_pg:开始的页码end_pg:结束的页码download_times:第几次下载"""for q in qu:# 获取当前区的首页urlurl = 'https://qd.lianjia.com/ershoufang/' + q + '/'# 数据储存的列表data = []# 文件保存路径filename = '二手房-' + q +'第' + str(download_times) + '次下载.csv'print('二手房-' + q +'第' + str(download_times) + '次下载')mb=master_bar(range(start_pg, end_pg+1))for i in mb:# 获取每页的urlnew_url = url + 'pg' + str(i) + '/'# 获取当前页面包含的30个房屋详情页的urlurl_list = get_url(get(new_url))for l in progress_bar(range(len(url_list)),parent=mb):# 反爬随机停止一段时间a = random.randint(2, 5)if l % a == 0:time.sleep(2 * random.random())# 获取当前页面的源码text = get(url_list[l])# 获取当前页面的房屋信息data.append(get_data(text))# 反爬随机停止一段时间time.sleep(3 * random.random())mb.child.comment = '正在爬取第'+str(l + 1) +'条数据!!'mb.main_bar.comment = '正在爬取第'+str(i+1) +'页数据!!'# 反爬随机停止一段时间time.sleep(5 * random.random())if i % 5 == 0:# 每5页保存一次数据pd.DataFrame(data).to_csv(filename, encoding='GB18030')mb.write('前'+str(i)+'页数据已保存')

  代码运行效果如下:  如果中途代码意外终止,我们向main()中传入相应的参数来继续下载,最后我们再把下载的数据合并在一个这样这次的爬虫工作就圆满结束了。

3. 总结

  本次爬虫的难度比较低,出了烦人的人机验证以外,在爬虫过程中就没有碰到其它的反爬措施,通过这次爬虫我最大的收获就是发现了自己能力的不足:

  • 由于是第一次爬取上万条的数据,在具体爬虫过程中不能有效解决链家的人机验证,只能手动解除;
  • 一开始由于没有测试代码,浪费了很多时间,还一直在爬第一页数据,以后的代码一定要测试

链家二手房信息爬取(内附完整代码)相关推荐

  1. PyQt5+Python+Excel链家二手房信息爬取、可视化以及数据存取

    成果图: 第一步运行代码searsh.py,效果如下 第二步选择你所需要爬取数据的城市,如湖北-武汉 然后搜索,结果如下 如果你想爬取更多信息,只需要点击下一页即可 第三步,保存数据.可以将所显示的所 ...

  2. 链家网页爬虫_爬虫实战1-----链家二手房信息爬取

    经过一段机器学习之后,发现实在是太枯燥了,为了增添一些趣味性以及熟练爬虫,在之后会不定时的爬取一些网站 旨在熟悉网页结构--尤其是HTML的元素,ajax存储,json:熟练使用pyspider,sc ...

  3. 【python】链家小区信息爬取

    首先在主页面中爬取详情页面的url 主页面示例: 详情页面示例: 在详情页面中我们可以爬取到小区的名称.房价.建筑年代.建筑类型.物业费用等各类信息 详细代码如下: import pandas as ...

  4. python链家二手房_python 爬取链家二手房信息

    '''Created on 2017-10-9 @author: wbhuangzhiqiang''' importsysimportreimportcsvimporturllib.requestfr ...

  5. 【Python爬虫项目】链家房屋信息抓取(超详细适合新手练习附源码)

    爬取链家房屋信息 爬取信息具体如下: 1.标题 2.位置 3.房屋介绍 4.房屋总价 5.房屋单价 一.检查网页源码 搜索标题中的关键字发现目标信息可以在源码中找到,所以我们请求该url网址就可以拿到 ...

  6. python关于二手房的课程论文_基于python爬取链家二手房信息代码示例

    基本环境配置 python 3.6 pycharm requests parsel time 相关模块pip安装即可 确定目标网页数据 哦豁,这个价格..................看到都觉得脑阔 ...

  7. python房子代码_基于python的链家小区房价爬取——仅需60行代码!

    简介 首先打开相关网页(北京链家小区信息). 注意本博客的代码适用于爬取某个城市的小区二手房房价信息. 如果需要爬取其他信息,可修改代码,链家的数据获取的基本逻辑都差不多. 效果展示 因为只需要60行 ...

  8. 爬虫系列之链家的信息爬取及数据分析

    关于链家的数据爬取和分析 已经实现 1.房屋数据爬取并下载 2.房屋按区域分析 3.房屋按经纪人分析 4.前十经纪人 5.经纪人最有可能的位置分析 6.实现以地区划分房屋 目前存在的问题: 1.多线程 ...

  9. python爬取南京市房价_基于python的链家小区房价爬取——仅需60行代码

    简介 首先打开相关网页(北京链家小区信息). 注意本博客的代码适用于爬取某个城市的小区二手房房价信息. 如果需要爬取其他信息,可修改代码,链家的数据获取的基本逻辑都差不多. 效果展示 因为只需要60行 ...

  10. python分析链家二手房信息----数据分析实战(一)

    链家二手房信息 # 导入需要的库:科学计算包numpy, pandas 可视化包matplotlib, seaborn 机器学习包 sklearn import numpy as np import ...

最新文章

  1. 详解Android实现全屏正确方法
  2. 【Qt】Qt中QJsonParseError类
  3. 视频编解码优化以及与AI的实践结合
  4. java的decode_Java decode机试题
  5. 【招聘(上海)】 坚果云 招聘Windows客户端(WPF方向)
  6. php 批量更新死锁,php – 在尝试获取锁定时,哪个查询导致死锁;尝试重新启动事务...
  7. 事物 php,什么是php事务
  8. tail,more查看日志(定点和翻页)
  9. 怎么用Linux命令查看BIOS信息,LINUX下怎样获取主板的信息用到什么命令
  10. php 各种进制表示,常用的进制有哪些
  11. swagger的使用
  12. linux jdk1.8 32位下载永久地址,ubuntu,centos,java
  13. catia制作物料明细_CATIA课时:符合GB的物料清单模板设置视频教程_翼狐网
  14. Matlab故障树的最小割集的求解
  15. 佛,我心中的一朵莲花
  16. C/C++ - enum 与 int 相互转换
  17. SAP ABAP BDC基础使用方法
  18. java开源tts_开源TTS(Text To Speah)的选择和使用
  19. 谈谈:高端网站定制开发的流程和步骤有哪些?
  20. 计算机单片机实训报告,单片机实训总结

热门文章

  1. 房地产公司网站建设需要多少钱
  2. Eclipse如何设置默认浏览器
  3. Cesium基础知识-创建3D地球
  4. 大专生从零开始重新学习c#的第八天
  5. 2022金属非金属矿山井下电气考试题模拟考试题库及答案
  6. 数据库表,excel,cvs 联系人转vcf
  7. python except exception_Python 获取异常(Exception)信息的几种方法
  8. 含绝对值函数的可导性
  9. 地方麻将吉林过蛋玩法算法
  10. 父子盒子边距塌陷之为什么设置margin-top父子盒子会一起移动