[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())关键点解释:
- 代理池 proxy_pool:通过 get_random_proxy() 随机选择代理。此代理池可以包含多个代理服务器的地址,确保每次请求时使用不同的IP地址,减少反爬的风险。
- 随机 User-Agent:通过 get_random_user_agent() 函数,随机选择不同的 User-Agent,模拟不同的设备和浏览器请求,避免所有请求都来自同一个浏览器和设备标识。
- 页面模拟真实用户行为:simulate_human_behavior(page) 模拟了用户滚动页面、延迟等行为,使爬虫行为更像真实用户。可以根据需求进一步扩展,加入点击、输入等行为。
- 异步图片下载:在 download_image() 函数中,通过 aiohttp 异步下载图片到本地。
- 代理设置:在创建浏览器上下文时(browser.new_context()),通过 proxy={"server": proxy} 设置代理服务器。每个上下文使用不同的代理和 User-Agent,模拟多样化的请求来源。
- 浏览器视口大小:使用随机的浏览器窗口大小(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浏览器是阿里旗下的浏览器,只需要下载最新版,然后进去就可...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
失业程序员复习python笔记——条件与循环
-
系统u盘安装(win11系统u盘安装)
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
