`
minima
  • 浏览: 5741 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

win7环境scrapy集成selenium爬取动态网页

阅读更多

scrapy可以爬取静态页面,但目前越来越多的网站数据都是通过js动态加载处理的。要想爬取这部分数据必不可少的对js处理的动态页面进行处理。一个简单的方法就是集成js处理工具,笔者在此选用的是selenium。

scrapy的安装见笔者其他文章。在此笔者使用的是win7 64位环境。

python环境安装selenium较为简单,使用命令可以自动获取最新版本的selenium,笔者安装的是selenium 3.0.2,详见https://pypi.python.org/pypi/selenium/3.0.2

pip install selenium

安装好selenium还需安装各个浏览器的driver,selenium才能正常使用,笔者就主流浏览器ie,Firefox,chrome进行举例,关于各浏览器的版本问题,详见http://docs.seleniumhq.org/download/ 

1、IE浏览器IEDriverServer

selenium官网给出win7 64位的IEDriverServer下载链接为:http://selenium-release.storage.googleapis.com/2.53/IEDriverServer_x64_2.53.1.zip

下载解压后即可使用: 

 

iedriver = "D:\scrapy\selenium\driver\IEDriverServer.exe"
driver = webdriver.Ie(iedriver)

 2、chrome浏览器chromedriver

 

下载链接为:http://chromedriver.storage.googleapis.com/2.25/chromedriver_win32.zip

下载解压后即可使用:

 

chromedriver = "D:\scrapy\selenium\driver\chromedriver.exe"
driver = webdriver.Chrome(chromedriver)

 3、Firefox浏览器geckodriver

 

下载链接为:https://github.com/mozilla/geckodriver/releases

下载解压后即可使用: 

 

firefoxdriver = "D:\scrapy\selenium\driver\geckodriver.exe"
binary = FirefoxBinary("C:\Program Files (x86)\Mozilla Firefox\Firefox.exe")
driver = webdriver.Firefox(executable_path=firefoxdriver,firefox_binary=binary)

注:firefox浏览器路径需要做指定,如不指定会出现报错:

 

WebDriverException: Message: Expected browser binary location, but unable to find binary in default location, no 'moz:firefoxOptions.binary' capability provided, and no binary flag set on the command line

————————————————分割线————————————————

以上是selenium的环境搭建。下面开始将selenium与scrapy进行集成。

一般来说集成selenium到scrapy框架的方式有2种:

1、创建Middleware,在Middleware中调用selenium进行动态加载。但是此种方式由于对所有连接进行无差别通过selenium进行加载,灵活性太差,会拖慢scrapy的运行效率,不推荐使用。

2、在scrapy的Spider中针对必要的网页调用selenium进行动态加载。此种方式较为灵活,同时也可以做针对特定网站的操作。下面主要对此种方式进行说明:

from scrapy.selector import Selector
#添加selenium依赖声明
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary

……


#初始化selenium对象
	def __init__(self):
		CrawlSpider.__init__(self)  
		#firefox
		firefoxdriver = "D:\scrapy\selenium\driver\geckodriver.exe"
		binary = FirefoxBinary("C:\Program Files (x86)\Mozilla Firefox\Firefox.exe")
		self.driver = webdriver.Firefox(executable_path=firefoxdriver,firefox_binary=binary)

		# 设定页面加载限制时间
		self.driver.set_page_load_timeout(10)
		self.driver.maximize_window()

	def __del__(self):
		self.driver.close()

……

#具体处理
	def parse_item(self, response):
		print response.url		
		try:
		    self.driver.get(response.url)
		except TimeoutException:
		    #print 'time out after 10 seconds when loading page'
		    self.driver.execute_script('window.stop()') #当页面加载时间超过设定时间,通过执行Javascript来stop加载,即可执行后续动作
		……
		#可使用scrapy的Selector处理加载到的页面,侵入性较小
		#也可通过selenium做一些高级操作,或直接使用selenium的页面处理
		sel = Selector(text = self.driver.page_source)

 这样就可以通过selenium加载js动态数据,并沿用scrapy的页面处理方式。

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

Global site tag (gtag.js) - Google Analytics