代码链接
一、要爬取什么数据?
1、打开链家网,将目标城市设为上海。进入”二手房“板块。

2、获取二手房明细信息
每页30条二手房信息,共计100页,也就意味着本次信息抓取的数据条数最大值为3000条。

点击标题链接,需要抓取的信息如下图所示,包括标题、房屋总价、单价、所在区域、小区名称、房屋其他基本信息等。

二、获取每条二手房数据对应的url链接
1、二手房板块每页的url
上文有提到,链家二手房板块有100页,我们需要获取每个页面对应的url。

以第二页url为例:https://sh.lianjia.com/ershoufang/pg2/
发现每页的url构造有规律可循,第几页就对应着pg几。

import re
import requests
##生成需要爬取的页数的url
def generate_allurl(user_in_number):#参数user_in_number可由用户自行输入urls_outer=[]for url_next in range(1,user_in_number+1):url='https://sh.lianjia.com/ershoufang/pg{}/'url=url.format(url_next)urls_outer.append(url)return(urls_outer)

2、每页二手房信息明细链接
上文有提到,每页二手房信息条数为30条,对应着30个明细url链接。这个链接是我们在爬取数据时真正需要用到的最内层明细链接。

该url明细链接可以在上一步获取的每页url的框架源代码中获取。

首先使用requests.get()获取网页的源代码,然后通过正则表达式模糊匹配可以筛选出该html页面中所有的二手房url明细链接。关于requests库更多的明细信息,可以参考这篇文章requests库用法大全

 #获取每一页的房源url链接汇总
def get_allurl():urls_inner=[]user_in_number=int(input('请输入生成页数:'))for url in generate_allurl(user_in_number):get_url = requests.get(url)#requests.get()方法用于获取网页源代码,返回的格式时JSONif get_url.status_code == 200:#判断requests.get()返回的状态码是否是200,200意味着连接成功。re_set = re.compile('https://sh.lianjia.com/ershoufang/[0-9]+\.html')#设置正则表达式的patternre_get = re.findall(re_set,get_url.text)#返回列表值re_get=list(set(re_get))#去除重复项目urls_inner.append(re_get)#返回嵌套列表allurls=[i for k in urls_inner for i in k]#将嵌套列表展开return(allurls)

三、使用BeautifulSoup解析html信息
接下来,就可以对每页的html进行解析,获取文章开头提到的需要获取的各类信息。

import re
import requests
from  bs4 import BeautifulSoup
import get_allurls#import自定义模块
from get_allurls import *
import pandas as pd
from pandas import Series,DataFrame
import numpy as np
from numpy import random
def parse_url():info_db=DataFrame()all_urls=get_allurls.get_allurl()for url in all_urls:info={}       res=requests.get(url)#if res.status_code==200:html=res.content#响应内容soup=BeautifulSoup(html,'html.parser')#该网站的html代码中有的标识为空,字典赋值会出现报错IndexError: list index out of range#加上try.....except 错误机制跳过空值try:#获取标题title=soup.select('.main')[0].text#获取房屋总价(单位万)total_price=soup.select('.total')[0].text#输出如:'775'#获取房屋单价(单位元)price=soup.select('.unitPriceValue')[0].text#输出如:'85147元/平米'#获取房屋名称及所属区s=soup.find_all('div',attrs={'class':'fl l-txt'})[0]##返回的s格式如下##<div class="fl l-txt"><a href="/">上海房产网</a><span class="stp"> &gt; </span><a href="/ershoufang/">上海二手房</a><span class="stp"> &gt; </span><a href="/ershoufang/jingan/">静安二手房</a><span class="stp"> &gt; </span><a href="/ershoufang/daning/">大宁二手房</a><span class="stp"> &gt; </span><a href="/ershoufang/c5011000010670/">上海滩大宁城(公寓)二手房</a><span class="stp"> &gt; </span> <span>当前房源</span> </div>s=re.findall('<a.*?</a',str(s))#规整s##返回的s格式如下##['<a href="/">上海房产网</a',##'<a href="/ershoufang/">上海二手房</a',##'<a href="/ershoufang/jingan/">静安二手房</a',##'<a href="/ershoufang/daning/">大宁二手房</a',##'<a href="/ershoufang/c5011000010670/">上海滩大宁城(公寓)二手房</a']name=re.findall('>(.*?)<',s[-1])[0]#将s继续规整,得到name,'上海滩大宁城(公寓)二手房'district=re.findall('>(.*?)<',s[2])[0]#'静安二手房'info['title']=title#标题info['name']=name#小区名称info['district']=district#所在区info['total_price']=total_price#房屋总价info['price']=total_price#单价#获取房屋基本信息basic_info=re.findall("""房屋户型</span>.*?</li>|所在楼层</span>.*?</li>|建筑面积</span>.*?</li>|户型结构</span>.*?</li>|套内面积</span>.*?</li>|建筑类型</span>.*?</li>|房屋朝向</span>.*?</li>|建筑结构</span>.*?</li>|装修情况</span>.*?</li>|梯户比例</span>.*?</li>|配备电梯</span>.*?</li>""",str(soup('li')),re.VERBOSE)#re.VERBOSE参数可以将正则表达式写成多行,并且自动忽略空格,此处一定要加上该参数。#输出的basic_info列表格式如下:#['房屋户型</span>3室2厅1厨1卫</li>',#'所在楼层</span>中楼层 (共23层)</li>',#'建筑面积</span>91.02㎡</li>',#'户型结构</span>暂无数据</li>',#'套内面积</span>暂无数据</li>',#'建筑类型</span>板楼</li>',#'房屋朝向</span>南</li>',#'建筑结构</span>钢混结构</li>',#'装修情况</span>精装</li>',#'梯户比例</span>两梯三户</li>',#'配备电梯</span>有</li>']basic_info_list=[]for i in basic_info:i=re.findall('>(.*?)<',i)[0]#对basic_info列表中的值进行规整basic_info_list.append(i)#规整后的basic_info_list格式如下:#['3室2厅1厨1卫',#'中楼层 (共23层)',#'91.02㎡',#'暂无数据',#'暂无数据',#'板楼',#'南',#'钢混结构',#'精装',#'两梯三户',#'有']info['house_type']=basic_info_list[0]#房屋户型info['floor_loc']=basic_info_list[1]#所在楼层info['house_area']=basic_info_list[2]#建筑面积info['house_struc']=basic_info_list[3]#户型结构info['real_area']=basic_info_list[4]#套内面积info['archi_cate']=basic_info_list[5]#建筑类型info['house_toward']=basic_info_list[6]#房屋朝向info['archi_struc']=basic_info_list[7]#建筑结构info['deco_condition']=basic_info_list[8]#装修情况info['elevator_rate']=basic_info_list[9]#梯户比例info['elevator_equip']=basic_info_list[10]#配备电梯except IndexError:continue             info_db=pd.concat([info_db,DataFrame(info,index=[1])],axis=0,ignore_index=True)#将字典转为DataFrame,循环concatreturn(info_db)#返回DataFrame格式的数据

在爬取数据的这一步遇到了一些困难,就是每次爬取的数据条数达不到预期,我预期的数据应该是3000条左右(100页,每页30条数据),但是每次执行上述代码,爬取的数据有的时候是几百条有的时候是一千多条,都不尽人意。查阅了一些文档,意识到可能遭到了网站的反爬机制,前前后后也试了不少方法,例如使用了代理ip,在头文件中设置user-agent,增加重连接次数、关闭多余的url链接等等等,但是都没有真正解决问题。最后舍弃了上述种种应付网站反爬机制的方法,只是换了一个网速快点的网络,竟然成功了。所以,爬取数据的时候请一定要首先确保网络通畅。
虽然最终上述应付反爬的方法没有用上,不过这里也可以记录下代码,以后说不定也能用上。

#应对网站反爬
requests.adapters.DEFAULT_RETRIES=5#增加重连次数
s = requests.session()
s.keep_alive=False#keep_alive = False关闭多余连接
proxy ={'http':'211.144.213.145'}#代理ip,这个网站的免费ip亲测可用,应付练习足够了。https://www.zdaye.com/shanghai_ip.html#Free
headers = {'Host': "sh.lianjia.com",'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",'Accept-Encoding': "gzip, deflate, sdch",'Accept-Language': "zh-CN,zh;q=0.8",'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36",'Connection': "keep-alive"
}#关于为什么需要使用头文件,这篇文章可以参考https://blog.csdn.net/lujuntong/article/details/81952519?ops_request_misc=&request_id=&biz_id=102&utm_term=python%E5%8F%8D%E7%88%AC%E8%99%AB&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-81952519
s.get(url,headers=headers,proxies=proxy,timeout=10)#默认timeout为None,不设置超时时间,这里通过设置超时时间来控制访问效率,遇到超时访问直接跳过。

四、数据展示
最终获得了2978条上海地区二手房数据,可以利用这些数据进行接下来的数据分析操作。具体的数据清洗、数据规整、数据分析、数据可视化展现等后续操作,会在后续文章中接着细写。

用python的requests模块爬取上海地区链家二手房数据相关推荐

  1. python怎么爬取Linux作业,Python爬虫之使用Fiddler+Postman+Python的requests模块爬取各国国旗...

    介绍 本篇博客将会介绍一个Python爬虫,用来爬取各个国家的国旗,主要的目标是为了展示如何在Python的requests模块中使用POST方法来爬取网页内容. 为了知道POST方法所需要传递的HT ...

  2. Python爬虫之使用Fiddler+Postman+Python的requests模块爬取各国国旗

    介绍   本篇博客将会介绍一个Python爬虫,用来爬取各个国家的国旗,主要的目标是为了展示如何在Python的requests模块中使用POST方法来爬取网页内容.   为了知道POST方法所需要传 ...

  3. 学堂在线 python_Python作业1:Scrapy爬取学堂在线+链家二手房

    import scrapy import json from pprint import pprint from studyHall.items import StudyhallItem class ...

  4. python爬取网页内容requests_[转][实战演练]python3使用requests模块爬取页面内容

    本文摘要: 1.安装pip 2.安装requests模块 3.安装beautifulsoup4 4.requests模块浅析 + 发送请求 + 传递URL参数 + 响应内容 + 获取网页编码 + 获取 ...

  5. python爬虫 requests+bs4爬取猫眼电影 傻瓜版教程

    python爬虫 requests+bs4爬取猫眼电影 傻瓜版教程 前言 一丶整体思路 二丶遇到的问题 三丶分析URL 四丶解析页面 五丶写入文件 六丶完整代码 七丶最后 前言 大家好我是墨绿 头顶总 ...

  6. Python的Requests来爬取今日头条的图片和文章

    Python的Requests来爬取今日头条的图片和文章并且存入mongo config.py MONGO_HOST = 'localhost' MONGO_PORT = 27017 MONGO_DB ...

  7. python使用requests库爬取淘宝指定商品信息

    python使用requests库爬取淘宝指定商品信息 在搜索栏中输入商品 通过F12开发者工具抓包我们知道了商品信息的API,同时发现了商品数据都以json字符串的形式存储在返回的html内 解析u ...

  8. 2021春项目需求记录 python实现模拟登录+爬取NASA Modis 上的产品数据

    python实现模拟登录+爬取Nasa Modis 上的产品数据 概述 需求分析 基本思路 代码 概述 3月的中旬时候参与了学校的一个大创项目,作为本科生,本人只是摸鱼打杂,负责了其中的一个功能模块: ...

  9. python爬取二手房信息_刚刚接触PythonR?教你爬取分析赶集网北京二手房数据(附详细代码)...

    原标题:刚刚接触Python&R?教你爬取分析赶集网北京二手房数据(附详细代码) 源 /数据森麟文 /徐涛 前言: 本文主要分为两部分:Python爬取赶集网北京二手房数据&R对爬取的 ...

  10. 爬取北京链家二手房数据

    利用python爬取了北京链家主页的二手房数据,爬取时间为2020年1月8日.由于链家只显示了100页.每页30条,因此只能爬取3000条数据. 后续将爬取各区的小区名,对每个小区的在售二手房数据进行 ...

最新文章

  1. 集成 Kendo UI for Angular 2 控件
  2. 【Python自学笔记】10个爬虫入门实例,附源码与注释
  3. 如何在require中使用VUE
  4. POJ 3660 Cow Contest [Floyd]
  5. python cnn 时间序列_有什么好的模型可以做高精度的时间序列预测呢?
  6. redis 缓存模式
  7. 本示例主要展示如何在XtraGrid网格控件(包含在DevExpress WinForms套包中)的主视图中指定HyperLinkEdit控件作为列编辑器...
  8. Hadoop环境搭建学习(1)
  9. SAP Serial Number
  10. x264码率控制(二)lookahead
  11. 基于 M2Mqtt 和 emqx 实现的MQTT通讯
  12. Java面试题----基础
  13. 破局:技术视野与规划
  14. 经历过CMMI后的体会和总结,为什么别人的时间总是比你的值钱
  15. 闭合导线的近似平均差(工程测量)
  16. C++使用windows API实现https站点的访问
  17. oracle翻译Advanced,Oracle高级复制,Oracle advanced replication,音标,读音,翻译,英文例句,英语词典...
  18. Bayesian face revisited : a joint formulation 笔记
  19. 印象中的tcp?你可能一直都理解错了|开发者的必备技能
  20. 撞库是什么意思?与洗库和拖库有什么关系?

热门文章

  1. 流光快门Matlab,手机相机中的流光快门怎么用?教你用流光快门拍出最炫酷的照片...
  2. 2015年 教师全员远程培训挂机 教师远程全员培训挂机 教师继续教育挂机 挂机软件 全国通用版...
  3. 概率论与数理统计---全概率、贝叶斯公式、事件独立性
  4. 金蝶k3系统中间服务器不可用,【金蝶软件】客户端登陆时提示远程服务器不存在或不可用(金蝶K3系统)...
  5. 金蝶K3系统个别用户操作卡顿的处理办法
  6. sqlserver2005 安装图解教程以及SQL 2005 SP3补丁安装图文教程
  7. MTK 手机支持3D
  8. Cisco无线路由基本操作
  9. 联想G480安装WinXp
  10. RainMeter学习4