在现代互联网时代,许多网站采用动态加载技术,使得传统的静态网页爬取方法不再有效。本教程将向您介绍如何使用Python和Pyppeteer库来爬取动态网页数据。我们将通过一个实际的示例来演示这一过程,以便您能够掌握这一有用的技能。
准备工作
在开始之前,请确保您已经安装了Python,并按照以下步骤进行准备工作:
-
安装Python库:我们将使用
pyppeteer
库来模拟浏览器操作。您可以使用以下命令来安装它:pip install pyppeteer
-
确保您了解一些基本的Python编程知识,包括异步编程和基本的Web爬取概念。
创建爬虫程序
下面是一个示例爬虫程序,用于爬取动态加载的网页数据。这个示例程序将从一个网站中获取数据,并演示了如何模拟浏览器操作。
import asyncio
from pyppeteer import launch
from collections import namedtuple
def screen_size():
"""使用tkinter获取屏幕大小"""
import tkinter
tk = tkinter.Tk()
width = tk.winfo_screenwidth()
height = tk.winfo_screenheight()
tk.quit()
return width, height
async def main():
browser = await launch({'headless': False, 'args': ['--no-sandbox'], })
page = await browser.newPage()
width, height = screen_size()
await page.setViewport(viewport={"width": width, "height": height})
await page.setJavaScriptEnabled(enabled=True)
await page.setUserAgent(
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
'(KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299'
)
await page.evaluate('''() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }) }''')
await page.goto(website.url)
now_page = 0
while True:
now_page += 1
await page.evaluate('window.scrollBy(0, document.body.scrollHeight)')
await asyncio.sleep(1)
li_list = await page.querySelectorAll(website.list_query)
for li in li_list:
try:
title_obj = await li.querySelector("a ")
title_url = await page.evaluate('(element) => element.href', title_obj)
title_name = await page.evaluate('(element) => element.textContent', title_obj)
date_obj = await li.querySelector(website.title_date_query)
title_date = await page.evaluate('(element) => element.textContent', date_obj)
detail_page = await browser.newPage()
await detail_page.goto(url=str(title_url))
await detail_page.content()
element = await detail_page.querySelector(website.content_query)
content_html = await detail_page.evaluate('(element) => element.outerHTML', element)
print(title_url, title_name, title_date, len(content_html))
await detail_page.close()
except Exception as e:
print(e)
print(f"第{now_page}页访问>>>>>")
next_page_link = website.next_page_query
if next_page_link:
await page.click(next_page_link)
else:
raise Exception("已完成爬取,即将退出...")
await asyncio.sleep(2)
async def page_close(browser):
for _page in await browser.pages():
await _page.close()
await browser.close()
if __name__ == '__main__':
Websites = namedtuple('websites', ['url', 'list_query', 'title_date_query', 'content_query', 'next_page_query'])
websites = [
(
'http://www.cqzbtb.cn/_jiaoyixinxi/',
'.listbox ul',
'.ys',
'.article-wrap',
"body > section > div > div.list-wrap.row > div.listpa > ul > li:nth-child(7)"
),
]
for i in websites:
website = Websites._make(i)
a = main()
loop = asyncio.get_event_loop()
results = loop.run_until_complete(asyncio.gather(a))
这段代码使用Pyppeteer库创建了一个浏览器实例,然后模拟了许多浏览器操作,包括访问网页、滚动页面、点击下一页等。它还演示了如何从网页中提取数据,并处理了异常情况。
结论
通过本教程,您学会了如何使用Python和Pyppeteer库来爬取动态加载的网页数据。这对于需要获取动态生成内容的网站非常有用。请注意,在进行网页爬取时,务必遵守网站的使用政策和法律法规。