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

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

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

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):     # 翻页,间隔为1
    url = 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):     # 翻页,间隔为1
     url = 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.text
    sele = 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套深圳二手房不匹配,简直差了十倍之多,那么其余的数据被隐藏到哪里去了呢?
在这里插入图片描述

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

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

猜你喜欢

转载自blog.csdn.net/weixin_45032666/article/details/108214962