You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scrapy无法获取目标页面搜索结果HTML的问题求助

问题

有一个带邮政编码查询参数的URL:https://www.psychotherapy.org.uk/find-a-therapist/?Location=M3%201AR&Distance=10&page=7,在浏览器中可以正常加载出带独立h2标签的搜索结果,但用Scrapy Shell请求该URL返回200状态码后,只能获取页眉、页脚、菜单等静态HTML内容,无法拿到搜索结果相关的HTML。测试h2标签的结果如下:

In [1]: fetch('https://www.psychotherapy.org.uk/find-a-therapist/?Location=M3%201AR&Distance=10&page=7')
2024-04-12 15:45:28 [scrapy.core.engine] INFO: Spider opened
2024-04-12 15:45:30 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://proxy.scrapeops.io/v1/?api_key=e3486f25-6d19-4663-b876-35d01b822096&url=https%3A%2F%2Fwww.psychotherapy.org.uk%2Frobots.txt> (referer: None)
2024-04-12 15:45:30 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://proxy.scrapeops.io/v1/?api_key=e3486f25-6d19-4663-b876-35d01b822096&url=https%3A%2F%2Fproxy.scrapeops.io%2Frobots.txt> (referer: None)
2024-04-12 15:45:34 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://proxy.scrapeops.io/v1/?api_key=e3486f25-6d19-4663-b876-35d01b822096&url=https%3A%2F%2Fwww.psychotherapy.org.uk%2Ffind-a-therapist%2F%3FLocation%3DM3%25201AR%26Distance%3D10%26page%3D7> (referer: None)

In [2]: response.css('h2').getall()
Out[2]:
['<h2>Refine your search</h2>',
 '<h2>Looking for a specific therapist?</h2>',
 '<h2>\r\n                        <span class="sub">Bookmarks</span>\r\n                        My Shortlist\r\n                    </h2>',
 '<h2>Contact us</h2>',
 '<h2>Links</h2>',
 '<h2>Connect with us</h2>']

原因分析

  1. 动态内容渲染:该网站的搜索结果是通过JavaScript动态加载的,Scrapy默认的下载器只会抓取页面的静态HTML源码,不会执行页面中的JavaScript,因此无法获取到JS动态生成的搜索结果内容。
  2. 反爬机制拦截:网站可能通过检测请求的User-Agent、Cookie、会话信息等特征,识别出Scrapy的爬虫请求,返回了仅包含静态框架的页面,屏蔽了搜索结果内容。

解决方法

1. 启用JavaScript渲染工具

使用Scrapy结合Playwright或Splash这类支持JS渲染的工具,让爬虫能够执行页面中的JavaScript,获取动态加载的内容。

  • 以Playwright为例:
    1. 安装依赖:pip install scrapy-playwright
    2. 在Scrapy项目的settings.py中配置:
      DOWNLOAD_HANDLERS = {
          "http": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
          "https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
      }
      SPIDER_MIDDLEWARES = {
          "scrapy_playwright.middleware.PlaywrightMiddleware": 543,
      }
      
    3. 在请求时添加meta参数启用Playwright:
      yield scrapy.Request(url, meta={"playwright": True})
      

2. 模拟浏览器请求特征

伪装请求头,让爬虫请求更接近正常浏览器的请求:

  • 在settings.py中设置全局User-Agent和下载延迟:
    USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"
    DOWNLOAD_DELAY = 2
    
  • 若需要Cookie,可从浏览器中复制当前会话的Cookie,添加到请求头中:
    headers = {
        'User-Agent': '你的浏览器UA',
        'Cookie': '从浏览器复制的Cookie字符串'
    }
    yield scrapy.Request(url, headers=headers)
    

3. 直接调用数据接口

打开浏览器开发者工具的Network面板,刷新目标页面,筛选XHR/Fetch类型的请求,找到网站加载搜索结果的后端API接口,直接请求该接口获取结构化数据,这种方式比渲染页面更高效,也能绕开JS渲染的问题。


内容的提问来源于stack exchange,提问作者Juc1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 23:49:53