Python网页抓取怎么抓各种页面:Scrapling从单个请求到全站爬取的实战教程
【免费下载链接】Scrapling🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!项目地址: https://gitcode.com/GitHub_Trending/sc/Scrapling
Scrapling 是一个 Python网页抓取框架,把"发一个请求"和"跑一个全站爬虫"做成同一套 API:内置的隐身浏览器抓取能自动通过 Cloudflare 一类的防护,解析层还能在网站改版后自动找回你之前选中的元素。下面按一次真实任务的顺序,从安装讲到全站爬虫跑起来。
网页抓取真正的三个麻烦
普通requests加BeautifulSoup的组合,实际会卡在三件事上:页面靠 JS 渲染,抓回来是空壳;站点有防护(比如 Cloudflare 的 Turnstile 验证),403 或验证页过不去;网站一改结构,选择器就全失效,只能人工修。Scrapling 把这三件事拆给了三个抓取器,再在解析层加了一个"自适应选择器"。理解了这条分工线,后面的用法基本是线性的。
三步跑通第一个请求
pip install scrapling scrapling install # 浏览器模式才需要,装浏览器依赖第二步抓一个静态页。Fetcher不开浏览器、发纯 HTTP 请求,但可以模拟最新 Chrome 的 TLS 指纹和请求头,对大多数站点够用:
from scrapling.fetchers import Fetcher page = Fetcher.get('https://quotes.toscrape.com/') for text in page.css('.quote .text::text').getall(): print(text)第三步,如果是一次会话里连续请求(比如先登录再翻页),换成 Session。连接和 cookie 复用,浏览器也只开一次:
from scrapling.fetchers import FetcherSession with FetcherSession(impersonate='chrome') as session: page = session.get('https://quotes.toscrape.com/', stealthy_headers=True) print(page.css('.quote').len)顺手说一句:scrapling shell进入的交互 shell 支持把你从浏览器开发者工具里复制的 cURL 命令直接粘贴进去,自动转成 Scrapling 请求,调试接口时比手写代码快。
三种页面,三种抓法
动态渲染页面怎么抓
内容靠 JS 渲染的页面,Fetcher拿不到,升级DynamicFetcher。它用 Playwright 驱动真实 Chromium,可以等网络空闲,也可以等某个元素出现:
from scrapling.fetchers import DynamicFetcher page = DynamicFetcher.fetch( 'https://example.com/list', network_idle=True, # 等页面网络静默 500ms wait_selector='.product', # 或者等指定元素出现 ) print(page.css('.product .name').getall())有防护的站点怎么抓
StealthyFetcher是重武器:默认处理 Cloudflare Turnstile/Interstitial,修补 CDP 与 WebRTC 泄漏,给 canvas 指纹加噪声。遇到 Cloudflare 门槛的页面:
from scrapling.fetchers import StealthyFetcher page = StealthyFetcher.fetch( 'https://nopecha.com/demo/cloudflare', solve_cloudflare=True ) print(page.status)三者是清晰的递进:静态页用Fetcher(最快),有渲染用DynamicFetcher,遇到防护才上StealthyFetcher。别默认一切开浏览器,浏览器模式最慢、内存占用也最大。
网站改版后,选择器怎么不废
选择器怕的就是"网站小改版"。Scrapling 的解析器有个机制:第一次抓取时用auto_save=True记住元素特征,之后网站改了 class 名或结构,传adaptive=True,它按相似度把老元素找回来:
from scrapling.fetchers import Fetcher Fetcher.adaptive = True page = Fetcher.get('https://example.com/shop') items = page.css('.card', auto_save=True) # 首次运行:记住元素 # 几个月后网站换了 class 名 items = page.css('.card', adaptive=True) # 自动重新定位维护成本从"每次改版重写选择器"降到"先试自动定位,找不到再人工修"。
批量任务如何跑:Spiders 框架
从几个页面变成一个网站,不用自己写循环。Scrapling 自带 Scrapy 风格的 Spider 框架:并发、限流、断点续跑、代理轮换、robots.txt 合规都是现成的。一个最小爬虫:
from scrapling.spiders import Spider, Response class QuotesSpider(Spider): name = "quotes" start_urls = ["https://quotes.toscrape.com/"] async def parse(self, response: Response): for q in response.css('.quote'): yield {'author': q.css('.author::text').get()} result = QuotesSpider().start() result.items.to_json('quotes.json')! 架构说明 内部数据流:Spider 把起始 URL 交给调度器,调度器经会话管理器发出请求,响应回到parse产出条目,途中不断保存检查点——中途 Ctrl+C,重跑会从断点继续。
实际用得上的几个点:AutoThrottle 按网站响应速度自动调每个域名的延迟,被限流时自动放慢、恢复后再提速,不用手动猜 sleep;爬 sitemap、RSS 或 Shopify 商店有现成的SitemapSpider、XMLFeedSpider、ShopifySpider模板;同一个 Spider 里还能混合快 HTTP 和隐身浏览器两种会话,按 ID 路由。
常见坑与对策
- 整体很慢:先检查是不是能不开浏览器。没有 JS 渲染的页面就用
Fetcher。 - 403 或验证页:别手调 User-Agent 硬刚,防护看的是整套指纹,直接换
StealthyFetcher。 - 浏览器内存暴涨:少量请求用
with语法走 Session 类,浏览器只开一次;裸调fetch每次都会新开。 - 改版后选择器失效:先试
adaptive=True,找不到再人工改。
适合什么,不适合什么
它适合:有防护的站点、JS 重的页面、长时间跑的全站抓取,以及"少写代码"的场景。如果你只是发一个纯 HTTP 请求解析点数据,requests更轻;内存极其受限的场景也别硬上浏览器模式,一个 Chromium 实例占用不小。
最后照例提一句边界:动手前先看目标站点的 robots.txt 和服务条款,只抓公开数据,请求频率控制在合理范围,尊重数据所有者的权益——框架里robots_txt_obey这类开关也是为此准备的,但先决断的人应该是你自己。
更多细节看官方文档目录:docs/fetching/ 讲三种抓取器,docs/spiders/ 讲爬取框架。
【免费下载链接】Scrapling🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!项目地址: https://gitcode.com/GitHub_Trending/sc/Scrapling
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考