Ошибка 403 при попытке очистить сайты вакансий с помощью Python

Я пытаюсь очистить Интернет от веб-сайтов с предложениями вакансий для моего проекта Coursera. Я продолжаю получать ошибку 403, и после того, как я поискал ее значение в Интернете, я обнаружил, что это означает, что веб-сайт имеет защиту от веб-скрейпинга. Есть ли у кого-нибудь какие-либо меры противодействия этому?

PS: Я действительно пробовал парсинг веб-сайтов, и мы работали удаленно с веб-сайтами с той же ошибкой после выполнения моего кода. Вот мой код:

import requests
from bs4 import BeautifulSoup
import pandas as pd

url = 'https://weworkremotely.com/remote-jobs'

# We Work Remotely website blocks traffic from non-browsers, so we add extra parameters
headers = {
    'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0'
}

# Send a request to the website and get the HTML content
response = requests.get(url, headers=headers)

# Check if the request was successful
if response.status_code == 200:
    soup = BeautifulSoup(response.content, 'html.parser')

    # Creating empty lists to store the data
    job_titles = []
    companies = []
    locations = []
    job_links = []

    job_sections = soup.find_all('section', class_='jobs')

    for section in job_sections:
        jobs = section.find_all('li', class_='feature')  # Ensure this class matches the site's HTML

        for job in jobs:
            # Job title
            title_tag = job.find('span', class_='title')
            title = title_tag.text.strip() if title_tag else 'N/A'
            job_titles.append(title)

            # Company name
            company_tag = job.find('span', class_='company')
            company = company_tag.text.strip() if company_tag else 'N/A'
            companies.append(company)

            # Location
            location_tag = job.find('span', class_='region company')
            location = location_tag.text.strip() if location_tag else 'Remote'
            locations.append(location)

            # Job link
            job_link_tag = job.find('a', href=True)
            job_link = 'https://weworkremotely.com' + job_link_tag['href'] if job_link_tag else 'N/A'
            job_links.append(job_link)

    # Create a DataFrame using the extracted data
    job_data = pd.DataFrame({
        'Job Title': job_titles,
        'Company': companies,
        'Location': locations,
        'Job Link': job_links
    })

    # Save the data to a CSV file
    job_data.to_csv('we_work_remotely_jobs.csv', index=False)
    print("Job listings have been successfully saved to we_work_remotely_jobs.csv")
else:
    print(f"Failed to retrieve the webpage. Status code: {response.status_code}")

Людям не нравится, когда их удаляют из сети, особенно если они настраивают платный веб-API, чтобы получать деньги за предоставление вам своих услуг. Ошибка HTTP 403 означает, что сервер понял ваш запрос, но отказался его выполнить. Я не уверен, стоит ли нам помочь вам по этому запросу.

Florian Fasmeyer 28.08.2024 14:06

Меньшее, что я могу сказать: сделайте свой веб-скребок похожим на человека. Запрашивайте страницы с человеческой скоростью, используйте Wireshark для анализа того, что вы отправляете на указанный веб-сайт при использовании навигатора (как человека), и посмотрите, как это выглядит по сравнению с вашим скрапером... Я не буду вдаваться в подробности.

Florian Fasmeyer 28.08.2024 14:09

Вы сгенерировали рассматриваемый код с помощью ИИ?

Barry the Platipus 28.08.2024 15:15
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
50
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Они предоставляют вам данные в формате RSS/XML — https://weworkremotely.com/remote-job-rss-feed

Вам не нужно парсить HTML, просто откройте RSS-каналы и переварите данные оттуда. Убедитесь, что вы контролируете, как часто вы заходите на этот сервер, похоже, быстрая последовательность приведет к тому, что вас заблокируют; так что просматривайте эти каналы 3–5 раз в день, и все будет в порядке.

Мой проект Coursera явно просит меня выполнить веб-очистку веб-сайта с использованием библиотек Python, таких как BeautifulSoup. Спасибо за ваш ответ, хотя я обязательно проверю RSS-каналы, так как понятия не имел, что что-то подобное существует.

RockNRoll 28.08.2024 22:38
Ответ принят как подходящий

Чтобы устранить ошибку 403 Forbidden при парсинге веб-страниц:

  1. Используйте действительный пользовательский агент: установите общий заголовок пользовательского агента, чтобы имитировать браузер.

  2. Используйте прокси: меняйте IP-адреса с помощью прокси, чтобы избежать блокировки IP.

  3. Уважайте robots.txt: проверяйте и соблюдайте правила очистки веб-сайта.

  4. Добавьте задержки: введите задержки между запросами, чтобы имитировать поведение человека.

  5. Обработка JavaScript: используйте такие инструменты, как Selenium, для веб-сайтов с контентом, отображаемым на JavaScript.

Источник: ScrapingBee - Как справиться с запрещенной ошибкой 403 при веб-скрапинге

Веб-сайт использует продукты защиты Cloudflare и может распознавать отпечатки пальцев TLS. Библиотека запросов Python имеет очевидные характеристики отпечатков пальцев TLS, поэтому веб-сайт может обнаружить, что запросы отправляются через библиотеку запросов. Независимо от того, как вы измените User-Agent или IP-адрес, вы не сможете скрыть эту функцию. Curl_cffi — это пакет Python для отправки запросов, которые могут изменить отпечаток TLS. Вот демонстрационный код использования Curl_cffi для отправки запросов.

from curl_cffi import requests

url = "https://weworkremotely.com/remote-jobs"

payload = {}
headers = {
  'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
  'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,ru;q=0.7',
  'cache-control': 'no-cache',
  'pragma': 'no-cache',
  'priority': 'u=0, i',
  'sec-ch-ua': '"Chromium";v = "128", "Not;A=Brand";v = "24", "Google Chrome";v = "128"',
  'sec-ch-ua-mobile': '?0',
  'sec-ch-ua-platform': '"Windows"',
  'sec-fetch-dest': 'document',
  'sec-fetch-mode': 'navigate',
  'sec-fetch-site': 'none',
  'sec-fetch-user': '?1',
  'upgrade-insecure-requests': '1',
  'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)

Другие вопросы по теме