Mapz's Blog

可以递归的函数指针

在Mac上组合使用Scrapy和phantomJs

前言

我们做爬虫的的时候,经常会遇到页面中的部分是由js生成并渲染的情况,这时爬虫爬到的页面还并非呈现在用户面前的页面,要得到需要的内容,可以用大招…还是用浏览器核心来渲染一遍

我准备尝试用PhantomJs–基于Webkit的服务端JS API(说大白话点,就是个隐形的浏览器,并且这货还提供了文件处理的IO操作)用来帮我们处理爬虫爬到的页面的渲染工作。


安装PhantomJS

下载地址
这个是已经编译好的

不要用npm装,不然会不能正常运行

下载后解压后把目录下的bin路径加入PATH中就可以了

1
phantomjs --version

如果不报错,则已经安装好了


番外:想要安装HomeBrew

那就这么安吧

1
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null

Scrapy安装

(假设你已经懂Scrapy怎么玩)


安装selenium

selenium支持在Python中使用多种浏览器来模拟行为,同样PhantomJS也不在话下

1
sudo pip install selenium

使用

Scrapy中间件增加一个

1
2
3
4
5
6
7
8
9
10
11
12
13
from selenium import webdriver
import time
from scrapy.http import HtmlResponse
class JSProcessMiddleware(object):
def process_request(self, request, spider):
driver = webdriver.PhantomJS(executable_path = '你的phantomjs安装路径')
driver.get(request.url)
time.sleep(1)
js = "var q=document.documentElement.scrollTop=10000"
driver.execute_script(js) # 可执行js,模仿用户操作。此处为将页面拉至最底端。
time.sleep(3)
body = driver.page_source
return HtmlResponse(driver.current_url, body=body, encoding='utf-8', request=request)

如果不想在所有爬虫中使用,可以在reqeust中加meta参数来控制