scrapy selenium
时间: 2024-12-26 20:19:52 浏览: 2
### 结合Scrapy和Selenium进行网页抓取
为了实现更强大的网络爬虫功能,可以将Scrapy与Selenium结合起来使用。这种方法能够处理动态加载的内容以及静态页面中的数据提取。
#### 安装依赖库
首先需要安装必要的Python包来支持这种组合方式:
```bash
pip install scrapy selenium
```
对于浏览器驱动程序的选择取决于个人偏好;通常推荐ChromeDriver或GeckoDriver(Firefox)。确保下载对应版本并将其路径添加到环境变量中[^1]。
#### 创建中间件类
创建一个名为`middleware.py`的新文件,在其中定义用于启动和关闭浏览器实例的方法,并通过此方法返回由Selenium获取的页面源码给Scrapy解析器:
```python
from selenium import webdriver
import time
class SeleniumMiddleware(object):
@classmethod
def from_crawler(cls, crawler):
s = cls()
crawler.signals.connect(s.spider_closed, signal=signals.spider_closed)
return s
def process_request(self, request, spider):
self.driver.get(request.url)
# Wait until page is fully loaded.
time.sleep(3)
body = str.encode(self.driver.page_source)
response = HtmlResponse(
self.driver.current_url,
body=body,
encoding='utf-8',
request=request
)
return response
def spider_closed(self):
"""Shutdown the driver when spider closes."""
self.driver.quit()
```
这段代码实现了基本的功能——每当遇到新的请求时就会调用一次`process_request()`函数,它会打开目标URL并将渲染后的HTML作为响应对象传递回去供后续分析[^2]。
#### 修改配置文件settings.py
为了让上述自定义中间件生效,还需要修改项目的设置文件`settings.py`, 添加如下几行以激活该插件:
```python
DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.SeleniumMiddleware': 543,
}
```
这里假设项目名称为`myproject`; 如果不同,则需相应调整模块名前缀部分。
#### 编写Spider脚本
最后一步就是编写具体的spider逻辑了。下面是一个简单的例子展示如何利用刚才建立起来的基础架构来进行实际的数据采集工作:
```python
import scrapy
class ExampleSpider(scrapy.Spider):
name = "example"
start_urls = [
'http://quotes.toscrape.com/js/',
]
def parse(self, response):
quotes = response.css('div.quote')
for quote in quotes:
yield {
'text': quote.css('span.text::text').get(),
'author': quote.css('small.author::text').get(),
}
next_page = response.css('li.next a::attr(href)').get()
if next_page is not None:
yield response.follow(next_page, callback=self.parse)
```
这个蜘蛛将会访问指定网站上的JavaScript生成内容,并从中抽取所需的信息片段[^4]。
阅读全文