將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