前言
Scrapy爬虫(一)——你的第一个Scrapy爬虫
Scrapy爬虫(二)——自定义Item和代理访问的爬虫
如果理解清楚以上这两篇博客,运用scrapy框架爬取一般的网页基本不是什么难题了。可是有些时候我们会遇到动态网页,向下滚动加载的网页便是一种很常见的动态网页,要解决这种网页,我们需要采用phantomjs+scrapy的方法。
Phantomjs的安装
简单地说Phantomjs就是一个没有GUI的浏览器,但通过javascript,它可以实现所有我们在网页上的操作。对比起selenium每次都需要调用浏览器,Phantomjs显然更适合嵌入到scrapy框架当中
在Ubuntu下安装phantomjs不能使用!!apt-get install phantomjs!!!
使用这个方法安装的phantomjs并不完整,在使用的时候会导致许多错误。正确的安装方式应该是
sudo npm install phantomjs -g
同时还需要安装selenium
sudo pip install selenium
准备工作完成
构建动态爬虫
spider函数很简单,这里主要只是为了打印出网页内容而已(破易躺枪)
class mySpider(scrapy.Spider):
name = 'myspider'
start_urls = ['http://blog.youkuaiyun.com/qq_30242609/article/details/70859891']
def parse(self, response):
print response.body
新建一个JSMiddware
#-*- coding: UTF-8 -*-
from selenium import webdriver
from scrapy.http import HtmlResponse
import time
js='''
document.body.scrollTop +=1000;
'''
//让网页下滚的脚本
class PhantomJSMiddleware(object):
@classmethod
def process_request(cls, request, spider):
driver = webdriver.PhantomJS()
driver.get(request.url)
while ((driver.find_element_by_xpath("//div[@class='post_addmore']").get_attribute(
'style')) == "visibility: visible;"):
driver.execute_script(js)//当网页未下滑到最底部的时候,继续执行代码
time.sleep(1)
data = driver.page_source.encode('utf-8')
driver.quit()
return HtmlResponse(request.url, encoding='utf-8', body=data, request=request)//返回Response给parse()方法
最后只需要修改settings.py就可以了
DOWNLOADER_MIDDLEWARES = {
'Phantomjs.JSMiddleware.PhantomJSMiddleware': 100
}
总结
掌握了Phantomjs+scrapy,同时学好javascript,基本上就没有爬不了的网页了,在这里我也仅仅是做个入门的简介。Scrapy爬虫我不打算深究下去,目前看来没有什么网页是爬取不了的,故Scrapy爬虫这一系列就暂告一段落 了。