百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

[Python数据采集]Playwright爬虫数据采集代码!!值得深入学习

off999 2024-12-16 15:20 27 浏览 0 评论

【Playwright爬虫数据采集代码示例!!值得深入学习代码】

为了提高反爬虫的稳定性,代理池和模拟真实用户行为是常见的优化手段。以下我将给出代理池的实现方式,并结合模拟真实用户行为的代码示例。

1.代理池实现:

通过代理池,可以定期切换IP,避免因同一个IP频繁请求而被封锁。代理池可以是你自己搭建的代理列表,也可以使用第三方的付费代理服务。这里通过 asyncio 实现代理池轮换,并在每次请求时使用不同的代理IP。

2.模拟真实用户行为:

模拟真实用户操作,包括:

  • 更换 User-Agent:每次请求时使用不同的 User-Agent 来模拟不同设备和浏览器。
  • 设置浏览器的 viewport:设置不同的浏览器视口大小,避免所有请求都是相同的屏幕尺寸。
  • 使用 headless=False:使用可见浏览器,以模仿真实用户的行为(在某些情况下依然启用无头模式)。

代码实现:

import asyncio
import random
from playwright.async_api import async_playwright
import aiohttp
 
# 代理池 (可自定义添加更多代理)
proxy_pool = [
    'http://proxy1.example.com:8080',
    'http://proxy2.example.com:8080',
    'http://proxy3.example.com:8080'
]
 
# 随机选择代理
def get_random_proxy():
    return random.choice(proxy_pool)
 
# User-Agent 列表 (模拟不同的设备/浏览器)
user_agents = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 13_6_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.2 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (Linux; Android 10; SM-G975F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Mobile Safari/537.36'
]
 
# 随机选择 User-Agent
def get_random_user_agent():
    return random.choice(user_agents)
 
# 模拟用户行为:随机滚动页面,点击某些元素
async def simulate_human_behavior(page):
    await asyncio.sleep(random.uniform(1, 3))  # 模拟随机的延迟
    await page.mouse.wheel(0, random.randint(300, 1000))  # 模拟滚动
    await asyncio.sleep(random.uniform(1, 2))  # 再次延迟
    # 可以添加其他的操作,例如点击某个随机元素
 
# 异步下载图片
async def download_image(image_url, reg_number):
    if image_url:
        img_name = f"{reg_number}.jpg"
        async with aiohttp.ClientSession() as session:
            async with session.get(image_url) as response:
                if response.status == 200:
                    content = await response.read()
                    with open(f'images/{img_name}', 'wb') as f:
                        f.write(content)
 
# 异步抓取图片 URL
async def fetch_image_url(browser, reg_number, proxy=None):
    #示例网址
    url = f'https://example.com/channel/search#/search?q={{"keyword":"{reg_number}"}}'
    
    # 启动浏览器页面并配置代理和 User-Agent
    context = await browser.new_context(
        viewport={"width": random.randint(1024, 1920), "height": random.randint(768, 1080)},
        user_agent=get_random_user_agent()
    )
 
    if proxy:
        context = await browser.new_context(
            proxy={"server": proxy},
            user_agent=get_random_user_agent(),
            viewport={"width": random.randint(1024, 1920), "height": random.randint(768, 1080)}
        )
 
    page = await context.new_page()
 
    try:
        # 模拟用户行为
        await page.goto(url)
        await simulate_human_behavior(page)
 
        # 执行搜索操作
        await page.click("//button[text()='搜索']")
        
        # 等待图片加载完成
        await page.wait_for_selector('div.trademark-img-big img', timeout=60000)
        image_url = await page.locator('div.trademark-img-big img').get_attribute('src')
 
        return image_url
    except Exception as e:
        print(f"Error fetching image for {reg_number}: {e}")
        return None
    finally:
        await page.close()
 
# 主函数
async def main():
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=False)  # 模拟真实用户行为,使用非无头模式
        registration_numbers = ["123456789", "987654321", "456789123"]  # 示例注册号
        
        tasks = []
        for reg_number in registration_numbers:
            proxy = get_random_proxy()  # 从代理池中随机获取代理
            task = fetch_image_url(browser, reg_number, proxy=proxy)
            tasks.append(task)
 
        # 执行所有任务并收集结果
        results = await asyncio.gather(*tasks)
 
        for reg_number, image_url in zip(registration_numbers, results):
            if image_url:
                await download_image(image_url, reg_number)
 
        await browser.close()
 
if __name__ == "__main__":
    asyncio.run(main())
asyncio.run(main())

关键点解释:

  1. 代理池 proxy_pool:通过 get_random_proxy() 随机选择代理。此代理池可以包含多个代理服务器的地址,确保每次请求时使用不同的IP地址,减少反爬的风险。
  2. 随机 User-Agent:通过 get_random_user_agent() 函数,随机选择不同的 User-Agent,模拟不同的设备和浏览器请求,避免所有请求都来自同一个浏览器和设备标识。
  3. 页面模拟真实用户行为:simulate_human_behavior(page) 模拟了用户滚动页面、延迟等行为,使爬虫行为更像真实用户。可以根据需求进一步扩展,加入点击、输入等行为。
  4. 异步图片下载:在 download_image() 函数中,通过 aiohttp 异步下载图片到本地。
  5. 代理设置:在创建浏览器上下文时(browser.new_context()),通过 proxy={"server": proxy} 设置代理服务器。每个上下文使用不同的代理和 User-Agent,模拟多样化的请求来源。
  6. 浏览器视口大小:使用随机的浏览器窗口大小(viewport),增加请求的多样性。

代理池改进建议:

  • 可以通过第三方代理提供商(如 Bright Data、Oxylabs、SmartProxy)获取大量高匿名代理,保证 IP 地址质量和访问速度。
  • 代理池的管理可以进一步优化,例如动态添加和移除不可用的代理,或者使用带有验证的代理(带用户名和密码的代理)。

模拟行为改进建议:

  • 增加更多的用户操作,如随机点击页面中的链接、模拟表单输入等。
  • 利用 Playwright 的 mouse 和 keyboard 功能模拟更多人类行为,如键盘输入。

相关推荐

windows系统下载手机(win10下载手机)

OPPO手机重新下载安装系统:先备份好重要数据!然后手机连接电脑把下载的固件存入手机。然后再长按电源键十秒钟进入关机状态(可拆卸电板的需取下电板然后重新安装)。再同时按住电源键跟音量减键,进入reco...

电脑系统分区怎么分(电脑系统分区怎么分区)

分区是将硬盘分割成不同的逻辑部分,每个分区可以被视为一个独立的存储设备。通过分区,可以更好地管理数据和操作系统。要进行电脑分区,可以按照以下步骤进行:1.确定分区方案:首先需要确定分区的目的和需求。...

电脑显卡怎么选择(电脑显卡怎样选择)

以下是一些通用的方法:1.在硬件层面进行配置:首先需要确认您的主板和操作系统是否支持多GPU并行,以及您的电源是否提供足够的功率支持。在BIOS中启用多GPU选项,并安装正确的驱动程序。然后,通...

设置软件下载(设置软件下载入口)

iphone13app的下载设置1、首先,打开手机桌面的【设置】。2、在设置界面,点击【面容ID与密码】。3、这时设置了键盘锁的会要求你输入键盘锁密码进入。4、进入之后,找到【iTunesStore...

电脑麦克风插孔是哪个(电脑麦克风插那)

1.蓝色的为音频输入口。一般的电脑后面都有三个音频接口:蓝色是音频输入,绿色是音频输出,粉红色麦克风。  2.音频输入(蓝色),为外接光驱.随身听及其它音频输入设备,即可以把外部的设备声音传送至电脑...

ie浏览器打不开网页怎么修复

第一步:打开“运行”输入—〉cmd—〉回车然后把下面这行字符复制到黑色cmd框里面去回车等待dll文件全部注册完成就关闭可以了(下面是要运行的代码):for%1in(%windir%\syste...

mail163邮箱登录入口网页版(mail163手机邮箱登录)

1.首先你要开启网易的POP3/SMTP/IMAP。2.设置完之后你需要网易的客户端授权密码。3.密码会发送至你的绑定手机。4.用发给你的客户端授权密码登录第三方客户端(ios客户端)5.直接登陆,储...

微信一键恢复(微信一键恢复已删好友怎么操作)
  • 微信一键恢复(微信一键恢复已删好友怎么操作)
  • 微信一键恢复(微信一键恢复已删好友怎么操作)
  • 微信一键恢复(微信一键恢复已删好友怎么操作)
  • 微信一键恢复(微信一键恢复已删好友怎么操作)
win7系统序列号怎么查(win7电脑的序列号怎么查)

你可以在cmd命令行窗口中输入以下相关命令,可以得到你要的信息查找主板厂商输入:wmicBaseBoardgetManufacturer查找主板型号输入:wmicBaseBoardgetP...

台式电脑怎么看配置好坏(台式机怎么看配置参数哪里看好坏)

如何分辨电脑配置好坏第一看CPU,CPU从上到下可分为i7,i5,i3等,数字越高越好。第二看显卡和内存,显卡内存现在至少4G或者8G起步,越高越好,第三看硬盘是否是固态,固态要比机械的运行速度快...

下载软件安装不了(为什么下载软件安装不了)

    一:检查手机内存是否充足,如果内存太小,需要更换大容量的SD卡。  二:检查手机是否设置允许安装除手机自带应用商店以外的应用。  方法一:需要从手机自带应用商店下载。  ①点击手机桌面上的应用...

现在建议更新win11吗(应该升级win11吗)

鲁大师更新11靠谱的,他只是给你提供一个方便的升级渠道而已。升级以后能否正常使用,还要看你原来的系统是否是正版。如果原来的系统是正版,升级完成后,可以正常使用。如果原来的系统是盗版,也是可以升级的,只...

windows7旗舰版好用吗(win7旗舰版好用么)

win7旗舰版挺好使的不过现在可以选择更win10。Windows7旗舰版属于微软公司开发的Windows7操作系统系统系列中的功能最高级的版本,也被叫做终结版本,是为了取代WindowsXP...

2025年最好用的手机浏览器(2021最好的手机浏览器)

可以使用uc浏览器或者是QQ浏览器,最新版本都是带有Flash插件的,火狐浏览器手机版也是一开始拥有Flash插件。以下是详细介绍:  1、uc浏览器是阿里旗下的浏览器,只需要下载最新版,然后进去就可...

电脑一键还原系统在哪里(电脑一键还原系统怎么用)
  • 电脑一键还原系统在哪里(电脑一键还原系统怎么用)
  • 电脑一键还原系统在哪里(电脑一键还原系统怎么用)
  • 电脑一键还原系统在哪里(电脑一键还原系统怎么用)
  • 电脑一键还原系统在哪里(电脑一键还原系统怎么用)

取消回复欢迎 发表评论: