前言:二十一世纪,数据科技蓬勃发展的时代,身为IT专业的学生,怎么能不学习爬虫呢???项目中、论文里往往需要数据的支持,那么数据的来源就需要你去自行采集,可手动亦可“爬虫”,手动采集往往耗时耗力,那么今天小编就带大家利用Python编写程序学习requests静态爬虫。

操作环境: Windows10,Python3.6,pycharm、谷歌浏览器
目的网址: https://sz.lianjia.com/ershoufang/(链家深圳二手房)

爬虫目录

  • 1、爬虫摘要
  • 2、分析网页
    •   2.1、为什么要分析网页
    •   2.2、如何分析网页结构
  • 3、请求服务器
    •   3.1、设置浏览器代理
    •   3.2、请求服务器格式
  •   4、提取数据
    •   4.1、获取xpath、css节点方法
      •   4.1.1、xpath语法
      •   4.1.2、css语法
    •   4.2、xpath语法提取详情页链接
    •   4.3、css语法提取详情页数据
  • 5、持久化数据
    •   5.1、存入csv文件
  • 6、项目总结

1、爬虫摘要

  • 网络爬虫也叫网络蜘蛛,它是一个按照一定的规则自动提取网页程序,其会自动的通过网络抓取互联网上的网页,这种技术一般可能用来检查你的站点上所有的链接是否是都是有效的。当然,更为高级的技术是把网页中的相关数据保存下来,可以成为搜索引擎。
  • 搜索引擎使用网络爬虫寻找网络内容,网络上的HTML文档使用超链接连接了起来,就像织成了一张网,网络爬虫也叫网络蜘蛛,顺着这张网爬行,每到一个网页就用抓取程序将这个网页抓下来,将内容抽取出来,同时抽取超链接,作为进一步爬行的线索。网络爬虫总是要从某个起点开始爬,这个起点叫做种子,你可以告诉它,也可以到一些网址列表网站上获取。

2、分析网页

  2.1、为什么要分析网页

  当我们需要对目的网址进行爬取时,第一步不是先测试写代码简单请求爬取html源码,而是根据需求选择合适的方法进行爬取网页,弄明白目的网址数据的加载方法,判断它是静态还是动态加载尤为重要,这样才使我们事半功倍,所以选择一个好的请求方法是提升我们爬虫程序爬取的效率。

  2.2、如何分析网页结构

  首先进去链家网找到深圳二手房的页面,查看它的网页结构,点击“下一页”,查看它URL链接(也称统一资源定位符)的变化,会发现如下规律:

链接测试: 除了第一页,随意在上方图片中挑一个链接,新建一页面中访问查看,是否与当前内容一致,若无问题,就可以直接用访问链接的方式,使用代码程序代替浏览器请求网页的服务器,返回html文件对象,使用语法提取数据并保存信息,再生出下一页链接,继续请求上面服务器操作爬取信息。

生成链接: 利用for循环,生成1到100的数字即可,从上面的图片链接可看出翻页的间隔为1,for pn(页数的变量) in range(1,101,1) 必须要超过停止数字100,因为100不包含在其中,1是他的公差。

这里测试9页,执行代码为:

for pn in range(1,10,1):     # 翻页,间隔为1url = f'https://sz.lianjia.com/ershoufang/pg{pn}/'  # 填充目的链接print(url)

执行结果为:

3、请求服务器

  3.1、设置浏览器代理

  1.网页点击右键;
  2.打开检查;
  3.选择Network;
  4.点击All;
  5.刷新网页,双击目标链接(一般处于第一个);
  6.选择Headers

最基本的反爬: 设置请求头headers。
作用: 模拟浏览器,伪造请求身份,向目标服务器请求数据。

'''请求头,处理基本反爬,伪造身份向服务器请求'''
headers = {'Host': 'sz.lianjia.com','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'
}

  除了Headers请求头处理基本的网站反爬信息外,另外还设置了延迟,防止请求过快,被识别到是爬虫。

response = requests.get(url=url,headers=headers)    # 请求目的列表页
time.sleep(random.uniform(1.1, 1.5))    # 设置延迟随机1.1-1.5秒,防止识别到是爬虫

  3.2、请求服务器格式

  请求网页源代码,向目标服务器发送请求,返回200状态码表示成功。若在前面加上.text表示输出网页文本内容。

# 判断是否请求成功,若返回状态码200则表示请求成功
if response.status_code == 200:     text = response.text    # 网页编码print(text)
else:print('列表页请求失败。。。')

代码执行的部分结果为:

  4、提取数据

  查看网页结构可看出 ul 标签下的每个 li 标签对应着列表页的每个房源信息,每页至多30个。

  4.1、获取xpath、css节点方法

  找到每个数据对应的 li 标签所在的地方,这时想要获取语法的节点方法,可以选择网页的粘贴复制,亦可自己手敲。但是尽量选择自己手敲语法,因为不是所有的网页结构都是相同的,网页粘贴复制方法有时会出错,所以大家尽量选择自己手敲,这样不仅能加深你对语法的了解,更能锻炼你对代码的熟练程度。
粘贴复制:
  提取数据的库可以选择lxm、parsel、bs4、re等等,这里小编喜欢自己的方法,使用的是parsel这个库,parsel这个库可以使用xpath与css语法,是爬虫框架scrapy引申过来的,所以小编平常喜欢使用的便是这个提取库。

# 将网页源码转化为Selector对象,方便使用xpath或者css语法提取数据
selector = parsel.Selector(text)
  4.1.1、xpath语法

  手敲语法可以在网页中 Ctrl+F 出现小框内写语法,亦可下载网页xpath组件写语法。

lis = selector.xpath('//ul[@class="sellListContent"]/li')   # 获取节点
print(ins)
  4.1.2、css语法

lis = selector.css('ul.sellListContent li')   # 获取节点
print(lis)

  手敲的xpath或css语法代码的结果均相同(即表明两种提取语法均可使用)

  4.2、xpath语法提取详情页链接

  使用xpath语法提取列表页的每一个房源数据的详情页链接

 for pn in range(1,2,1):     # 翻页,间隔为1url = f'https://sz.lianjia.com/ershoufang/pg{pn}/'      # 填充目的链接response = requests.get(url=url,headers=headers)    # 请求目的列表页time.sleep(random.uniform(1.1, 1.5))    # 设置延迟随机1.1-1.5秒,防止识别到是爬虫if response.status_code == 200:     # 判断是否请求成功,若返回状态码200则表示请求成功text = response.text    # 编码# 将网页源码转化为Selector对象,方便使用xpath或者css语法提取数据selector = parsel.Selector(text)lis = selector.xpath('//ul[@class="sellListContent"]/li')   # 获取节点for li in lis:title = li.xpath('.//div[@class="title"]/a/text()').extract_first()# 详情链接detail_url = li.xpath('.//div[@class="title"]/a/@href').extract_first()print(title,detail_url)

代码执行结果:

  4.3、css语法提取详情页数据

Css语法简介:
“:nth-child(n)”:选择器匹配属于其父元素的第 N 个子元素,不论元素的类型。
“.”:点表明class属性
“#” :个符号表明id属性
“::text”:表明提取文本信息
“::attr(属性)”:表明提取属性标签

  使用css语法提取每个房源的详情页的以下信息:


执行代码为:

response = requests.get(url=detail_url,headers=headers)     # 请求详情页链接
if response.status_code == 200:    # 判断详情页是否请求成功text = response.textsele = parsel.Selector(text)# 提取标题名、总价、单价title = sele.css('div.title h1::attr(title)').extract_first()total_price = sele.css('span.total::text').extract_first()  # 总价(万)unit_price = sele.css('span.unitPriceValue::text').get()  # 单价(元/平米)community_name = sele.css('a.info::text').extract_first()  # 小区名称region = sele.css('div.areaName span.info a:nth-child(1)::text').get()  # 区域名# 基本信息li = sele.css('div.base .content ul')house_type = li.css('li:nth-child(1)::text').extract_first()  # 房屋户型floor = li.css('li:nth-child(2)::text').extract_first()  # 楼层construction_area = li.css('li:nth-child(3)::text').extract_first()  # 建筑面积(㎡)house_structure = li.css('li:nth-child(4)::text').extract_first()  # 户型结构Inside_area = li.css('li:nth-child(5)::text').extract_first()  # 套内面积Building_Type = li.css('li:nth-child(6)::text').extract_first()  # 建筑类型house_orientation = li.css('li:nth-child(7)::text').extract_first()  # 房屋朝向building_structure = li.css('li:nth-child(8)::text').extract_first()  # 建筑结构decoration = li.css('li:nth-child(9)::text').extract_first()  # 装修情况# 交易属性lis = sele.css('div.transaction ul')Listing_time = lis.css('li:nth-child(1) span:nth-child(2)::text').get()  # 挂牌时间transaction = lis.css('li:nth-child(2) span:nth-child(2)::text').get()  # 交易权属house_use = lis.css('li:nth-child(4) span:nth-child(2)::text').get()  # 房屋用途# 输出获取的内容print(title, total_price, unit_price, community_name, region, house_type, floor, construction_area,house_structure, Inside_area, Building_Type, house_orientation, building_structure, decoration,Listing_time, transaction, house_use)

代码执行的部分结果为:

5、持久化数据

  单单爬虫程序执行的只是输出结果,并没有有效的将数据永久的保存下来吗。永久保存数据有几种方法文件:txt、csv、excel、mysql、redis、mongodb等等,前三者属于文件保存形式,后三者属于数据库保存形式。这次小编使用csv文件来永久保存数据,不用担心,剩下的其他保存方法,后续小编会继续更新!

  5.1、存入csv文件

  encoding:编码;(存入csv文件有两种格式保证不出现乱码:utf-8-sig与gbk)
  mode:写入模式;
  newline=’’:去除换行空字符

  从上方图片看出csv模块没有导入,若翻到最前面写import csv导入模块,难免会麻烦一些。这里可以使用快捷键Alt+回车键导入。

  写到这基本已完成了,链家深圳二手房表面即100页数据,让程序运行慢慢运行完即可。

  执行结果为:


由图可知爬取的数据共3000条,数据无误!!

6、项目总结


  从图片可看出,一页最多30条房源数据,100页即3000条数据,与上方的38546套深圳二手房不匹配,简直差了十倍之多,那么其余的数据被隐藏到哪里去了呢?

  分析了一下,可以从区域再细分到商铺,那样便可获取到更多的数据量。有兴趣的小伙伴可以尝试一下,有什么问题直接在评论区评论即可,小编看到会给予回复。

注:此项目仅用于学习用途,若用于商业目的,请自行负责!!!

Python3网络爬虫之requests静态爬虫:链家深圳二手房相关推荐

  1. python爬取链家新房_Python爬虫实战:爬取链家网二手房数据

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 买房装修,是每个人都要经历的重要事情之一.相对于新房交易市场来说,如今的二手房交易市场一点也 ...

  2. python爬取链家新房数据_Python爬虫实战:爬取链家网二手房数据

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 买房装修,是每个人都要经历的重要事情之一.相对于新房交易市场来说,如今的二手房交易市场一点也 ...

  3. python爬虫requests源码链家_python数据分析实例:python抓取链家二手房源数据和分析...

    python语言,在数据分析方面,涵盖了"数据获取→数据处理→数据分析→数据可视化"这个流程中每个环节,不可不谓之为利器. 本篇文章我们就利用python语言在数据分析方面的应用, ...

  4. python爬虫requests源码链家_Python 爬虫 链家二手房(自行输入城市爬取)

    因同事想在沈阳买房,对比分析沈阳各区的房价,让我帮忙爬取一下链家网相关数据,然后打 算记下笔记 用于总结学到的东西&用到的东西. 一.爬虫需要会什么? 学习东西 首先你要知道它是干嘛的.爬虫 ...

  5. python爬虫requests源码链家_python的爬虫项目(链家买二手房)

    不知不觉,已经工作6年有余,恍恍惚惚,有机会满足房子需求. 在收集房子信息过程中,做些记录. 贝壳的功能很强大,但很难满足小区.距离.教育.面积等多个方面的匹配,使用起来成本仍然较高. 针对以上情况, ...

  6. python爬虫requests源码链家_链家房源爬虫(含源码)

    链家APP上有很多在售房源信息以及成交房源信息,如果可以把这些信息爬下来,可以得到很多有价值的信息.因此本文将讲一讲如何爬取这些数据,并保存下来供以后分析. 本文将介绍以下几个方面: 程序介绍该程序支 ...

  7. Python爬虫三:抓取链家已成交二手房信息(58W数据)

    环境:Windows7+python3.6+Pycharm2017 目标:抓取链家北京地区已成交二手房信息(无需登录),如下图,户型.朝向.成交时间价格等,保存到csv.最后一共抓取约58W数据,程序 ...

  8. 爬虫+可视化——链家杭州二手房房源信息

    ------------本篇文章旨在练习数据的爬取及可视化 简介 本项目分两个部分: 1.爬虫:共爬取到链家杭州二手房信息30806条 2.可视化:主要用pyecharts 一.获取数据 提取杭州各个 ...

  9. python爬取链家_python+scrapy爬虫(爬取链家的二手房信息)

    之前用过selenium和request爬取数据,但是感觉速度慢,然后看了下scrapy教程,准备用这个框架爬取试一下. 1.目的:通过爬取成都链家的二手房信息,主要包含小区名,小区周边环境,小区楼层 ...

  10. 爬取链家网二手房数据并保存到mongodb中

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 爬取链家网二手房数据并保存到mongodb中 文章目录 前言 一.爬虫的介绍 二.协程的介绍 三.css选择器 四.基于asyncio ...

最新文章

  1. 最全干货:从写简历,到面试、谈薪酬的那些技巧和防坑指南
  2. 第十六届全国大学智能车竞赛华南赛区成绩汇总
  3. 页面重新加载_Chrome为PWA应用加入了返回和重新加载按钮
  4. 小游戏发布云测试工具,中小团队的“小又快”可以这么来
  5. java获取excle表格对象_Java使用excel工具类导出对象功能示例
  6. php 做积分策略,Heartbeat的切换策略-积分统计方法
  7. 设计模式C++学习笔记之十三(Decorator装饰模式)
  8. 认识mysql总结_从根上理解Mysql - 读后个人总结1-搜云库
  9. 用wamper打开php源码_php源码该怎么设置数据库
  10. poj 3009 Curling 2.0 (dfs的应用)
  11. powershell自动化操作AD域、Exchange邮箱系列(9)—导出AD内所有计算机到数据库
  12. 29. 数组中出现超过一半的数字(C++版本)
  13. python+django+vue某小区物业管理系统
  14. Scratch(五):Scratch小游戏之超级玛丽
  15. curve BLS12-377/381 BN256 SageMath脚本
  16. 小数点化分数的过程_小数怎么化成分数
  17. uni-app中uni-ui组件库的使用
  18. [论文写作笔记] C8 讨论用于增加论文厚度
  19. Linux命令,一学就废?是的!
  20. 教你如何解析eth的区块信息,并保存所有的交易记录

热门文章

  1. 蓝牙音箱之避免自动关机
  2. [eNSP]→ospf基本配置、区域划分
  3. MPP 与 Hadoop是什么关系?
  4. linux系统修改etc,Linux系统中修改/etc/profile文件的方法
  5. HTML期末作业-我的大学宿舍
  6. ioi 赛制_钟子谦IOI2019参赛总结
  7. linux基础之系统安装
  8. 使用keras的predict(),报错:SlowBackpropInput: input and out_backprop must have the same batch size
  9. Arnold材质节点篇-阴影遮罩Shadow matte、颜色转换、纹理着色器
  10. 四、Sensor组成