Я следую курсу. Оно немного устарело, поэтому на сайте кое-что изменилось. https://www.centris.ca/
По сути, это сайт недвижимости, вам нужно вызвать в 2 конечные точки, чтобы получить результат с объектами недвижимости.
Звоните 1: https://www.centris.ca/property/UpdateQuery
Звонок 2: https://www.centris.ca/Property/GetInscriptions
К сожалению, я не могу понять, как не вернуть ответ на французском языке. Вещи, которые я пробовал:
заголовки: 'Accept-Language': 'en-US,en;q=0.6'
Файлы cookie: ничего, что указывает на язык.
Паук:
import scrapy
from scrapy.selector import Selector
import json
class ListingsSpider(scrapy.Spider):
name = "listings"
allowed_domains = ["www.centris.ca"]
position = {
"startPosition": 0
}
def start_requests(self):
query = {
"query":{
"UseGeographyShapes":0,
"Filters":[
],
"FieldsValues":[
{
"fieldId":"Category",
"value":"Commercial",
"fieldConditionId":"",
"valueConditionId":""
},
{
"fieldId":"SellingType",
"value":"Rent",
"fieldConditionId":"",
"valueConditionId":""
},
{
"fieldId":"RentPrice",
"value":0,
"fieldConditionId":"ForRent",
"valueConditionId":""
},
{
"fieldId":"RentPrice",
"value":999999999999,
"fieldConditionId":"ForRent",
"valueConditionId":""
}
]
},
"isHomePage": True
}
yield scrapy.Request(
url = "https://www.centris.ca/property/UpdateQuery",
method = "POST",
body=json.dumps(query),
headers = {
'Content-Type': 'application/json',
'Content-Language': 'en'
},
callback=self.update_query
)
def update_query(self, response):
yield scrapy.Request(
url = "https://www.centris.ca/Property/GetInscriptions",
method = "POST",
body=json.dumps(self.position),
headers = {
'Content-Type': 'application/json',
'accept-language': 'en-US,en;q=0.6',
'referer': 'https://www.centris.ca/en/properties~for-rent?view=Thumbnail',
'cache-control': 'no-cache'
},
cookies = {'currency': 'USD', 'country': 'UY'},
callback=self.parse
)
def parse(self, response):
resp_dict = json.loads(response.body)
html = resp_dict.get('d').get('Result').get('html')
sel = Selector(text=html)
listings = sel.xpath("//div[@class='property-thumbnail-item thumbnailItem col-12 col-sm-6 col-md-4 col-lg-3']")
for listing in listings:
print("not yet implemented")
Обновлено: я очищаю API, а не сам веб-сайт.
«Я парсинг API, а не самого сайта». Тогда это не совсем царапание, не так ли?
Дальнейшие исследования показывают, что большая часть контента доступна только на французском языке.
Язык ответа, похоже, не основан на заголовке Accept-Language
, и я сомневаюсь, что они оценивают реферер, чтобы определить это. Скорее всего, выбранный язык будет храниться в сессии здесь, я полагаю.
Выбранный язык сохраняется в сеансе на сервере, вам необходимо отправить текущий файл cookie, чтобы получить данные выбранного языка.
Вам нужно реорганизовать поток:
Прежде всего вызовите centris.ca/en?uc=0, чтобы установить текущий языковой стандарт EN, затем сохраните файл cookie в ответ на локальный стандарт.
Затем отправьте сохраненный файл cookie в вызове: https://www.centris.ca/property/UpdateQuery , https://www.centris.ca/Property/GetInscriptions
Спасибо, не знал о хранении сеансов.
Если зайти на сайт и выбрать английский язык, я получу URL-адреса типа centris.ca/en?uc=1