Scrappy python3 error 403(forbidden) при запросе к https://www.autotrader.co.uk/
При попытке распарсить autotrader с использованием фрэйма scrappy столкнулся с ошибкой 403, которую никак не могу побороть - уже и user agent подкинул и погуглил подобные ошибки ..ничего не берёт Ошибка:
2020-07-14 18:08:15 [scrapy.core.engine] INFO: Spider opened
2020-07-14 18:08:15 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2020-07-14 18:08:15 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023
2020-07-14 18:08:15 [scrapy.core.engine] DEBUG: Crawled (403) <GET https://www.autotrader.co.uk/car-search?postcode=ec1a1aa&make=TESLA> (referer: None)
2020-07-14 18:08:15 [scrapy.spidermiddlewares.httperror] INFO: Ignoring response <403 https://www.autotrader.co.uk/car-search?postcode=ec1a1aa&make=TESLA>: HTTP status code is not handled or not allowed
Код:
import scrapy
from scrapy import Request
class Spider(scrapy.Spider):
name = 'spider'
start_urls = [
'https://www.autotrader.co.uk/car-search?postcode=ec1a1aa&make=TESLA'
]
def parse(self, response):
headers = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0',
'Referer': 'https://www.autotrader.co.uk/'}
# smth = response.css('.paginationMini__count::text').getall()
yield Request(self.start_urls, headers=headers)
Ответы (1 шт):
Автор решения: Namerek
→ Ссылка
Честно говоря не знаком со scrapy но через bs4 и requests этот сайт парсится весьма просто Ниже первый этап обработки данной Вами страницы. Собирает блоки описаний (всего 272 шт.) Со всех 25 страниц результата.
from bs4 import BeautifulSoup as Soup
import re
import requests
url = 'https://www.autotrader.co.uk/car-search?sort=relevance&postcode=ec1a1aa&radius=1500&make=TESLA&page=%s'
def scrape_page(page_num: int = 1):
response = requests.get(url % page_num)
pages_qty = 1
page_units_list = []
if response.status_code == 200:
soup = Soup(response.content, 'html.parser')
pages_count_tag = soup.find('li', class_='paginationMini__count')
if pages_count_tag:
pages_qty = max(map(int, re.findall(r'\d+', pages_count_tag.text)))
res = soup.find_all('article', class_='search-listing')
if res:
page_units_list = res
return page_units_list, pages_qty
if __name__ == '__main__':
vehicles, pages = scrape_page()
for page in range(2, pages + 1):
vehicles += scrape_page(page)[0]
В результате получаем список vehicles тэгов содержащих html код вот этих блоков
Вам останется написать функцию обработки для них.