11.2 房天下二手房房源爬虫
11.2.1 房天下网站分析
为了与上一章我爱我家爬虫作对比,这次使用 CrawlSpider 来编写房天下北京二手房房源爬虫。为什么爬取房天下二手房房源要使用 CrawlSpider 来写呢?打开房天下北京二手房房源列表页面,然后拉滚动条到最底部翻页的地方,如图 11-1 所示。

图 11-1 房天下北京二手房房源列表页
可以看到它的页数只有 100 页,很显然房天下并没有把全部二手房房源用列表的形式展示出来,仅仅显示了前 100 页。如果按照上一章的思路,从列表页爬取二手房信息,肯定是爬不全的。只要仔细观察房天下二手房房源列表页面和房源详情页面 URL 的构造特点,根据 URL 的特点编写爬行规则,就能实现对房天下网站北京地区全部二手房房源的爬取。
仔细查看网页就会发现,房源列表页面的 URL 有如下几种形式:http://esf.fang.com/house-a01/;http://esf.fang.com/house-a0585-b01515/;http://esf.fang.com/housea0585-b07449/c2400-d2500/。
房源详情页面的 URL 有如下几种形式:http://esf.fang.com/chushou/3_401314098.htm;http://esf.fang.com/chushou/3_401787443.htm;http://esf.fang.com/chushou/18_400747453_11836145x1010018037_164999966.htm。
房源列表页 URL 和房源详情页 URL 的构造特征如下。
(1)所有二手房房源列表页面 URL 前半部分都包含 http://esf.fang.com/house。
(2)所有北京二手房房源详情页面 URL 都以 http://esf.fang.com/chushou/作为前半部分。
观察到这两条 URL 构造特点后,就可以根据这两个特点编写 link-extractor。可以编写两条规则:第一条规则是跟进二手房房源列表页面 URL;第二条规则是对符合二手房房源详情页 URL 构造规则的页面发起请求并解析出其中的房源信息。
11.2.2 房天下二手房房源爬虫实现
第一步,建立项目,使用 crawl 模板生成 spider 文件。
>scrapy startproject pachong3 >cd pachong3 >scrapy genspider -t crawl fang fang.com
第二步,定义 items.py。作为简单演示,这里只提取 3 项数据 - 房源标题(title)、总价(total_price)、面积(area)。
class Pachong3Item(scrapy.Item):
title = scrapy.Field()
total_price = scrapy.Field()
area = scrapy.Field() 第三步,编写 spider 文件。下面在生成的模板基础上修改相关内容。首先导入“Scrapy”“LinkExtractor”“CrawlSpider,Rule”及自己定义的 Item 类。
import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from pachong3.items import Pachong3Item
然后定义 FangSpider 爬虫类,它继承自 CrawlSpider 这个类,这里设置房天下北京二手房首页为起始页。
class FangSpider(CrawlSpider):
name = 'fang'
allowed_domains = ['fang.com']
start_urls = ['http://esf.fang.com/']第四步,也是最核心的一步 - 定义链接提取规则。
这里定义链接提取规则时,要注意正则表达式的写法。在正则表达式中.*可以用来匹配任意多个字符。第一条 Rule 没有设置回调函数,它的 follow 默认为 True,因此它会跟进网页中符合正则表达式提取规则的 URL,通过这种跟进,实现对全部二手房列表页面的爬取。第二条规则匹配具体的房源详情页面 URL,当匹配成功并请求后,交给 callback 设置的同名函数来解析出具体的信息,因为这里设置了 callback,所以默认不会跟进网页中的 URL。
rules=(
Rule(LinkExtractor(allow='http://esf.fang.com/house.*')),
Rule(LinkExtractor(allow='http://esf.fang.com/chushou/.*'),
callback='parse_item'),
)
#定义回调函数 parse_item
def parse_item(self, response):
item = Pachong3Item()
#提取标题信息
item['title'] = response.xpath(
'string(//div[@class="tab-cont clearfix"]/div[1])'
).extract_first().strip().split('\r\n')[0].strip()
#提取总价
item['total_price'] = response.xpath(
'//div[@class="trl-item_top"]/div[1]/i/text()'
).extract_first()
item['area'] = response.xpath(
'//div[@class="tt"]/text()').extract()[1]
return item 在这个回调函数里,首先初始化 Item,然后提取出需要的数据并返回。这里需要注意上面 XPath 路径的写法,这样写标题 XPath 路径的原因是,一些所谓优质房源的页面与普通房源页面稍有区别,用上面的 XPath 就可以全部提取到了。
最后,在执行爬行命令前,应在 settings.py 中设置如下参数。
ROBOTSTXT_OBEY = False
DOWNLOAD_DELAY = 10 #设置下载延时为 10 秒
#设置默认用户代理
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) \
AppleWebKit/537.36 (KHTML, like Gecko) \
Chrome/64.0.3282.186 Safari/537.36'
COOKIES_ENABLED = False #设置不启用 Cookies 然后在命令行项目根目录下执行如下命令。
>scrapy crawl fang -o fang.csv
这样房天下二手房房源爬虫就运行成功了。其实,这个爬虫并不完美,爬取速度很慢,这是由于设置了下载延时为 10 秒。如果希望加快速度(改为 2 秒或 3 秒),很快会发现爬虫触发了房天下的反爬虫策略,毕竟房天下对爬虫非常敏感,爬取速度稍快一点,就会被其反爬虫禁止。对反爬虫的问题及上面在 settings.py 中设置的含义,下一章将详细介绍。
上面以爬取房天下二手房房源为例,讲解了 CrawlSpider 的应用方法。CrawlSpider 非常强大,用户只需定义几条规则,就可以爬取整个网站的二手房信息,从这个角度看,它已经很接近通用爬虫了。上面的例子遇到了网站反爬虫带来的困扰,下一章将详细讲解这个问题。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论