当前位置 : 首页 » 文章分类 :  开发  »  Python-爬虫

Python-爬虫

Python 爬虫相关笔记


Selenium 操作浏览器

Selenium with Python
https://selenium-python.readthedocs.io/index.html

pip install selenium

页面加载策略

pageLoadStrategy 是 Selenium 中用于控制页面加载策略的一个配置项。它决定了 Selenium 在何时认为页面已经加载完成,从而可以继续执行后续的自动化代码。

  • Normal 默认策略,Selenium 会等待页面完全加载完成,包括所有的资源(如图片、样式表等)都加载完毕。
  • Eager Selenium 会在 DOMContentLoaded 事件触发后认为页面已经加载完成,此时页面的 DOM 树已经构建完毕,但可能还有样式表、图片等资源正在加载。
  • None Selenium 不会等待任何页面加载事件,初始 HTML 下载后立即返回控制权给自动化代码。这意味着页面可能还在加载中,但代码已经开始执行。

通过 Option 设置:

from selenium.webdriver.chrome.options import Options as ChromeOptions
from selenium.webdriver.firefox.options import Options as FirefoxOptions

# chrome
options = ChromeOptions()
options.page_load_strategy = 'none'  # none 不等待完整加载,直接继续执行后续代码
driver = webdriver.Chrome(options=options)

# firefox
options = FirefoxOptions()
options.page_load_strategy = 'none'  # none 不等待完整加载,直接继续执行后续代码
driver = webdriver.Firefox(options=options)

或者,通过 capabilities 设置

from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

capabilities = DesiredCapabilities.CHROME
capabilities["pageLoadStrategy"] = "none"  # 不等待完整加载,直接继续执行后续代码
driver = webdriver.Chrome(desired_capabilities=capabilities)
driver.get(url)  # 立即返回,不阻塞

selenium+chrome docker 镜像

https://hub.docker.com/r/selenium/standalone-chrome

docker pull selenium/standalone-chrome
启动镜像:

docker run -d \
--name selenium-chrome \
--network=host \
-e SE_NODE_PORT=8444 \
-e SE_VNC_PORT=8900 \
-e TZ=Asia/Shanghai \
-e LANG=zh_CN.UTF-8 \
-e SE_VNC_NO_PASSWORD=1 \
-e SE_NODE_SESSION_TIMEOUT=180 \
--ulimit nofile=32768:32768 \
--shm-size="2g" \
selenium/standalone-chrome

–shm-size:解决容器内存不足导致的崩溃问题‌
-p 4444:4444:映射容器Selenium服务端口‌

创建远程driver

options = ChromeOptions()
options.add_argument("--headless=new")  # 无界面模式(headless mode)不显示图形用户界面运行浏览器
options.add_argument("--no-sandbox")  # 禁用沙盒模式
options.add_argument("--disable-gpu")
options.add_argument("--remote-allow-origins=*")
options.add_argument("--disable-dev-shm-usage")  # 防止内存不足问题
options.add_argument("--disable-blink-features=AutomationControlled")  # 规避自动化检测
options.add_experimental_option("excludeSwitches", ["enable-automation"])  # 隐藏自动化标志
driver = webdriver.Remote(command_executor=remote_driver_url, options=options) 

爬取的网页是英文

问题:
默认的 selenium/standalone-chrome 镜像启动后默认语言为英文,导致打开的网页也是优先英文,进而爬取的网页是英文内容

解决:
1、创建驱动时增加 lang 参数:

# chrome
options = ChromeOptions()
options.add_argument("--lang=zh-CN.UTF-8")
# firefox
options = FirefoxOptions()
options.set_preference("intl.accept_languages", "zh-CN.UTF-8")

我爬取的网站,这样设置后就可以了。

2、如果不行,启动镜像时设置 LANG 环境变量为 zh_CN.UTF-8

docker run -d -p 4444:4444 \
    --shm-size=2g \
    -e TZ=Asia/Shanghai \
    -e LANG=zh_CN.UTF-8 \
    selenium/standalone-chrome

Mac 手动安装Chrome驱动

1、查看 chrome 版本:
浏览器输入:
chrome://version/

Google Chrome    133.0.6943.142 (正式版本) (arm64) 
修订版本    f217c2438a8e1f4b9e730de378ce20f754b2c3d0-refs/branch-heads/6943@{#1913}
操作系统    macOS 版本15.3.1(版号24D70)
JavaScript    V8 13.3.415.23
用户代理    Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36
命令行    /Applications/Google Chrome.app/Contents/MacOS/Google Chrome --restart --flag-switches-begin --flag-switches-end
可执行文件路径    /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
个人资料路径    /Users/masi/Library/Application Support/Google/Chrome/Default
Linker    lld
命令行变体    eyJkaXNhYmxlLWZlYXR1cmVzIjoiQXVkaW9JbnB1dENvbmZpcm1SZWFkc1Zp...    
使用中的变体    e61eae14-377be55a

2、下载和 chrome 浏览器版本相同的驱动:
https://googlechromelabs.github.io/chrome-for-testing/

3、解压后将 chromedriver-mac-arm64 中的 chromedriver 可执行程序放到 /usr/local/bin 或当前虚拟环境 bin 目录中


webdriver_manager 自动安装浏览器驱动

pip install webdriver_manager
webdriver_manager 是 Python 中的一个库,用于管理 Web 驱动程序。它的作用是自动下载和设置不同浏览器(如 Chrome、Firefox、Edge 等)的 Web 驱动程序,以便在自动化测试中使用这些浏览器。
使用 Selenium 等爬虫时需要一个与浏览器相匹配的 Web 驱动程序,以便控制和操作浏览器。webdriver_manager 提供了一种简便的方式,可以自动检测所需浏览器的版本并下载相应的 Web 驱动程序。这样,您就不需要手动下载和设置 Web 驱动程序,可以减轻您的负担,提高测试的可靠性和可维护性。

使用方法:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

# 使用 ChromeDriverManager 安装 ChromeDriver,并返回驱动程序的路径
driver_path = ChromeDriverManager().install()
# 打印驱动程序的路径
print(driver_path)

# 创建 ChromeDriver 服务,并指定驱动程序的路径
service = Service(driver_path)
# 创建 Chrome WebDriver,并指定服务
driver = webdriver.Chrome(service=service)
# 打开百度网页
driver.get("https://www.baidu.com")

Selenium 4.6+ 内置 Selenium Manager 可自动下载浏览器驱动

Introducing Selenium Manager
https://www.selenium.dev/blog/2022/introducing-selenium-manager/

Selenium 4.6.0 Released!
https://www.selenium.dev/blog/2022/selenium-4-6-0-released/

从 Selenium 4.6 版本开始,不需要手动下载浏览器驱动,也不需要用 webdriver_manager 来下载驱动,Selenium 内置了 Selenium Manager 这个驱动管理工具。
直接创建 Chrome 或 Firefox 实例即可:

driver = webdriver.Chrome(options=options)
driver = webdriver.Firefox(options=options)

调用 webdriver.Firefox()webdriver.Chrome() 时,如果未显式指定 service 参数,Selenium 会通过内置的 Selenium Manager 自动查找或下载驱动:
如果检测到系统中未已安装浏览器驱动,自动从官方源下载匹配浏览器版本的驱动,并将驱动缓存到本地,默认路径为 ~/.cache/selenium,后续无需重复下载。


soup 解析html

pip install beautifulsoup4
pip install lxml

BeautifulSoup(
    markup="",           # 要解析的文档内容
    features=None,       # 指定解析器类型(或通过第二个位置参数传入)
    builder=None,        # 自定义的解析器实例
    parse_only=None,     # 仅解析部分内容
    from_encoding=None,  # 指定原始编码
    exclude_encodings=None,  # 排除不可用的编码
    **kwargs             # 其他兼容性参数
)

第一个参数 markup 是必填的 html 源码
第二个参数 features 可以指定解析器,

  • BeautifulSoup(markup, 'html.parser') Python 内置,无需安装,速度中等
  • BeautifulSoup(markup, 'lxml') 速度快,需安装 lxml 库(推荐)。
  • BeautifulSoup(markup 'xml') 解析 XML,支持 XPath,速度快
  • BeautifulSoup(markup, 'html5lib') 容错性最强,生成浏览器兼容的 DOM,速度慢。

使用示例

from bs4 import BeautifulSoup

soup = BeautifulSoup('<item><name>Test</name></item>', 'lxml')
print(soup.item)
soup.find(id='mainText') # 查找 id='mainText' 的标签

readability+html2text 解析网页正文

https://github.com/buriy/python-readability
安装:
pip install readability-lxml
pip install lxml_html_clean
pip install html2text

使用示例:

html = '<h1>Hello, World!</h1><p>This is an example.</p>'
doc = Document(html)
title = doc.short_title().strip()
# 返回结果带 <html>/<body> 标签,传入 html_partial=True 参数结果无<html>/<body> 标签
content_html = doc.summary()
h2t = html2text.HTML2Text()
content = h2t.handle(content_html)

参数:

doc = Document(
    html_content,
    url="http://example.com",        # 用于处理相对链接
    positive_keywords=["tit", "text", "member"],  # 正向关键词白名单
    negative_keywords=["footer", "nav"],          # 负面关键词黑名单
    retry_length=250,                # 最小内容长度阈值(调低以保留短文本)
    xpath=False,                     # 禁用XPath模式(避免过度过滤)
    handle_failures="keep",          # 保留解析失败内容
)

GeneralNewsExtractor(GNE) 解析网页

pip install gne
GNE: 通用新闻网站正文抽取器
https://github.com/GeneralNewsExtractor/GeneralNewsExtractor
https://generalnewsextractor.readthedocs.io/zh-cn/latest/

gne 输入是 HTML 源代码,没有请求网页的功能,需要自己先把网页 html 源码爬下来。

在线体验 https://gne.kingname.info/


DrissionPage 网页爬虫

https://drissionpage.cn/
DrissionPage 是一个基于 Python 的网页自动化工具。
既能控制浏览器,也能收发数据包,还能把两者合而为一。
可兼顾浏览器自动化的便利性和 requests 的高效率。
功能强大,语法简洁优雅,代码量少,对新手友好。


playwright web测试/爬虫

微软的 web 自动化工具,相较于目前最常用的Selenium,它仅用一个API即可自动执行Chromium、Firefox、WebKit等主流浏览器自动化操作。
https://playwright.dev/

playwright-python

microsoft / playwright-python
https://github.com/microsoft/playwright-python

playwright最详细使用教程
https://blog.csdn.net/m0_51156601/article/details/126886040

playwright-java

microsoft / playwright-java
https://github.com/microsoft/playwright-java

Playwright for Java
https://playwright.dev/java/


feapder 网页爬虫

https://feapder.com/#/
https://github.com/Boris-code/feapder

feapder是一款上手简单,功能强大的Python爬虫框架,内置AirSpider、Spider、TaskSpider、BatchSpider四种爬虫解决不同场景的需求。
支持断点续爬、监控报警、浏览器渲染、海量数据去重等功能。
更有功能强大的爬虫管理系统feaplat为其提供方便的部署及调度

采集动态页面时(Ajax渲染的页面),常用的有两种方案:

  • 一种是找接口拼参数,这种方式比较复杂但效率高,需要一定的爬虫功底;
  • 另外一种是采用浏览器渲染的方式,直接获取源码,简单方便

浏览器渲染-Selenium

框架内置一个浏览器渲染池,默认的池子大小为1,请求时重复利用浏览器实例,只有当代理失效请求异常时,才会销毁、创建一个新的浏览器实例
内置浏览器渲染支持 CHROME、EDGE、PHANTOMJS、FIREFOX

浏览器渲染-Playwright

框架支持playwright渲染下载,每个线程持有一个playwright实例
框架支持chromium、firefox、webkit 三种浏览器渲染


上一篇 XPath

下一篇 Python-常用模块

阅读
评论
2.4k
阅读预计10分钟
创建日期 2025-03-03
修改日期 2025-03-17
类别
标签

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论