All Articles

Scrapy + Selenium + Headless Firefox

Scrapy is a fast high-level screen scraping and web crawling framework, used to crawl websites and extract structured data from their pages. It can be used for a wide range of purposes, from data mining to monitoring and automated testing

Selenium Remote Control is a client/server system that allows you to control web browsers locally or on other computers, using almost any programming language and testing framework

Scrapy memiliki kekurangan, yaitu ketidakmampuannya untuk scraping web yang mengharuskan adanya pemanggilan fungsi javascript, satu-satunya cara adalah dengan menggunakan Selenium

Jalankan Selenium-rc :

$ java -jar selenium-server-standalone-2.0rc2.jar

Buat file: test_selenium.py

from selenium import selenium
from scrapy.spider import BaseSpider
from scrapy.http import Request
import time
import lxml.html

class SeleniumSprider(BaseSpider):
    name = "selenium"
    allowed_domains = ['selenium.com']
    start_urls = ["http://localhost"]
    
    def __init__(self,  **kwargs):
        print kwargs
        self.sel = selenium("localhost", 4444, "*firefox","http://selenium.com/")
        self.sel.start()
    
    def parse(self, response):
        sel = self.sel
        sel.open("/index.aspx")
        sel.click("id=radioButton1")
        sel.select("genderOpt", "value=male")
        sel.type("nameTxt", "irfani")
        sel.click("link=Submit")
        time.sleep(1) #wait a second for page to load
        root = lxml.html.fromstring(sel.get_html_source())

Lalu eskekusi

$ ./python test_selenium.py

Namun menjadi menjengkelkan jika setiap kali menjalankan script selenium akan membuka browser firefox untuk mensimulasikan perintah yg ada di script tsb.
Maka gunakan virtual framebuffer untuk mematikan window firefox. Jalankan perintah ini :

$ sudo aptitude install xvfb
$ sudo aptitude install xfonts-100dpi xfonts-75dpi xfonts-scalable xfonts-cyrillic
$ sudo mod u+s `which Xvfb`
$ Xvfb :99 -ac &
$ xclock -display :99 &
$ xwd -out xfvbtest.xwd -root -display :99
$ xwud -in xfvbtest.xwd

Jalankan Selenium-rc :

$ DISPLAY=:99 java -jar selenium-server-standalone-2.0rc2.jar

Maka setiap kali script dijalankan selenium tidak akan membuka window firefox tapi sebenarnya menjalankannya dibelakang layar (virtual)