前言
上一篇文章中有朋友问不能正确获取页面,一个原因是没有设置不遵守爬虫协议,设置方法如下,在settings.py文件中,将图中字段设置为False即可:
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
在上一篇文章中,我们通过相关命令,引入了Scrapy框架,并且成功运行了第一个爬虫,获取了北京朝阳地区某个小区的名称。在这篇文章中,我们将继续获取小区其他信息,比如小区位置、建筑年代、楼栋数、户数等。
1. 构建小区信息数据结构
在上一篇文章中项目结构简介章节中,我们介绍了items.py文件的用处,简单来说,该文件是用来定义爬虫最终返回数据的具体内容。我们在该文件中通过XiaoquItem类定义小区所有相关信息如下:
# '小区ID': xiao_id,
# '小区名称': xiao_name,
# '位置': position
# '挂牌平均价': average_price,
# '产权类型': right_type
# '供暖方式' heat
# '房屋总数': total_house,
# '楼栋总数': total_building
# '建成年代': complete_year,
# '开发商': developer,
# '用水类型': water,
# '用电类型': electricity,
# '绿化率': green_ratio,
# '容积率': plot_ratio,
# '价格变动记录': price_info
# '连接': url
class XiaoquItem(scrapy.Item):
xiao_id = scrapy.Field()
xiao_name = scrapy.Field()
position = scrapy.Field()
average_price = scrapy.Field()
right_type = scrapy.Field()
heat = scrapy.Field()
total_house = scrapy.Field()
complete_year = scrapy.Field()
developer = scrapy.Field()
total_building = scrapy.Field()
water = scrapy.Field()
electricity = scrapy.Field()
green_ratio = scrapy.Field()
plot_ratio = scrapy.Field()
price_info = scrapy.Field()
url = scrapy.Field()
pass
在该文件中,通过class来定义小区信息结构体,该类继承了scrapy.Item类。按照官方文档解释,Field类相当于Python内置字典类的一个别名,并没有提供额外的方法和属性。在此阶段,我们可以默认为这是Scrapy中通用写法即可,如果想深入了解Field()实现,可以进入对应源码查看。
2. 解析页面中数据
定义完小区数据结构后,就需要在链家页面中找到数据结构中对应字段的值。Scrapy中使用 Xpath作为HTML页面解析器,可以帮助爬虫定位和提取 HTML 或 XML 文档中的数据。在具体解析页面之前,可以安装一个浏览器Xpath插件,该类型插件具体作用是帮助我们快速定位元素,即告诉我们