#python #scrapy #scrapy-splash
#python #scrapy #scrapy-splash
Вопрос:
Я пытаюсь получить данные с этого веб-сайта с помощью scrapy-splash, но я не могу извлечь данные. Я хочу получить данные о каждом реальном состоянии, например, href, price и т.д. Вот мой код:
в setings.py:
ROBOTSTXT_OBEY = False
USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36"
SPLASH_ENABLED = True
DOWNLOADER_MIDDLEWARES = {
'scrapy_splash.SplashCookiesMiddleware': 723,
'scrapy_splash.SplashMiddleware': 725,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
SPLASH_URL = 'http://localhost:8050/'
SPIDER_MIDDLEWARES = {
'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
мой паук:
class M2Spider(scrapy.Spider):
name = "m2"
allowed_domains = ['metrocuadrado.com']
start_urls = [
'https://www.metrocuadrado.com/bodega/arriendo'
]
def start_requests(self):
for url in self.start_urls:
yield SplashRequest(url=url,callback= self.parse,
endpoint='render.html',
args={'wait': 10},)
def parse(self, response):
print("--------------------------------------------------------------")
real_states= response.selector.xpath(".//a[@class='sc-bdVaJa ebNrSm']").getall()
print("real_states")
Выводимый print представляет собой пустой список []. Я новичок в splash. Есть предложения?
Ответ №1:
Вместо этого я бы сделал следующее:
Отправьте запрос на https://www.metrocuadrado.com/results/_next/static/chunks/commons.8afec6af6d5add2097bf.js , в ответе вы найдете API-ключ, если будете искать «X-Api-Key». Так что это можно легко извлечь с помощью регулярных выражений, что-то вроде: re.findall(r'"X-Api-Key":"(w )"')
.
Затем, когда вы извлекли ключ API, отправьте запрос на https://www.metrocuadrado.com/rest-search/search?seo=/bodega/arriendoamp;from=0amp;size=50 , который является скрытым API на веб-сайте, который вы отправили. Чтобы получить действительный ответ, вы должны прикрепить заголовок следующим образом
scrapy.Request(
url=url_variable,
headers={
"x-api-key": api_key_variable_from_prev_step
}
)
Из этого API вы получаете данные в формате JSON, которые обычно более надежны, чем синтаксический анализ html, поскольку это часто меняется.
Комментарии:
1. Ваш ответ был очень полезен, но у меня возникли некоторые проблемы с получением всех элементов. Когда я отправил запрос на metrocuadrado.com/rest-search/search?seo=/bodega/… Я получил первые 50 элементов, но когда я отправил следующий запрос на metrocuadrado.com/rest-search/search?seo=/bodega/… Я продолжаю получать те же 50 ранее полученных элементов, что я могу делать неправильно?
2. Попробуйте использовать этот URL-адрес, нашел его при разбивке сайта на страницы в chrome inspect. metrocuadrado.com/rest-search /…
3. это работает для меня, но у меня есть еще одна небольшая «проблема», я могу получить только 10000 элементов, не могли бы вы помочь мне еще раз, пожалуйста?
4. Я думаю, что сайт ограничен предоставлением только 10 000 элементов. Если вы посмотрите на обычный сайт, вы увидите, что вы можете разбивать страницы максимум на 200 страниц. Так что я не думаю, что есть способ обойти это, к сожалению.