将 Selenium 与 Scrapy 集成以实现动态页面
当抓取具有动态内容的复杂网站时,Selenium(一个 Web 自动化框架)可以与Scrapy,一个网络抓取框架,用于克服挑战。
集成将 Selenium 集成到 Scrapy Spider
要将 Selenium 集成到 Scrapy Spider 中,请在 Spider 的 __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()
接下来,导航到解析中的 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())
这种方法采用 JavaScript 渲染,使用 ScrapyJS 来获取所需的数据,而不使用 Selenium。
以上是Selenium如何与Scrapy集成来抓取动态页面?的详细内容。更多信息请关注PHP中文网其他相关文章!