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-常用模块
页面信息
location:
protocol
: host
: hostname
: origin
: pathname
: href
: document:
referrer
: navigator:
platform
: userAgent
: