Embassy是基于aiohttp的异步库,适合处理普通的HTTP请求,而Puppeteer是控制Headless Chrome的,适合需要处理JavaScript渲染的页面。用户可能遇到了需要抓取动态生成内容的情况,或者之前的Embassy示例无法获取到完整的数据,所以转向Puppeteer。
以下是一个使用 Pyppeteer (Python 版本的 Puppeteer) 编写的网络爬虫示例,用于处理需要 JavaScript 渲染的页面:
pip install pyppeteer
import asyncio
from urllib.parse import urljoin
from pyppeteer import launch
from pyppeteer.errors import TimeoutError
class PuppeteerCrawler:
def __init__(self, headless=True, timeout=30):
self.headless = headless # 是否无头模式
self.timeout = timeout # 页面加载超时时间
self.browser = None # 浏览器实例
self.visited = set() # 已访问的URL
async def init_browser(self):
"""启动浏览器实例"""
self.browser = await launch(
headless=self.headless,
args=['--no-sandbox', '--disable-setuid-sandbox']
)
async def crawl(self, start_url):
"""启动爬虫"""
if not self.browser:
await self.init_browser()
page = await self.browser.newPage()
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36')
try:
await self.process_page(page, start_url)
finally:
await page.close()
await self.browser.close()
async def process_page(self, page, url):
"""处理单个页面"""
if url in self.visited:
return
self.visited.add(url)
try:
# 导航到页面
await page.goto(url, {'timeout': self.timeout * 1000})
await page.waitForSelector('body', timeout=self.timeout*1000) # 等待页面加载
# 获取页面内容
content = await page.content()
# 示例:提取标题
title = await page.title()
print(f'Scraped: {url}')
print(f'Title: {title}')
# 提取链接
links = await self.extract_links(page, url)
for link in links:
if link not in self.visited:
new_page = await self.browser.newPage()
await self.process_page(new_page, link)
await new_page.close()
except TimeoutError:
print(f'Timeout loading {url}')
except Exception as e:
print(f'Error processing {url}: {str(e)}')
async def extract_links(self, page, base_url):
"""提取页面中的链接"""
return await page.evaluate('''(base_url) => {
return Array.from(document.querySelectorAll('a'))
.map(a => new URL(a.href, base_url).href)
.filter(href => href.startsWith('http'));
}''', base_url)
async def main():
crawler = PuppeteerCrawler(headless=True) # headless=False 可以显示浏览器
await crawler.crawl('https://example.com')
if __name__ == '__main__':
asyncio.run(main())
pyppeteer
控制 Chromium 浏览器waitForSelector
)await page.screenshot({'path': 'screenshot.png', 'fullPage': True})
dimensions = await page.evaluate('''() => {
return {
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight
}
}''')
page.on('dialog', lambda dialog: dialog.dismiss())
await page.authenticate({
'username': 'proxy_user',
'password': 'proxy_pass'
})
browser.newPage()
而不是频繁启动)await asyncio.sleep(random.uniform(1, 3))
)await page.close()
)如果需要处理更复杂的场景(如登录验证、验证码识别),可以结合其他库(如 python-anticaptcha
)使用。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有