Crawlen von Webseiten mit Hilfe von Ruby und Mechanize – Part 1-4

August 10th, 2009

Mit dem mechanize gem in Ruby kann man wunderbar Seiten Crawlen. Hier mach ich mal einen kurzen Einstieg, da selbst die englische Doku etwas mehr als dürftig ist.

Fangen wir einfach mal an:

require ‘rubygems’
require ‘mechanize’

agent = WWW::Mechanize.new
agent.set_proxy(‘127.0.0.1′, 8118)
agent.user_agent_alias = ‘Windows IE 7′

Die ersten beiden zeilen sollten Selbsterklärend sein. Damit binden wir lediglich die gems ein.

agent = WWW::Mechanize.new

Deklariert unser Mechanize Objekt.

agent.set_proxy(‘127.0.0.1′, 8118)
agent.user_agent_alias = ‘Windows IE 7′

Mit agent.set_proxy können wir einen Proxyserver angeben. Ist nicht zwingend notwendig, aber manchmal sicherlich ganz nützlich. Mit agent.user_agent_alias legen wir fest als welches BS und welcher Browser sich unser Crawler ausgeben soll. Hier gibt es unterschiedliche Möglichkeiten, die Mechanize jedoch kennen muss. Zur Zeit gibt es folgende Optionen, die so ziemlich alle verbreitenden Browser abdecken sollten:

  • ‘Windows IE 6′
  • ‘Windows IE 7′
  • ‘Windows Mozilla’
  • ‘Mac Safari’
  • ‘Mac FireFox’
  • ‘Mac Mozilla’
  • ‘Linux Mozilla’
  • ‘Linux Konqueror’
  • ‘iPhone’
  • ‘Mechanize’

Legen wir jetzt die Seite fest, die Mechanize aufrufen und parsen soll:

find_page = agent.get(‘URL_ZUR_ZU_PARSENDEN_WEBSITE’)

Jetzt haben wir eigentlich alles was wir brauchen und können loslegen… auf zum spannendem Teil im nächsten Blogpost :)

Invite your friends to this article!

Ruby on Rails vs PHP

May 12th, 2009

Ruby on Rails vs PHP – Railsenv.com Werbung

Invite your friends to this article!

Peggle ist fürs iPhone erschienen

May 12th, 2009

Video anschauen, begeistern lassen, für 4 Euro im Appstore kaufen und losdaddeln!

Invite your friends to this article!

Apache und MySQL für vServer optimieren

May 12th, 2009

Da dieses Blog zur Zeit auf einem vServer läuft und dieser nur über begrenzten RAM verfügt habe ich die Apache2 und MySQL Konfiguration dahingehend etwas optimiert.

Aufgelistet sind nur alle von mir manuell angepassten Werte.

Die Apache2 config

In Ubuntu zu finden unter /etc/apache2/apache2.conf

StartServers 1
MinSpareServers 1
MaxSpareServers 3
ServerLimit 50
MaxClients 50
MaxRequestsPerChild 5000

Erklärung:

StartServers: Bestimmt, wieviele Serverprozesse beim Start generiert werden.

MinSpareServers: Die Mindestanzahl zu laufender Apache2 Prozesse. Wenn weniger laufen, wird die hier angegeben Anzahl erzeugt.

MaxSpareServers: Genau das gleiche wie darüber, nur das diese Zahl die Maximal zu laufenden Apache2 Prozesse angibt

MaxClients: Gibt die Maximale Anzahl an Threads an, welche gleichzeitig gestartet werden. Diese sollte einen gewissen Wert nicht überschreiten. Wird dieser Wert überschritten, gibt ServerLimit die Absolute Höchstgrenze an.

ServerLimit: Gibt die absolute Höchstgrenze der maximalen Threads an, welche gestartet werden. Sollte immer höher bzw. genauso hoch wie MaxClients sein.

MaxRequestsPerChild: Gibt die Gesamtzahl an Anfragen an, die erfolgen dürfen bevor ein Kindprozess beendet wird.

Außerdem sollte man den Apache2 als mpm_prefork statt als worker laufen lassen. Dies sollte aber gerade bei einer Apache2 / PHP Kombi schon gegeben sein. Alternativ kann man PHP auch mit Apache2-worker zum laufen bringen. Hierfür wird dann aber CGI nötig. Weitere Informationen zu Apache2- worker in Verbindung mit PHP findet man hier.

Desweiteren empfielt es sich unnötige Module zu deaktivieren und auf .htaccess Dateien zu verzichten. Zum Deaktivieren kann man bequemerweise den befehl

a2dismod [modulname]

verwenden. Zum aktivieren von Modulen gibt es das equivalent a2enmod. Den gleichen Befehl gibt es auch noch für einzelne Seiten bzw vhost Konfigurationen (a2dissite und a2ensite).

Die MySQL config

In Ubuntu zu finden unter /etc/mysql/my.cnf

key_buffer = 2M
max_allowed_packet = 2M
thread_stack = 128K
thread_cache_size = 8
myisam_sort_buffer_size = 4M
read_buffer_size = 512K
read_rnd_buffer_size = 512k
table_cache = 8

skip-bdb

skip-innodb

no-auto-rehash

[isamchk]
key_buffer = 8M
sort_buffer_size= 8M

[mysqlhotcopy]
interactive-timeout

Erklärung:

max_allowed_packet: Wenn der MySQL Server ein Paket größer als max_allowed_packet empfängt, schließt er die Verbindung und gibt den “paket too large” Fehler aus.

thread_cache_size: gibt an, wieviele Threads der Server cachen darf, um sie bei erneuter Benutzung aus dem Cache aufzurufen

myisam_sort_buffer_size: Die max. Größe des Buffers beim sortieren von MyISAM Indexes während eines Reperaturvorgangs pder beim erstellen von Indexes via CREATE INDEX oder ALTER TABLE. Der max. erlaubte Wert ist 4GB

table_cache: Die anzahl der offenen Tabellen pro Thread

skip-bdb: Deaktiviert BarkleyDB und verbraucht somit weniger Speicher

skip-innodb: Deaktiviert InnoDB und verbraucht wesentlich weniger Speicher

Eine vollständige Auflistung aller Systemvariablen für MySQL findet sich hier

Um die ganze Konfiguration jetzt noch zu testen gibt es ein einfach Kommandozeilen-Tool. Sowohl für Windows, wie auch OS X bzw Linux. Es handelt sich hierbei um Apache Benchmark (ab). Um diesen zu starten gibt man folgendes ein:

ab -c 20 -n 1000 localhost/index.php

Dies startet 1000 requests von denen jeweils max. 20 parallel laufen und die index.php aufrufen.

Der Benchmark sollte jedeoch, um möglichst realistische Werte zu vermitteln nicht vom Server gestartet werden sondern von irgendwo außerhalb. Außerdem empfiehlt es sich, diesen nicht auf eine Produktiv-System loszulassen.

Invite your friends to this article!