使用DomCrawler抓取房天下小区数据

Begin

传送门:使用DomCrawler抓取7W+房天下中介信息

2018年05月27日11:53:54 实习第四周 XXM

1.获取城市URL

房天下小区信息的入口URL:http://esf.sz.fang.com/newsecond/esfcities.aspx

首先我们还是需要找到一个入口的URL,然后通过特征获取到我们所有的城市URL,

特征HTML:<p class="outCont" id="c02">....</p>

通过查看HTML发现 所有的城市Url都存在当前的.red当中.

DomCrawler解析代码:

public function getCitys()
    {
        $url      = 'http://esf.sz.fang.com/newsecond/esfcities.aspx';
        $Crawl    = $this->client->request('GET', $url);
        $cityUrls = $Crawl->filter('#c01 .red')->each(function ($node) {
            return $node->attr('href') . '/housing/';
        });
        $this->info('城市获取完成');
        return $cityUrls;
    }

2.获取小区分页URL

我们通过城市URL,通过html解析出当前城市下面所有小区URL.

public function getDetail($url)
    {
        $Crawl = $this->client->request('GET', $url);
        $html  = count($Crawl) ? $Crawl->html() : null;
        if (empty($html)) {
            $this->info("无效");
            return;
        }
        return array('url' => $url, 'html' => $html);
    }

    public function getPageUrls(array $detailed)
    {
        $Crawl = new Crawler();
        $Crawl->addHtmlContent($detailed['html']);
        $this->info($detailed['url']);
        if (count($Crawl->filter('.findplotNum')) <= 0) {
            return;
        }
        $housingCount = $Crawl->count() ? $Crawl->filter('.findplotNum')->text() : null;
        $housingCount = intval($housingCount);
        if ($housingCount > 0) {
            $max_Page = count($Crawl->filter('.txt')) > 0 ? $Crawl->filter('.txt')->text() : null;
            if (!empty($max_Page)) {
                $city      = count($Crawl->filter('.s4Box'))>0?$Crawl->filter('.s4Box')->text():'未知';
                $max_Page  = str_replace('共', '', $max_Page);
                $max_Page  = str_replace('页', '', $max_Page);
                $page_urls = [];
                $max_Page  = intval($max_Page);
                for ($i = 1; $i <= $max_Page; $i++) {
                    $page_urls[] = $detailed['url'] . "__0_0_0_0_$i" . "_0_0_0/";
                }
                $this->info($city . '地区 get success');
                return $page_urls;
            }
            return;
        }
        return;
    }

3.抓取小区数据

获得每个小区的URL后,我们便可以通过DomCrawler解析html来获取我们所需的小区信息.

public function getPlaceMsg($url)
    {
        $Crawl = $this->client->request('GET', $url);
        $html  = count($Crawl) ? $Crawl->html() : null;
        if (empty($html)) {
            $this->info("无效");
            return;
        }
        $placeName = $Crawl->filter('.plotTit')->each(function ($node) {
            return $node->text();
        });
        $sourceUrl = $Crawl->filter('.plotTit')->each(function ($node) {
            return $node->attr('href');
        });
        $price = $Crawl->filter('.listRiconwrap')->each(function ($node) {
            $isNode = count($node->filter('.priceAverage')) > 0 ? true : false;
            if ($isNode) {
                $price = str_replace('元/', '', $node->filter('.priceAverage')->text());
                $price = trim($price);
                return $price;
            } else {
                return null;
            }
        });
        $imagesUrl = $Crawl->filterXPath('//dl[@class="plotListwrap clearfix"]/dt')->each(function ($node) {
            return $node->filter('img')->attr('src');
        });
        $fangType = $Crawl->filter('.plotFangType')->each(function ($node) {
            return trim($node->text());
        });
        $this->importData($placeName, $price, $imagesUrl, $fangType, $sourceUrl);
    }

4.上传数据.

public function importData(array $placeName, array $price, array $imagesUrl, array $fangType, array $sourceUrl)
    {
        $count = count($placeName);
        for ($i = 0; $i < $count; $i++) {

            $places = Place::firstOrNew([
                'name' => $placeName[$i],
            ]);
            $places->price      = $price[$i];
            $places->image_url  = $imagesUrl[$i];
            $places->type       = $fangType[$i];
            $places->source_url = $sourceUrl[$i];
            $places->address    = '暂无资料';
            $places->user_id    = 35;
            $places->save();

            $this->info($placeName[$i] . 'improt success');
        }
    }

这样便完成了房天下的小区数据抓取.

2018-05-27 14-25-09屏幕截图.png

日记本

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

赞赏支持
被以下专题收入,发现更多相似内容