Le scraping de Reddit offre une mine d'informations sur les sujets en vogue, l'engagement de la communauté et les messages les plus populaires. Bien que l'API officielle de Reddit soit un outil courant pour accéder à ce type de contenu, elle présente des limites que le scraping peut surmonter en offrant une plus grande flexibilité dans la sélection des données. Ce tutoriel vous guidera dans l'utilisation de la bibliothèque asynchrone Playwright pour gérer le contenu dynamique et de la bibliothèque lxml pour extraire les données, ce qui permet une approche complète du scraping de Reddit.
Avant de commencer, assurez-vous d'avoir installé Python et les bibliothèques nécessaires :
pip install playwright
pip install lxml
Après avoir installé les bibliothèques nécessaires, vous devrez installer les binaires du navigateur Playwright :
playwright install
Pour installer le navigateur Chrome, utilisez la commande suivante :
Playwright install chromium
Ces outils nous aideront à interagir avec le contenu dynamique de Reddit, à analyser le code HTML et à extraire les données nécessaires.
Playwright est un outil puissant qui nous permet de contrôler un navigateur et d'interagir avec des pages web comme le ferait un utilisateur humain. Nous allons l'utiliser pour charger la page Reddit et obtenir le contenu HTML.
Voici le code asynchrone Playwright pour charger la page Reddit :
import asyncio
from playwright.async_api import async_playwright
async def fetch_page_content():
async with async_playwright() as playwright:
browser = await playwright.chromium.launch(headless=False)
context = await browser.new_context()
page = await context.new_page()
await page.goto("https://www.reddit.com/r/technology/top/?t=week")
page_content = await page.content()
await browser.close()
return page_content
# Récupérer le contenu de la page
page_content = asyncio.run(fetch_page_content())
Lorsque vous faites du scraping, vous pouvez rencontrer des problèmes tels que la limitation du débit ou le blocage de l'IP. Pour y remédier, vous pouvez utiliser des proxys pour changer d'adresse IP et des en-têtes personnalisés pour imiter le comportement d'un utilisateur réel.
Lors du scraping, vous pouvez rencontrer des problèmes tels que la limitation du débit ou le blocage de l'IP. Pour y remédier, vous pouvez utiliser des proxys pour faire pivoter votre adresse IP et des en-têtes personnalisés pour imiter le comportement d'un utilisateur réel. Les proxys peuvent être utilisés pour changer d'adresse IP et éviter d'être détectés. Votre fournisseur de services peut s'en charger en s'assurant qu'il gère un pool d'adresses IP et qu'il les modifie en fonction des besoins.
async def fetch_page_content_with_proxy():
async with async_playwright() as playwright:
browser = await playwright.chromium.launch(headless=True, proxy={
"server": "http://proxy-server:port",
"username": "your-username",
"password": "your-password"
})
context = await browser.new_context()
page = await context.new_page()
await page.goto("https://www.reddit.com/r/technology/top/?t=week", wait_until='networkidle')
page_content = await page.content()
await browser.close()
return page_content
Une fois que nous avons le contenu HTML, l'étape suivante consiste à l'analyser et à extraire les données pertinentes à l'aide de lxml.
from lxml import html
# Analyse du contenu HTML
parser = html.fromstring(page_content)
Les principaux articles publiés sur le sous-reddit r/technology de Reddit sont contenus dans des éléments d'article. Ces éléments peuvent être ciblés à l'aide de la méthode XPath suivante :
# Extraire des éléments individuels du message
elements = parser.xpath('//article[@class="w-full m-0"]')
XPath est un outil robuste permettant de naviguer et de sélectionner des nœuds dans un document HTML. Nous allons l'utiliser pour extraire le titre, le lien et la balise de chaque article.
Voici les XPaths spécifiques pour chaque point de données :
Title: @aria-label
Link: .//div[@class="relative truncate text-12 xs:text-14 font-semibold mb-xs "]/a/@href
Tag: .//span[@class="bg-tone-4 inline-block truncate max-w-full text-12 font-normal align-text-bottom text-secondary box-border px-[6px] rounded-[20px] leading-4 relative top-[-0.25rem] xs:top-[-2px] my-2xs xs:mb-sm py-0 "]/div/text()
Maintenant que nous avons ciblé les éléments, nous pouvons itérer sur chaque message et extraire les données requises.
posts_data = []
# Itérer sur chaque élément de l'article
for element in elements:
title = element.xpath('@aria-label')[0]
link = element.xpath('.//div[@class="relative truncate text-12 xs:text-14 font-semibold mb-xs "]/a/@href')[0]
tag = element.xpath('.//span[@class="bg-tone-4 inline-block truncate max-w-full text-12 font-normal align-text-bottom text-secondary box-border px-[6px] rounded-[20px] leading-4 relative top-[-0.25rem] xs:top-[-2px] my-2xs xs:mb-sm py-0 "]/div/text()')[0].strip()
post_info = {
"title": title,
"link": link,
"tag": tag
}
posts_data.append(post_info)
Après avoir extrait les données, nous devons les enregistrer dans un format structuré. JSON est un format largement utilisé à cette fin.
import json
# Enregistrer les données dans un fichier JSON
with open('reddit_posts.json', 'w') as f:
json.dump(posts_data, f, indent=4)
print("Data extraction complete. Saved to reddit_posts.json")
Voici le code complet pour récupérer les meilleurs articles de Reddit à partir de r/technology et enregistrer les données au format JSON :
import asyncio
from playwright.async_api import async_playwright
from lxml import html
import json
async def fetch_page_content():
async with async_playwright() as playwright:
browser = await playwright.chromium.launch(headless=True, proxy={
"server": "IP:port",
"username": "your-username",
"password": "your-password"
})
context = await browser.new_context()
page = await context.new_page()
await page.goto("https://www.reddit.com/r/technology/top/?t=week", wait_until='networkidle')
page_content = await page.content()
await browser.close()
return page_content
# Récupérer le contenu de la page
page_content = asyncio.run(fetch_page_content())
# Analyse du contenu HTML à l'aide de lxml
parser = html.fromstring(page_content)
# Extraire des éléments individuels du message
elements = parser.xpath('//article[@class="w-full m-0"]')
# Initialisation d'une liste contenant les données extraites
posts_data = []
# Itérer sur chaque élément de l'article
for element in elements:
title = element.xpath('@aria-label')[0]
link = element.xpath('.//div[@class="relative truncate text-12 xs:text-14 font-semibold mb-xs "]/a/@href')[0]
tag = element.xpath('.//span[@class="bg-tone-4 inline-block truncate max-w-full text-12 font-normal align-text-bottom text-secondary box-border px-[6px] rounded-[20px] leading-4 relative top-[-0.25rem] xs:top-[-2px] my-2xs xs:mb-sm py-0 "]/div/text()')[0].strip()
post_info = {
"title": title,
"link": link,
"tag": tag
}
posts_data.append(post_info)
# Enregistrer les données dans un fichier JSON
with open('reddit_posts.json', 'w') as f:
json.dump(posts_data, f, indent=4)
print("Data extraction complete. Saved to reddit_posts.json")
Cette méthode permet de faire du scraping à travers différents subreddits, en recueillant des informations pertinentes à partir des discussions riches au sein des communautés Reddit. Il est important d'utiliser des proxys rotatifs pour minimiser le risque de détection par Reddit. L'utilisation de proxys dynamiques mobiles et résidentiels, qui possèdent le facteur de confiance le plus élevé en ligne, garantit que les données peuvent être collectées sans déclencher de captchas ou de blocages, facilitant ainsi une expérience de scraping plus fluide.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.ru!
Commentaires: 0