尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Scrapling 爬虫全流程指南:从一条请求到整站抓取

Scrapling 爬虫全流程指南:从一条请求到整站抓取 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/ScraplingScrapling 是一个自适应 Web 爬虫框架把从一条 HTTP 请求到整站并发抓取的全流程收进了一个库里。本文用 4 个递进的真实场景带你走完它的安装、选 fetcher、抗改版、断点续爬每一步代码都能直接复制运行。主线很简单每当你爬到下一个阶段就遇到一个新问题然后我们只解决那一个问题。3 条命令装好并拿到第一页内容大多数爬虫库装完就能用Scrapling 稍微特别一点基础安装只包含解析引擎不装 fetcher 依赖的话import scrapling.fetchers会直接报ModuleNotFoundError。所以按下面这个顺序来pip install scrapling[fetchers] # 装库和 fetcher 依赖需 Python 3.10 scrapling install # 下载浏览器及指纹模拟所需的系统依赖装完后跑这段最小爬虫向练习网站 quotes.toscrape.com 发一条普通 HTTP 请求from scrapling.fetchers import Fetcher page Fetcher.get(https://quotes.toscrape.com/) quotes page.css(.quote .text::text).getall() print(len(quotes), 条引言) print(quotes[0])跑出来应该看到10 条引言接着打印出第一条名言。注意page本身就能用.css()查元素不用额外建解析器——返回的Response对象自带查询能力还能通过page.status、page.headers、page.cookies看响应细节。️术语解析TLS 指纹网站能根据你握手时的 TLS 特征判断你是不是浏览器。Fetcher.get(url, impersonatechrome)会让请求伪装成最新版 Chrome 的 TLS 指纹和头部比手动改 User-Agent 隐蔽得多。普通 HTTP 请求能拿到的页面就到这里为止。下一页内容如果是 JavaScript 渲染出来的你拿到的就只剩一个空壳 DOM 了。页面内容不在源码里按场景选对 fetcher实际跑起来你会发现三种 fetcher 是三个不同档位的工具官方文档里有一张对比表结论可以压缩成一句话能用 HTTP 就别开浏览器浏览器里优先用轻的。Fetcher纯 HTTP最快适合静态页面DynamicFetcher开一个真实 Chromium/Chrome 渲染 JS适合动态加载和中小防护StealthyFetcher在动态渲染之上叠加指纹伪装能自动过 Cloudflare 的 Turnstile 和 Interstitial 挑战内容靠 JS 渲染的页面把上一条请求换成下面这样即可from scrapling.fetchers import DynamicFetcher page DynamicFetcher.fetch(https://quotes.toscrape.com/, network_idleTrue) data page.css(.quote .text::text).getall() print(len(data), 条引言浏览器渲染后)network_idleTrue让 fetcher 等到页面 500ms 内没有网络请求再返回避免抓到 JS 还没执行完的中间状态。跑出来应该同样看到 10 条引言但这次 DOM 是浏览器真实执行后的产物。遇到带 Cloudflare 防护的站点换StealthyFetcher并显式打开挑战求解详细机制见反检测文档from scrapling.fetchers import StealthyFetcher page StealthyFetcher.fetch(https://nopecha.com/demo/cloudflare, solve_cloudflareTrue) data page.css(#padded_content a).getall() print(len(data), 个链接穿过了 Cloudflare 挑战)️术语解析Headless 模式Headless 指不带图形界面的无头浏览器运行模式。两个浏览器 fetcher 默认都是headlessTrue调试时传headlessFalse就能看到浏览器窗口方便观察页面实际加载过程。网站改版了让选择器自己找到原来的元素这是 Scrapling 最有辨识度的一点。传统做法是页面 DOM 一变你写死的#p1或div.product选择器就失效爬虫直接静默返回空结果。Scrapling 的 adaptive自适应功能会记住元素的属性下次找不到时按相似度把元素搬回来重新定位不依赖 AI。先在全局开启这个开关并保存一次元素属性from scrapling.fetchers import Fetcher Fetcher.adaptive True # 默认是关闭的必须显式开启 page Fetcher.get(https://quotes.toscrape.com/) element page.css(.quote, auto_saveTrue) # auto_saveTrue 记录元素指纹之后某天网站改版选择器查不到东西时别慌用adaptiveTrue让它按相似度重新找element page.css(#p1, adaptiveTrue) # 旧选择器失效后照样找到那个元素文档里有个很能说明问题的实测用 2010 年 StackOverflow 页面上生成的超具体选择器去今天的 StackOverflow 上定位同一个按钮adaptive 模式依然能找到见adaptive 文档。也就是说你第一次保存得越认真后面改版时它认路就越准。整站抓取写一个可暂停可续跑的 Spider单页脚本扛不住多页、并发和中断恢复。Scrapling 的 Spider 走的是 Scrapy 风格定义start_urls在异步parse()里yield结果或后续请求内部引擎自己管事件循环、调度器、会话池和断点存档Spider 提交初始请求Crawler Engine 调度会话抓取并把结果存盘随时可从 checkpoint 恢复下面这个 Spider 抓取 quotes.toscrape.com 的全部 10 页from scrapling.spiders import Spider, Response class QuotesSpider(Spider): name quotes start_urls [https://quotes.toscrape.com] async def parse(self, response: Response): for quote in response.css(div.quote): yield { text: quote.css(span.text::text).get(), author: quote.css(small.author::text).get(), } next_page response.css(li.next a::attr(href)).get() if next_page: yield response.follow(next_page, callbackself.parse) result QuotesSpider().start() result.items.to_json(quotes.json) print(f共抓取 {result.stats.items_scraped} 条耗时 {result.stats.elapsed_seconds:.1f}s)跑完终端会打印详细的抓取统计当前目录多出quotes.json里面是 100 条引言。response.follow()会自动处理相对路径并带上 Referer不用自己拼 URL。️术语解析Checkpoint检查点Spider 运行时会把已完成的进度定期存到磁盘。给start()传一个目录即可开启QuotesSpider(crawldir./crawl_data).start()。运行中按 CtrlC 优雅暂停之后用同一个crawldir再启动它会从上次停下的位置继续适合长时间大站爬取。规模上去后被封是迟早的事内置的ProxyRotator让每个请求自动轮换出口 IP代理与封禁处理文档from scrapling.spiders import Spider, Response from scrapling.fetchers import FetcherSession, ProxyRotator class MySpider(Spider): name my_spider start_urls [https://example.com] def configure_sessions(self, manager): rotator ProxyRotator([http://proxy1:8080, http://proxy2:8080]) manager.add(default, FetcherSession(proxy_rotatorrotator)) async def parse(self, response: Response): yield {proxy: response.meta.get(proxy), title: response.css(title::text).get()}每个请求自动取轮换队列里的下一个代理实际用了哪个记在response.meta[proxy]里方便你追查是哪个 IP 抓到了哪页。常见坑与下一步把前面几个场景串起来用过之后最容易踩的坑其实是这些导入即报错只跑了pip install scrapling就会在from scrapling.fetchers import ...处报ModuleNotFoundError。必须带[fetchers]安装再执行scrapling install。adaptive 默认关闭不显式Fetcher.adaptive True第一次就不会保存元素指纹后面想用也白用。想不起选择器就开 shellscrapling shell能进交互式爬虫 shell把浏览器请求转成 Scrapling 请求、在本地浏览器里预览结果省去来回复制粘贴。开发期最常用的姿势浏览器里 Copy as cURL扔进 shell 里直接改造成 fetcher 调用最后提醒一句合规Scrapling 的免责声明里写明使用前请遵守目标网站的服务条款、robots.txt 和当地数据法规Spider 也内置了robots_txt_obey选项来遵守 robots 指令。下一步行动用第一节的 3 条命令装好环境拿你自己的目标站点把四个场景各跑一遍卡在哪一步再翻对应文档官方文档首页fetcher 选择、spider、CLI 的完整说明API 参考每个类的参数一览Spider 入门文档多会话、模板 SpiderCrawlSpider/SitemapSpider/ShopifySpider等进阶内容【免费下载链接】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),仅供参考
返回列表