返回介绍

11.2 房天下二手房房源爬虫

发布于 2025-04-21 19:15:29 字数 3926 浏览 0 评论 0 收藏

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 非常强大,用户只需定义几条规则,就可以爬取整个网站的二手房信息,从这个角度看,它已经很接近通用爬虫了。上面的例子遇到了网站反爬虫带来的困扰,下一章将详细讲解这个问题。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。