在当今信息爆炸的互联网时代,获取数据变得越来越重要,而网络爬虫成为了一种常见的数据获取工具。然而,随着各大网站加强反爬虫技术,爬虫程序面临着越来越多的挑战。本文将以爬取百度搜索结果为例,介绍如何使用Selenium结合一系列策略来突破目标网站的反爬虫机制。
百度作为中国最大的搜索引擎之一,拥有庞大的用户群体和海量的搜索数据。为了保护用户隐私和数据安全,百度实施了一系列反爬虫机制,包括但不限于:
针对这些反爬虫机制,我们需要采取相应的策略来规避识别和防止被拦截。
在使用Selenium进行网页自动化时,我们可以设置请求头中的User-Agent字段,模拟不同类型的浏览器行为。这样可以降低被识别为爬虫的概率。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import random
# 随机选择一个User-Agent
user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36",
# 更多User-Agent...
]
options = Options()
options.add_argument(f"user-agent={random.choice(user_agents)}")
driver = webdriver.Chrome(options=options)
通过使用代理IP,我们可以避免频繁请求来自相同IP地址的搜索结果,降低被封锁的风险。
from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy, ProxyType
proxyHost = "xxxx"
proxyPort = "5445"
proxyUser = "1xxxxxx"
proxyPass = "280651"
proxy = Proxy()
proxy.proxy_type = ProxyType.MANUAL
proxy.http_proxy = f"{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}" # 代理IP地址和端口
proxy.ssl_proxy = f"{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}"
capabilities = webdriver.DesiredCapabilities.CHROME
proxy.add_to_capabilities(capabilities)
driver = webdriver.Chrome(desired_capabilities=capabilities)
模拟人类的搜索行为,通过随机化请求间隔来避免被识别为爬虫。
import time
# 随机等待一段时间
time.sleep(random.uniform(1, 3))
如果遇到验证码,我们可以通过手动输入验证码或者使用第三方验证码识别服务来解决。
# 等待用户手动输入验证码
captcha = input("请输入验证码:")
# 将验证码填入相应的输入框
driver.find_element_by_id("captcha-input").send_keys(captcha)
下面是一个简单的示例,演示如何使用Selenium突破百度搜索的反爬虫机制,获取搜索结果:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Chrome()
# 打开百度搜索页面
driver.get("https://www.baidu.com")
# 定位搜索输入框,并输入关键词
search_box = driver.find_element_by_id("kw")
search_box.send_keys("Python爬虫")
# 模拟键盘按下回车键
search_box.send_keys(Keys.RETURN)
# 等待搜索结果加载
time.sleep(3)
# 打印搜索结果
results = driver.find_elements_by_css_selector(".t")
for result in results:
print(result.text)
# 关闭浏览器
driver.quit()
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。