Scraping Reddit cung cấp nhiều thông tin về các chủ đề xu hướng, sự tham gia của cộng đồng và các bài viết phổ biến. Mặc dù API chính thức của Reddit là một công cụ phổ biến để truy cập vào nội dung đó, nhưng nó có những hạn chế mà việc cạo có thể khắc phục bằng cách cung cấp tính linh hoạt hơn trong lựa chọn dữ liệu. Hướng dẫn này sẽ hướng dẫn bạn sử dụng thư viện nhà viết kịch không đồng bộ để quản lý nội dung động và thư viện LXML để trích xuất dữ liệu, cho phép cách tiếp cận toàn diện để cạo Reddit.
Trước khi bắt đầu, hãy đảm bảo bạn đã cài đặt Python và các thư viện cần thiết:
pip install playwright
pip install lxml
Sau khi cài đặt các thư viện cần thiết, bạn sẽ cần cài đặt các nhị phân trình nhà viết kịch:
playwright install
Chỉ để cài đặt trình duyệt Chromium, hãy sử dụng lệnh sau:
Playwright install chromium
Các công cụ này sẽ giúp chúng tôi tương tác với nội dung động của Reddit, phân tích HTML và trích xuất dữ liệu cần thiết.
Nhà viết kịch là một công cụ mạnh mẽ cho phép chúng tôi điều khiển trình duyệt và tương tác với các trang web như một người dùng con người. Chúng tôi sẽ sử dụng nó để tải trang Reddit và có được nội dung HTML.
Đây là mã Async của nhà viết kịch để tải trang 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
# Tìm nạp nội dung trang
page_content = asyncio.run(fetch_page_content())
Khi cạo, bạn có thể gặp các vấn đề như giới hạn tỷ lệ hoặc chặn IP. Để giảm thiểu những điều này, bạn có thể sử dụng proxy để xoay địa chỉ IP và tiêu đề tùy chỉnh của mình để bắt chước hành vi của người dùng thực.
Khi cạo, bạn có thể gặp các vấn đề như giới hạn tỷ lệ hoặc chặn IP. Để giảm thiểu những điều này, bạn có thể sử dụng proxy để xoay địa chỉ IP và tiêu đề tùy chỉnh của mình để bắt chước hành vi của người dùng thực. Proxy có thể được sử dụng để xoay địa chỉ IP và tránh phát hiện. Điều này có thể được xử lý bởi nhà cung cấp dịch vụ của bạn, đảm bảo rằng họ quản lý một nhóm IPS và xoay chúng khi cần thiết.
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
Khi chúng ta có nội dung HTML, bước tiếp theo là phân tích nó và trích xuất dữ liệu liên quan bằng LXML.
from lxml import html
# Phân tích nội dung HTML
parser = html.fromstring(page_content)
Các bài viết hàng đầu về subreddit công nghệ Reddit Reddit được chứa trong các yếu tố bài viết. Các yếu tố này có thể được nhắm mục tiêu bằng cách sử dụng XPath sau:
# Trích xuất các yếu tố bài viết riêng lẻ
elements = parser.xpath('//article[@class="w-full m-0"]')
XPath là một công cụ mạnh mẽ để điều hướng và chọn các nút từ tài liệu HTML. Chúng tôi sẽ sử dụng nó để trích xuất tiêu đề, liên kết và thẻ từ mỗi bài đăng.
Dưới đây là các XPath cụ thể cho từng điểm dữ liệu:
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()
Bây giờ chúng tôi đã nhắm mục tiêu các yếu tố, chúng tôi có thể lặp lại từng bài và trích xuất dữ liệu cần thiết.
posts_data = []
# Lặp lại trên mỗi phần tử bài
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)
Sau khi trích xuất dữ liệu, chúng ta cần lưu nó theo định dạng có cấu trúc. JSON là một định dạng được sử dụng rộng rãi cho mục đích này.
import json
# Lưu dữ liệu vào tệp 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")
Dưới đây là mã hoàn chỉnh để loại bỏ các bài đăng hàng đầu của Reddit từ R/Technology và lưu dữ liệu dưới dạng 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
# Tìm nạp nội dung trang
page_content = asyncio.run(fetch_page_content())
# Phân tích nội dung HTML bằng LXML
parser = html.fromstring(page_content)
# Trích xuất các yếu tố bài viết riêng lẻ
elements = parser.xpath('//article[@class="w-full m-0"]')
# Khởi tạo một danh sách để giữ dữ liệu được trích xuất
posts_data = []
# Lặp lại trên mỗi phần tử bài
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)
# Lưu dữ liệu vào tệp 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")
Phương pháp này cho phép quét qua các subreddit khác nhau, thu thập thông tin sâu sắc từ các cuộc thảo luận phong phú trong các cộng đồng Reddit. Điều quan trọng là sử dụng các proxy quay để giảm thiểu rủi ro phát hiện của Reddit. Sử dụng các proxy động di động và dân cư, sở hữu yếu tố tin cậy cao nhất trực tuyến, đảm bảo dữ liệu có thể được thu thập mà không kích hoạt captchas hoặc khối, do đó tạo điều kiện cho trải nghiệm cạo mượt mà hơn.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Bình luận: 0