答辩超人sbcan 2024-05-02 00:52 采纳率: 100%
浏览 10
已结题

爬虫#开发者工具#JavaScript

有没有人知道,遇到打开开发者就关闭网站的情况下,怎么拿到数据包?如果禁用js运行的话,网站里没有数据包。

  • 写回答

6条回答 默认 最新

  • 专家-皆知 2024-05-02 00:52
    关注

    参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。

    在遇到网页通过开发者工具检测并立即关闭的情况时,可以尝试以下几种方法获取数据包:

    1. 使用无头浏览器: 无头浏览器可以在后台执行而无需用户界面,因此不会触发网站的检测机制。这里推荐使用puppeteer库,它是基于Chromium的无头浏览器API。首先安装puppeteer:

      npm install puppeteer
      

      然后编写一个简单的脚本来抓取页面并保存为HTML文件,这样可以绕过动态加载的数据:

      const puppeteer = require('puppeteer');
      
      async function fetchPage(url) {
        const browser = await puppeteer.launch();
        const page = await browser.newPage();
        await page.goto(url, { waitUntil: 'networkidle2' });
        await page.screenshot({ path: 'screenshot.png' }); // 可选:保存屏幕截图
        await page.content().then(html => {
          fs.writeFileSync('page.html', html); // 保存完整的HTML内容到本地
        });
        await browser.close();
      }
      
      fetchPage('https://example.com');
      

      这段代码会启动一个无头浏览器,打开指定URL,等待网络完全加载后保存整个HTML到page.html文件。

    2. 分析前端源码: 如果网站依赖于特定的JavaScript函数来获取数据,你需要查看源码中的这些函数,然后手动复制这些请求并在Python中使用类似requests库发送相同的请求。例如,你可能看到一个fetch或axios调用来获取JSON数据:

      axios.get('/api/data')
        .then(response => console.log(response.data));
      

      在这种情况下,你可以模仿这个请求:

      import requests
      
      url = 'https://example.com/api/data'
      response = requests.get(url)
      data = response.json()
      print(data)
      
    3. 代理服务器: 使用代理服务器(如Selenium)来处理JavaScript渲染的页面。Selenium可以与多种浏览器(包括Chrome、Firefox等)结合使用,提供了一个更加接近真实用户浏览环境的方式来获取数据。首先安装Selenium:

      pip install selenium
      

      然后配置ChromeDriver,并编写一个Python脚本:

      from selenium import webdriver
      from selenium.webdriver.chrome.options import Options
      
      def fetch_page(url):
          options = Options()
          options.add_argument('--headless')  # 隐藏浏览器窗口
          driver = webdriver.Chrome(options=options)
          try:
              driver.get(url)
              return driver.page_source
          finally:
              driver.quit()
      
      page_source = fetch_page('https://example.com')
      print(page_source)
      
    4. 使用第三方服务: 有些第三方服务如Scrapy-Splash或Puppeteer-cluster提供了方便的API来处理JavaScript渲染的页面。它们允许你在Python中控制无头浏览器,就像操作普通的HTTP客户端一样。

      例如,对于Scrapy框架,你可以设置Scrapy-Splash中间件来渲染页面。首先安装Scrapy-Splash:

      docker run -d -p 8050:8050 scrapinghub/splash
      

      然后在Scrapy项目中配置Scrapy-Splash中间件:

      # settings.py
      SPLASH_URL = 'http://localhost:8050'
      
      DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
      DOWNLOADER_MIDDLEWARES = {
          'scrapy_splash.SplashCookiesMiddleware': 723,
          'scrapy_splash.SplashMiddleware': 725,
          'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
      }
      SPIDER_MIDDLEWARES = {
          'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
      }
      

      接下来,定义Scrapy Spider,它将通过Splash渲染页面:

      # spiders/example_spider.py
      import scrapy
      from scrapy_splash import SplashRequest
      
      class ExampleSpider(scrapy.Spider):
          name = 'example'
          start_urls = ['https://example.com']
      
          def start_requests(self):
              for url in self.start_urls:
                  yield SplashRequest(url=url, callback=self.parse)
      
          def parse(self, response):
              # 解析渲染后的页面
              pass
      

      运行Scrapy spider,它将自动处理JavaScript渲染的问题。

    请根据具体网站结构选择合适的方法,如果你对某个步骤有疑问,随时提问。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 5月11日
  • 已采纳回答 5月3日
  • 创建了问题 5月2日