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>']
原因分析
- 动态内容渲染:该网站的搜索结果是通过JavaScript动态加载的,Scrapy默认的下载器只会抓取页面的静态HTML源码,不会执行页面中的JavaScript,因此无法获取到JS动态生成的搜索结果内容。
- 反爬机制拦截:网站可能通过检测请求的User-Agent、Cookie、会话信息等特征,识别出Scrapy的爬虫请求,返回了仅包含静态框架的页面,屏蔽了搜索结果内容。
解决方法
1. 启用JavaScript渲染工具
使用Scrapy结合Playwright或Splash这类支持JS渲染的工具,让爬虫能够执行页面中的JavaScript,获取动态加载的内容。
- 以Playwright为例:
- 安装依赖:
pip install scrapy-playwright - 在Scrapy项目的
settings.py中配置:DOWNLOAD_HANDLERS = { "http": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler", "https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler", } SPIDER_MIDDLEWARES = { "scrapy_playwright.middleware.PlaywrightMiddleware": 543, } - 在请求时添加
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
相关产品推荐
相关产品推荐

