python - 如果搜索产生的结果多于显示的结果,则抓取隐藏页面
问题描述
在https://www.comparis.ch/carfinder/default下输入的一些搜索查询会产生超过 1'000 个结果(在搜索页面上动态显示)。然而,结果最多只显示 100 页,每页有 10 个结果,所以我试图在给定产生超过 1'000 个结果的查询的情况下抓取剩余的数据。抓取前 100 个页面的 ID 的代码是(运行所有 100 个页面大约需要 2 分钟):
from bs4 import BeautifulSoup
import requests
# as the max number of pages is limited to 100
number_of_pages = 100
# initiate empty dict
car_dict = {}
# parse every search results page and extract every car ID
for page in range(0, number_of_pages + 1, 1):
newest_secondhand_cars = 'https://www.comparis.ch/carfinder/marktplatz/occasion'
newest_secondhand_cars = requests.get(newest_secondhand_cars + str('?page=') + str(page))
newest_secondhand_cars = newest_secondhand_cars.content
soup = BeautifulSoup(newest_secondhand_cars, "lxml")
for car in list(soup.find('div', {'id': 'cf-result-list'}).find_all('h2')):
car_id = int(car.decode().split('href="')[1].split('">')[0].split('/')[-1])
car_dict[car_id] = {}
所以我显然尝试只传递一个str(page)
大于 100 的值,这不会产生额外的结果。如果有的话,我如何访问剩余的结果?
解决方案
您的网站似乎在客户端浏览时加载数据。可能有很多方法可以解决这个问题。一种选择是使用Scrapy Splash。
假设您使用scrapy,您可以执行以下操作:
- 使用 docker 启动 Splash 服务器 - 记下
- 在
settings.py
添加SPLASH_URL = <splash-server-ip-address>
- 除了
settings.py
中间件
这段代码:
DOWNLOADER_MIDDLEWARES = {
'scrapy_splash.SplashCookiesMiddleware': 723,
'scrapy_splash.SplashMiddleware': 725,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
from scrapy_splash import SplashRequest
在你的 spider.py 中导入- 在您的 spider.py 中设置
start_url
以迭代页面
比如像这样
base_url = 'https://www.comparis.ch/carfinder/marktplatz/occasion'
start_urls = [
base_url + str('?page=') + str(page) % page for page in range(0,100)
]
- 通过修改将 url 重定向到启动服务器
def start_requests(self):
比如像这样
def start_requests(self):
for url in self.start_urls:
yield SplashRequest(url, self.parse,
endpoint='render.html',
args={'wait': 0.5},
)
- 像现在一样解析响应。
让我知道这对你有什么影响。
推荐阅读
- nginx - 在 nginx 中有条件地更新请求标头的值
- node.js - Angular 2 项目未运行错误 angular/CLI
- python-3.x - Python neo4j 螺栓驱动程序在上下文切换后失去连接
- windows - Ansible Windows ACL
- java - 杰克逊将空值反序列化为空列表,无法访问实体
- mysql - MySql 复杂查询 | 如何从 SELECT 中删除以及如何从数组中创建子列表
- android - recyclerView 中的 android spinner 无法正常工作
- javascript - IE11 WebSocket 对象 onopen:预期对象
- javascript - 如何在 Vue 中对计算属性进行分页
- azure - Umbraco7:在同一个 Azure 存储帐户中设置多个 /media/ blob 容器