2017/11/06

crawler in PHP, Python, Node.js

็ถฒ้ ็ˆฌ่Ÿฒๆ˜ฏๆปฟๅธธ้‡ๅˆฐ็š„่ชฒ้กŒ,ไปŠๅคฉ็ทด็ฟ’ไธ€ไธ‹็”จ้€™ไธ‰็จฎ่ชž่จ€ๅฏซ็ˆฌ่Ÿฒ

PHP

sunra/php-simple-html-dom-parser

crawler.php
<?php

include 'vendor/autoload.php';

use Sunra\PhpSimple\HtmlDomParser;

$url = 'https://www.ptt.cc/bbs/NBA/index.html';
$html = HtmlDomParser::file_get_html($url);
$titles = $html->find('div.title');
$file = fopen('php.txt', 'w');

foreach ($titles as $title) {
    $subject = trim($title->plaintext)."\n";
    fwrite($file, $subject);
}

fclose($file);
$html->clear();

Python

crawler.py
# -*- coding: utf-8 -*-

import sys
import requests
from bs4 import BeautifulSoup

reload(sys)
sys.setdefaultencoding('utf-8')

url = 'https://www.ptt.cc/bbs/NBA/index.html'
res = requests.get(url)
soup = BeautifulSoup(res.text, 'html.parser')
titles = soup.find_all('div', 'title')
f = open('py.txt', 'w');

for title in titles:
    f.write('%s\n' % title.text.strip())

f.close()

Node.js

crawler.js
const cheerio = require('cheerio');
const request = require('request');
const fs = require('fs');

const url = 'https://www.ptt.cc/bbs/NBA/index.html';
const out = fs.createWriteStream('nodejs.txt');

request(url, (err, res, body) => {
    if (err) {
        console.log(err);
    }

    const $ = cheerio.load(body);
    const divs = $('div.title');

    divs.each((i, item) => {
        out.write($(item).text().trim() + '\n');
    });

    out.end();
});

้€™ไธ‰ๅ€‹็จ‹ๅผๅŸท่กŒ็š„็ตๆžœๆœƒๅพ—ๅˆฐไธ€ๆจฃ็š„ๅ…งๅฎน,็•ถ็„ถ้€™ๆ˜ฏๅพˆ็ฐก็•ฅ็š„็ฏ„ไพ‹,็…ง็†่ชช่ฆๅฏซไธ€ไบ›ๅฎน้Œฏๅˆคๆ–ท,ไฝ†็ทด็ฟ’็”จ็š„็ฏ„ไพ‹ๅ…ˆ้€™ๆจฃๅง,ๅ†้™„ไธŠๅŸท่กŒ็ตๆžœๆฏ”่ผƒไธ€ไธ‹้€Ÿๅบฆ

PHP 7.0.22
$ time php crawler.php

real    0m0.614s
user    0m0.072s
sys     0m0.032s

real    0m0.570s
user    0m0.056s
sys     0m0.032s

real    0m0.570s
user    0m0.056s
sys     0m0.032s

real    0m0.515s
user    0m0.040s
sys     0m0.032s

real    0m0.515s
user    0m0.040s
sys     0m0.032s

real    0m0.515s
user    0m0.040s
sys     0m0.032s
Node.js v9.0.0
$ time node crawler.js

real    0m1.357s
user    0m0.244s
sys     0m0.396s

real    0m1.744s
user    0m0.376s
sys     0m0.312s

real    0m1.312s
user    0m0.272s
sys     0m0.380s

real    0m1.522s
user    0m0.348s
sys     0m0.304s

real    0m1.369s
user    0m0.288s
sys     0m0.396s

real    0m1.523s
user    0m0.388s
sys     0m0.344s
Python 2.7.12
$ time python crawler.py
real    0m0.666s
user    0m0.232s
sys     0m0.064s

real    0m0.682s
user    0m0.204s
sys     0m0.088s

real    0m0.709s
user    0m0.240s
sys     0m0.064s

real    0m0.624s
user    0m0.228s
sys     0m0.032s

real    0m0.669s
user    0m0.264s
sys     0m0.052s

real    0m0.698s
user    0m0.260s
sys     0m0.068s

ๅŸบๆœฌไธŠ PHP ่ทŸ Python ้ƒฝๆ˜ฏๆŒ‰ไธ‹ๅŽปไธ€ไธ‹ๅฐฑๅšๅฎŒไบ†,Node.js ๆœ‰็ญ‰ๅพ…็š„ๆ„Ÿ่ฆบ,ไธ็Ÿฅ้“ๆ˜ฏๅ“ชๅ€‹็’ฐ็ฏ€ๅ‡บๅ•้กŒ,ๆˆ‘ๆœ‰ๆŠŠๆช”ๆกˆๅฏซๅ…ฅ่ทŸ dom ๆœๅฐ‹็š„้ƒจไปฝ้—œ้–‰,้€Ÿๅบฆๆฒ’ๅทฎๅคšๅฐ‘,ๆ‰€ไปฅๆ˜ฏ [request][] ๅฅ—ไปถๆ…ข?ไฝ†็ถฒ่ทฏๅคงๅฎถ้ƒฝๆŽจ [request][],ไป–ๆ‡‰่ฉฒไนŸๆ˜ฏๅŸบๆ–ผ node.js ๅ…งๅปบ็š„ http module ไธŠ็š„้ซ˜็ดšๅฐ่ฃ,่€Œไธ”ๅ…ถไป–ไบบไนŸ้ƒฝๆœ‰็”จๅฅ—ไปถ,ๅช่ƒฝ่ชชๅนพไนŽๆˆ‘ๆฏๆฌกๆธฌ่ฉฆๆฑ่ฅฟ node.js ๆ•ธๆ“š้ƒฝๆœƒๅŠ่ปŠๅฐพ,็›ฎๅ‰้‚„ๆ˜ฏ้ธๆ“‡ไฝฟ็”จไป–ๅฅฝ็”จ็š„ๅทฅๅ…ท็พค็‚บไธป。