ITPub博客

首页 > 数据库 > 数据库开发技术 > 正则表达式案例:池州商品房预售证信息抓取

正则表达式案例:池州商品房预售证信息抓取

原创 数据库开发技术 作者:jackzhang 时间:2022-07-06 23:41:11 0 删除 编辑

抓取地址:http://220.180.84.203:8010/persalereg.php

网页数据样例:

抓取思路:

  • 获取页面源代码;

  • 编写正则表达式;

  • 提取页面数据;

  • 保存数据。

一、获取页面源代码

url = "http://220.180.84.203:8010/persalereg.php" headers = {     "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36" }  resp = requests.get(url=url, headers=headers) resp.encoding = 'GBK' html = resp.text print(html)

 

二、编写正则表达式

页面源代码:

我们需要抓取的元素主要包括:售房单位、预售证编号、房屋坐落地点、项目名称、房屋用途性质、区属、开盘日期。根据页面源代码所呈现的规律,编写如下正则表达式:

regex = re.compile(r'<td width="25%" bgcolor="B9C8E8"><div align="center"><font color="000000">售房单位.*?'\                    '<td width="35%">(?P<developer>.*?)</td>.*?'\                    '编号</div></td>.*?<td width="25%">(?P<sPermitNo>.*?)</td>.*?'\                    '房屋坐落地点</div></td>.*?<td colspan="3">(?P<address>.*?)</td>.*?'\                    '项目名称</div></td>.*?<td colspan="3">(?P<projectName>.*?)</td>.*?'\                    '房屋用途性质</div></td>.*?<td colspan="3">(?P<houseUsage>.*?)</td>.*?'\                    '区属</div></td>.*?<td width="35%">(?P<areaName>.*?)</td>.*?'\                    '开盘日期</div></td>.*?<td width="25%">(?P<openDate>.*?)</td>', re.S)

关键要素说明:

  1. re.S:表示正则表达式可以匹配换行符。

  2. ?P<var_name>.*?:表示将 .*? 匹配到的内容赋给前面的变量 var_name,方便后面取数。

三、提取页面数据

由于需要提取的预售证有多个,所以此处我们使用正则模块(re)的 finditer() 函数:

 
result = regex.finditer(html)  for item in result:     developer = item.group("developer")     sPermitNo = item.group("sPermitNo")     address = item.group("address")     projectName = item.group("projectName")     houseUsage = item.group("houseUsage")     areaName = item.group("areaName")     openDate = item.group("openDate")          print(developer, sPermitNo, address, projectName, houseUsage, areaName, openDate)     break

注意:

  1. group() 函数中的名称必须与正则表达式中定义的变量名称一致,否则取不到对应的数据;

  2. break 关键字表示我们只输出第一个预售证的信息,用作实验。

输出结果:

四、保存数据

我们保存数据的方法:首先将提取到的数据存到DataFrame中,最后再写入Excel:

 
columnNames = ['售房单位', '预售证编号', '房屋坐落', '项目名称', '房屋用途', '区县', '开盘日期'] datas = []  for item in result:     developer = item.group("developer")     sPermitNo = item.group("sPermitNo")     address = item.group("address")     projectName = item.group("projectName")     houseUsage = item.group("houseUsage")     areaName = item.group("areaName")     openDate = item.group("openDate")          datas.append([developer, sPermitNo, address, projectName, houseUsage, areaName, openDate])      print("抓取完毕!")       dataDF = pd.DataFrame(data=datas, columns=columnNames) dataDF.to_excel('池州预售证抓取.xlsx', index=False) print("保存完毕!")

关键要素说明:

  1. columnNames 定义DataFrame的列名。

  2. to_excel() 中的 index=False 表示保存到Excel中时不带索引号。

五、完整实现代码

最后,完整的抓取代码如下:

import reimport requestsimport pandas as pd
url = "http://220.180.84.203:8010/persalereg.php"headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"}
columnNames = ['售房单位', '预售证编号', '房屋坐落', '项目名称', '房屋用途', '区县', '开盘日期']datas = []
resp = requests.get(url=url, headers=headers)resp.encoding = 'GBK'html = resp.text
regex = re.compile(r'<td width="25%" bgcolor="B9C8E8"><div align="center"><font color="000000">售房单位.*?'\ '<td width="35%">(?P<developer>.*?)</td>.*?'\ '编号</div></td>.*?<td width="25%">(?P<sPermitNo>.*?)</td>.*?'\ '房屋坐落地点</div></td>.*?<td colspan="3">(?P<address>.*?)</td>.*?'\ '项目名称</div></td>.*?<td colspan="3">(?P<projectName>.*?)</td>.*?'\ '房屋用途性质</div></td>.*?<td colspan="3">(?P<houseUsage>.*?)</td>.*?'\ '区属</div></td>.*?<td width="35%">(?P<areaName>.*?)</td>.*?'\ '开盘日期</div></td>.*?<td width="25%">(?P<openDate>.*?)</td>', re.S)result = regex.finditer(html)
for item in result: developer = item.group("developer") sPermitNo = item.group("sPermitNo") address = item.group("address") projectName = item.group("projectName") houseUsage = item.group("houseUsage") areaName = item.group("areaName") openDate = item.group("openDate") datas.append([developer, sPermitNo, address, projectName, houseUsage, areaName, openDate]) print("抓取完毕!") dataDF = pd.DataFrame(data=datas, columns=columnNames)dataDF.to_excel('池州预售证抓取.xlsx', index=False)print("保存完毕!")

抓取结果:


爬虫前进之路,任!我!行!


原文作者:数据派探险家;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2017-12-19

  • 博文量
    119
  • 访问量
    55951