Python中写Scrapy爬虫时,遇到了js跳转页面,大家有没有好的解决方法
请求时返回的相应内容是这样:
<html><head></head><body><script>window.location.href=‘https://XXX.xxx.com/’;</script></body></html>
之前使用过 selenium 抓数据,但是效率太低,所以想请问一下大家有没有好的办法,在 scrapy 框架里拿到正常响应的请求
Python中写Scrapy爬虫时,遇到了js跳转页面,大家有没有好的解决方法
顺着这个 href 接着爬就可以了
遇到Scrapy爬虫处理JS跳转页面,我通常用Selenium或Playwright来模拟浏览器执行JavaScript。Scrapy本身不支持JS渲染,所以得结合这些工具。
下面是个实用方案,用Scrapy+Selenium处理JS跳转:
import scrapy
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from scrapy.http import HtmlResponse
class JsRedirectSpider(scrapy.Spider):
name = 'js_redirect'
def __init__(self):
# 初始化Selenium WebDriver
self.driver = webdriver.Chrome() # 需要安装chromedriver
# 或者用Firefox: webdriver.Firefox()
def start_requests(self):
url = 'https://example.com/page-with-js-redirect'
yield scrapy.Request(url, callback=self.parse_with_selenium)
def parse_with_selenium(self, response):
# 用Selenium打开页面
self.driver.get(response.url)
# 等待JS执行完成(根据实际情况调整等待条件)
try:
# 等待某个元素出现,表明页面加载完成
WebDriverWait(self.driver, 10).until(
EC.presence_of_element_located((By.ID, "target-element"))
)
except:
# 或者简单等待几秒
import time
time.sleep(3)
# 获取渲染后的页面源码
page_source = self.driver.page_source
# 创建Scrapy Response对象
rendered_response = HtmlResponse(
url=self.driver.current_url,
body=page_source.encode('utf-8'),
encoding='utf-8'
)
# 现在可以用Scrapy选择器解析渲染后的页面
# 例如:rendered_response.css('div.content').get()
# 继续处理数据...
yield {
'url': self.driver.current_url,
'title': self.driver.title,
'content': page_source[:500] # 示例:取前500字符
}
def closed(self, reason):
# 爬虫结束时关闭浏览器
self.driver.quit()
如果不想用Selenium这种重量级方案,还有几个轻量级选择:
- Scrapy-Splash:专门为Scrapy设计的JS渲染服务
# settings.py
SPLASH_URL = 'http://localhost:8050'
# spider中
yield scrapy.Request(
url,
self.parse,
meta={'splash': {'args': {'wait': 2.0}}}
)
-
直接分析JS代码:有时跳转只是简单的
window.location.href,可以直接从JS代码里提取目标URL。 -
Requests-HTML:比Selenium轻量,支持JS执行
from requests_html import HTMLSession
session = HTMLSession()
r = session.get(url)
r.html.render() # 执行JS
简单总结:Selenium/Playwright最通用,Scrapy-Splash集成更方便。
我之前的做法就是分析他们的 API
这个问题已经困了我一周,查了挺多资料,还是没办法,求大佬支招
if 返回码== 3xx 跟着跳转
首先和 1 楼说的,顺着 href 爬。
不行的话看看是不是需要 cookie,我之前提问过,有的网站需要判断 cookie 值,没有的话,就会要求 js 跳转,有 cookie 就可以直接访问。
还有其他措施,要具体分析
返回链接继续爬,遇到 js 生成页面用 splash,不要用 selenium
splash 把,使用 qt 中的 webview 加载页面,可以运行页面中的 js 代码,使用简单
所有返回这行代码的页面响应码都是 200,
如果只是这个,正则匹配下 url 继续爬啊
忘了说,返回的 url 和请求的 url 是同一个,顺着 href 继续爬的话会无限循环这个响应内容
splash 我也考虑过,我的需求是请求索引页–>详情页–>详情页里的某个 href 字段共三级页面,实现起来比较麻烦
既然是无限循环的情况,可能是服务器验证有问题,要么你代码请求不规范,要么就是被反爬拦截了,排除代码问题后,着重看 cookie 变化或者 js 加密参数的情况
5 楼说的有道理,可能是你没带 cookie 访问,我最近刚好也遇到了这个问题,带上 cookie 就好了
对的,确实是这个问题,带上 cookie 可以成功访问了
是的,是因为没带 cookie,已经解决了,:)
一般这种是要带上 cookie 去访问的
啥网站呀,贴出来看看?
想问一下,cookie 失效了要怎么办,只有更换这一种方法吗
同样这个网站出这个问题,我发现直接用 requests 就可以…所以…这是为啥…

