使用Scrapy + Selenium抓取网页

某些页面是使用ajax技术渲染的,无法通过直接下载HTML源代码来解析,所以需要调用Selenium等软件帮助我们获取渲染后的HTML代码。

所需的软件包括:
1. Scrapy (http://scrapy.org/),python下的无敌抓取框架;
2. Selenium Server (http://seleniumhq.org/projects/remote-control/),可以用各种语言远程控制Selenium做各种事情,一般用于构建自动化测试工具,这里我们用来抓取网页;下面是原理图:
Selenium RC
3. 在电脑的Firefox中安装Selenium IDE插件。

下面我们开始一步步来做:
1. 首先,进入你的电脑上Selenium Server的jar包所在的目录,通过java -jar xxx.jar的方式运行它,程序会自动监听本地的4444端口;
2. 参考我的上一篇博文《如何连入一台没有外网IP的服务器》 ,将本地的4444端口与服务器的4444端口建立Remote映射;
3. 使用Scrapy框架开始编写python程序,具体的例子不再赘述,网上有许多例子,比如这个:https://gist.github.com/1045108。仅描述几个要点:
a) 在python里调用selenium这样写:
self.sel = selenium("localhost", 4444, "*firefox","http://example.com/")
不过直接写 “*firefox” 可能会找不到Firefox的路径,这时可以强制指定Firefox的程序路径,比如:”*firefox D:/Program Files/Mozilla Firefox/firefox.exe”。
b) 获取Firefox渲染完成后的HTML代码:

sel = self.selenium
sel.open(response.url)
sel.wait_for_page_to_load(10000)
html = sel.get_eval("selenium.browserbot.getCurrentWindow().document.getElementsByTagName('html')[0].innerHTML")

 

Done!

如何连入一台没有外网IP的服务器

我们有的时候需要从本地电脑连入线上的数据库服务器进行各种操作,而通常数据库服务器是不允许外网访问的,如何解决这个问题呢?

1. 打开putty,在 SSH -> Tunnels 菜单增加一个本地端口到远程端口的对应关系,如下图:

如果你在Ubuntu或MAC下办公,那么更简单了:

在本地机器敲入:ssh -Nf -L 3307:localhost:3306 remote.server.com;

在远程机器敲入:ssh -Nf -R 3306:remote.server.com:3307 localhost。

原理是一样的,就是创建一个隧道。

2. 打开你的MySQL客户端(以HeidiSQL为例),配置host为127.0.0.1,端口为3307(或你自定义的本地端口),输入远程MySQL的用户名和密码即可,如果这个时候报Access Denied错误,要留心你的用户名所在IP是否为SSH Tunnel设置的远程IP,如果不是需要改为一致的。

Enjoy it!