Я пытаюсь очистить Интернет от веб-сайтов с предложениями вакансий для моего проекта 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}")
Меньшее, что я могу сказать: сделайте свой веб-скребок похожим на человека. Запрашивайте страницы с человеческой скоростью, используйте Wireshark для анализа того, что вы отправляете на указанный веб-сайт при использовании навигатора (как человека), и посмотрите, как это выглядит по сравнению с вашим скрапером... Я не буду вдаваться в подробности.
Вы сгенерировали рассматриваемый код с помощью ИИ?
Они предоставляют вам данные в формате RSS/XML — https://weworkremotely.com/remote-job-rss-feed
Вам не нужно парсить HTML, просто откройте RSS-каналы и переварите данные оттуда. Убедитесь, что вы контролируете, как часто вы заходите на этот сервер, похоже, быстрая последовательность приведет к тому, что вас заблокируют; так что просматривайте эти каналы 3–5 раз в день, и все будет в порядке.
Мой проект Coursera явно просит меня выполнить веб-очистку веб-сайта с использованием библиотек Python, таких как BeautifulSoup. Спасибо за ваш ответ, хотя я обязательно проверю RSS-каналы, так как понятия не имел, что что-то подобное существует.
Чтобы устранить ошибку 403 Forbidden при парсинге веб-страниц:
Используйте действительный пользовательский агент: установите общий заголовок пользовательского агента, чтобы имитировать браузер.
Используйте прокси: меняйте IP-адреса с помощью прокси, чтобы избежать блокировки IP.
Уважайте robots.txt: проверяйте и соблюдайте правила очистки веб-сайта.
Добавьте задержки: введите задержки между запросами, чтобы имитировать поведение человека.
Обработка 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)
Людям не нравится, когда их удаляют из сети, особенно если они настраивают платный веб-API, чтобы получать деньги за предоставление вам своих услуг. Ошибка HTTP 403 означает, что сервер понял ваш запрос, но отказался его выполнить. Я не уверен, стоит ли нам помочь вам по этому запросу.