将 Selenium 与 Scrapy 集成以实现动态页面
当抓取具有动态内容的复杂网站时,Selenium(一个 Web 自动化框架)可以与Scrapy,一个网络抓取框架,用于克服挑战。
将 Selenium 集成到 Scrapy 中Spider
要将 Selenium 集成到 Scrapy 蜘蛛中,请在蜘蛛的 __init__ 方法中初始化 Selenium WebDriver。
import scrapy from selenium import webdriver class ProductSpider(scrapy.Spider): name = "product_spider" allowed_domains = ['example.com'] start_urls = ['http://example.com/shanghai'] def __init__(self): self.driver = webdriver.Firefox()
接下来,导航到 parse 方法中的 URL 并利用 Selenium 方法与页面交互。
def parse(self, response): self.driver.get(response.url) next = self.driver.find_element_by_xpath('//td[@class="pagn-next"]/a') next.click()
通过利用这种方法,您可以模拟用户交互、导航动态页面并提取所需的数据。
将 Selenium 与 Scrapy 一起使用的替代方案
在某些情况下,使用 ScrapyJS 中间件可能足以处理页面的动态部分,而无需依赖 Selenium。例如,请参见以下示例:
# scrapy.cfg DOWNLOADER_MIDDLEWARES = { 'scrapyjs.SplashMiddleware': 580, }
# my_spider.py class MySpider(scrapy.Spider): name = 'my_spider' start_urls = ['http://example.com/dynamic'] def parse(self, response): script = 'function() { return document.querySelectorAll("div.product-info").length; }' return Request(url=response.url, callback=self.parse_product, meta={'render_javascript': True, 'javascript': script}) def parse_product(self, response): product_count = int(response.xpath('//*[@data-scrapy-meta]/text()').extract_first())
这种方法采用使用ScrapyJS的JavaScript渲染来获取所需的数据,而无需使用硒。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3