爬虫第一弹:安居客房地产数据爬虫

爬虫第一弹:安居客房地产数据爬虫
 一、功能分析:
1、我们要爬取的安居客南昌新房的420个楼盘的信息,每个楼盘涵盖 '楼盘名称' '楼盘特点' '参考单价' '物业类型' '开发商' '区域位置' '楼盘地址' '售楼处电话' '最低首付' '楼盘户型' '最新开盘' '交房时间' '售楼处地址' '预售许可证' '建筑类型' '产权年限' '容积率' '绿化率' '规划户数' '楼层状况' '工程进度' '物业管理费' '物业公司' '车位数' '车位比'。
2、通过mysql建立对应列的数据库anjuke,并将爬虫爬取出来的数据导入表格myanjuke;
3、通过mysql将数据导出为anjk.xml 方便后续的数据分析工作,从而分析房地产的影响因子和构建房地产的估价模型。
4、这个爬虫进一步优化可以爬取全国的房地产楼盘信息,是不是很激动,由于本项目主要用于项目演示,所以点到为止。

二、思路构建:
1、利用scrapy构建scrapy startproject anjukepjt,搭建项目,并通过scrapy genspider -t basic anjukespd anjuke.com构建基本的爬虫文件;
2、通过item.py构建所有数据项;
3、setting.py将爬虫协议关闭,打开
ITEM_PIPELINES 的组件
3、通过爬虫文件anjukespd.py 做到提取需要录入数据库所有数据项的信息;
4、通过pipelines工具对数据项进行进一步的处理后通过pymysql组件导入mysql;
5、通过mysql的导出功能导出anjk.xml
三、具体实现:
2.1、构建item时,一级页面的关键信息需要构建item,并且需要在页面详情页的爬取过程同样构造一个类似的item。比如一级页面的link,那么详情页就需要构造link1,这是为了在pipelines时方便在同一个循环中,方便数据的导入数据库的工作;
4.1、首先观察一级页面网页的构成 url= "https://nc.fang.anjuke.com/loupan/all/p" + str (i)+ "/"并通过构造以i的循环语句可以遍历南昌新房的所有14页信息;
4.2、通过
item[ "name" ]=response.xpath( "//div[2]/div[1]/div[3]/div/div/a[1]/h3/span/text()" ).extract(), item[ "link" ]=response.xpath( "//div[2]/div[1]/div[3]/div/div/a[1]/@href" ).extract()语句获取二级页面
4.3
、通过link,构建每个楼盘详情的链接
pat1 =  '(https://.*?/.*?/).*?html'
pat2 =  'https://.*?/.*?/(.*?html)'
newurl = re.compile(pat1).findall(item[ "link" ][m])[ 0 ] +  "canshu-"  + re.compile(pat2).findall(item[ "link" ][m])[ 0 ] +  "?from=loupan_tab"
4.4
、通过以上详情链接,并利用正则表达式爬取出楼盘详情所有我们需要的项目信息;
5.1、中文编码的问题:
import  urllib.request
import  io
import  sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,
encoding = 'gb18030' )  #改变标准输出的默认编码
headers = ( "User-Agent" , "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0" )
opener = urllib.request.build_opener()
opener.addheaders = [headers]
# 将opener安装为全局
urllib.request.install_opener(opener)
data = urllib.request.urlopen(newurl).read().decode(
'utf-8' )
5.2、异常的处理
主要是针对通过正则表达式爬取某些字段时,由于项目太多,每个项目的列项目并不一致,有些可能本身就没有该项,如是就会出现爬不到数据的情况,而出现错误,所以需要进行异常处理。
tel=
'lp-icons lp-icons-tel">(.*?)'
item[ "tel1" ] = re.compile(tel, re.S).findall( str (data))
try :
item[
"tel1" ][ 0 ]
except :
item[
"tel1" ]= [ " " , ]
四、项目总结
该项目是在学习了《精通Python网络爬虫+核心技术、框架与项目实战.pdf》后的一个拓展项目,也为了更好的展示自己的学习成果;学习本身让我对爬虫有了框架性的认识,懂得构建基本的框架。通过项目的实践,我对本书的知识点有了更深入清晰的认识。在编制该项目中中文编码的问题和异常处理以及具体数据项的正则构造是花费最多时间三块内容,感谢这个项目和这本书,让我终于从理论步入实践。


你可能感兴趣的:(爬虫)