Webcrawling in Python using Selenium

For the script to work, four applications need to be installed first.

[email protected]:~$ sudo pip install selenium
[email protected]:~$ sudo apt-get install firefox
[email protected]:~$ sudo pip install pyvirtualdisplay
[email protected]:~$ sudo apt-get install xvfb

Now the following script can be used.

""" samples/crawl_02.py """
################################################################################
# Application:      WebParser example 02
# File:             samples/crawl_01.py
# Goal:             Retrieve content when JavaScript is used in page
# Input:
# Output:
# Example:
#
# History:          2016-06-27 - JJ     Creation of the file
#
################################################################################

################################################################################
# Imports
################################################################################
import lxml.html
import urllib2

from pyvirtualdisplay import Display
from selenium import webdriver

################################################################################
# Definitions
################################################################################
HEADER = {'Accept-Language': 'nl-NL',
          'User-Agent': """Mozilla/5.0 (Windows; U;
                                    Windows NT 6.1;
                                    nl-NL;
                                    rv:1.9.1.5)
                       Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729);
                       nl-NL"""}
################################################################################
# Classes
################################################################################
class WebParser(object):
    """ Definition of the WebParser """
    def __init__(self, *args, **kwargs):
        """ Initialize the WebParser """
        super(WebParser, self).__init__(*args, **kwargs)

    @staticmethod
    def parse_page(url):
        """ Open URL and return the element tree of the page """
        display = Display(visible=0, size=(1920, 1080))
        display.start()
        browser = webdriver.Firefox()
        browser.get(url)
        data = browser.page_source
        tree = lxml.html.fromstring(data)
        browser.quit()
        display.stop()
        return tree

    @staticmethod
    def find_css_element(etree, element):
        """ Find an element in the element tree and return it """
        return etree.cssselect(element)

################################################################################
# Functions
################################################################################
def main():
    """ Main function """
    parser = WebParser()
    etree = parser.parse_page('http://isitweekendalready.com')
    divs = parser.find_css_element(etree, '#result')
    print divs[0].text.strip()

################################################################################
# main
################################################################################
if __name__ == "__main__":
    main()

Update 05-Oct-2016

Recently I discovered that Selenium does not work well with newer versions of Firefox. Therefore I had to downgrade Firefox to be able to use Selenium.

[email protected]:~$ firefox -v
[email protected]:~$ sudo apt-get purge firefox
[email protected]:~$ wget sourceforge.net/projects/ubuntuzilla/files/mozilla/apt/pool/main/f/firefox-mozilla-build/firefox-mozilla-build_39.0.3-0ubuntu1_amd64.deb
[email protected]:~$ sudo dpkg -i firefox-mozilla-build_39.0.3-0ubuntu1_amd64.deb 
[email protected]:~$ rm firefox-mozilla-build_39.0.3-0ubuntu1_amd64.deb 
[email protected]:~$ firefox -v