例如,当我使用网站“https://en.zalando.de/men-shoes-boots/”时,仅抓取了 37 个项目。我知道需要某种类型的分页才能到达下一页,但在第一页本身有远远超过 37 个项目,而且我似乎无法弄清楚为什么脚本在 37 处停止。
任何帮助我将非常感激!!
我的蜘蛛元素查找器看起来像这样:
class ZalandoSpider (scrapy.Spider):
name = 'zalando'
start_urls = [
'https://en.zalando.de/men-shoes-boots/'
]
def parse(self,response):
alle_elementen = response.css('.DvypSJ')
print('length=' + str(len(alle_elementen)))
可能与无限滚动有关,但我已经检查网络页面超过2小时了,但没有结果。
你提到的问题很常见,当网站使用 JavaScript 动态加载内容而 Scrapy 默认只获取初始 HTML 内容时,就会出现这种情况。 Zalando 网站看起来确实使用了无限滚动,这意味着当你滚动页面时,会加载更多的产品。
你的 Scrapy 蜘蛛只找到 37 个产品,因为它只查看了初始 HTML 源代码。
.css('.DvypSJ')
选择器在初始响应中只找到 37 个匹配项。
为了抓取所有产品,你需要一种方法来处理这种动态加载的内容。以下是一些选项:
1. 使用 Splash 渲染 JavaScript
Splash 是一个 JavaScript 渲染服务,可以与 Scrapy 集成。它可以渲染页面并执行 JavaScript,从而加载所有产品。
- 首先,你需要安装 Splash 并启动 Splash 服务。
-
然后,你需要安装
scrapy-splash
:bash pip install scrapy-splash
-
在你的 Scrapy 项目中启用 Splash 中间件,并在
settings.py
文件中配置 Splash 服务器地址: ```python DOWNLOADER_MIDDLEWARES = { 'scrapy_splash.SplashCookiesMiddleware': 723, 'scrapy_splash.SplashMiddleware': 725, 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810, }
SPLASH_URL = 'http://localhost:8050'
* 最后,修改你的蜘蛛,使用 `SplashRequest` 代替 `Request` 来获取页面内容:
python
import scrapy
from scrapy_splash import SplashRequest
class ZalandoSpider(scrapy.Spider): name = 'zalando' start_urls = ['https://en.zalando.de/men-shoes-boots/']
def start_requests(self):
for url in self.start_urls:
yield SplashRequest(url, self.parse,
args={'wait': 5},
endpoint='render.html')
def parse(self, response):
alle_elementen = response.css('.DvypSJ')
print('length=' + str(len(alle_elementen)))
# ... 其他解析逻辑 ...
```
2. 使用 Selenium 或 Playwright
Selenium 和 Playwright 是浏览器自动化工具,可以模拟用户交互,如滚动和点击。你可以使用它们加载所有产品,然后使用 Scrapy 解析 HTML 内容。
- 选择 Selenium 或 Playwright,并安装相应的 Python 库。
- 在你的蜘蛛中,使用 Selenium 或 Playwright 打开页面,滚动到底部,直到加载所有产品,然后将页面源代码传递给 Scrapy 进行解析。
3. 分析网络请求
通过分析网络请求,你可以找到加载更多产品的 API 调用。你可以使用浏览器的开发者工具(Network 标签)来观察网络请求。找到 API 调用后,你可以直接向 API 发送请求,获取产品数据。
选择哪种方法取决于你的需求和技术水平。
- 如果你需要处理复杂的 JavaScript 逻辑,Splash 或 Selenium/Playwright 是更好的选择。
- 如果你只需要处理无限滚动,分析网络请求可能会更简单。
希望这些信息能帮助你抓取 Zalando 网站上的所有产品!
标签:python,web-scraping,scrapy,infinite-scroll From: 66495211