Python爬虫小框架如何使用?一起来造作吧!

https://github.com/intohole/xspider 是再重复造轮子!但让我们一起熟悉

xspider 简单 python 抓取框架

xspider

  • 抓取单线程
  • 简单 api 使用
  • xpath/css/json 提取器
  • 多种队列
  • 架构代码逻辑清晰,可以了解 spider 抓取过程
  • it's easy to crawl and extract web;
main.py:
from xspider.spider.spider import BaseSpider
from xspider.filters import urlfilter
from kuailiyu import KuaiLiYu

if name == “main”: spider = BaseSpider(name = “kuailiyu” , page_processor = KuaiLiYu() , allow_site = [“kuailiyu.cyzone.cn”] , start_urls = [“http://kuailiyu.cyzone.cn/”]) spider.url_filters.append(urlfilter.UrlRegxFilter([“kuailiyu.cyzone.cn/article/[0-9]*.html$","kuailiyu.cyzone.cn/index_[0-9]+.html$”])) spider.start()

kuailiyu.py from xspider import processor from xspider.selector import xpath_selector from xspider import model

class KuaiLiYu(processor.PageProcessor.PageProcessor):

    def __init__(self):
        super(KuaiLiYu , self).__init__()
        self.title_extractor = xpath_selector.XpathSelector(path = "//title/text()")

    def process(self , page , spider):
        items = model.fileds.Fileds()
        items["title"] = self.title_extractor.find(page)
        items["url"] = page.url
        return items

抓取部分有以下工程代码


Python爬虫小框架如何使用?一起来造作吧!

11 回复
import requests
from bs4 import BeautifulSoup
import re

class SimpleCrawler:
    def __init__(self, base_url, headers=None):
        self.base_url = base_url
        self.headers = headers or {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
        }
        self.session = requests.Session()
        
    def fetch_page(self, url, params=None):
        """获取页面内容"""
        try:
            response = self.session.get(url, headers=self.headers, params=params, timeout=10)
            response.raise_for_status()
            response.encoding = response.apparent_encoding
            return response.text
        except requests.RequestException as e:
            print(f"请求失败: {e}")
            return None
    
    def parse_html(self, html, selector=None):
        """解析HTML内容"""
        if not html:
            return None
            
        soup = BeautifulSoup(html, 'html.parser')
        
        if selector:
            # 支持CSS选择器
            if selector.startswith(('.', '#')):
                return soup.select(selector)
            # 支持正则表达式
            elif selector.startswith('re:'):
                pattern = selector[3:]
                return re.findall(pattern, html)
            # 默认按标签查找
            else:
                return soup.find_all(selector)
        return soup
    
    def extract_links(self, html, pattern=None):
        """提取页面链接"""
        soup = BeautifulSoup(html, 'html.parser')
        links = []
        
        for link in soup.find_all('a', href=True):
            href = link['href']
            # 处理相对链接
            if href.startswith('/'):
                href = self.base_url + href
            elif not href.startswith(('http://', 'https://')):
                href = self.base_url + '/' + href
                
            if pattern:
                if re.search(pattern, href):
                    links.append(href)
            else:
                links.append(href)
                
        return links
    
    def crawl(self, start_url, max_depth=2, callback=None):
        """递归爬取页面"""
        visited = set()
        
        def _crawl(url, depth):
            if depth > max_depth or url in visited:
                return
                
            visited.add(url)
            print(f"正在爬取: {url} (深度: {depth})")
            
            html = self.fetch_page(url)
            if html and callback:
                callback(url, html)
            
            # 只在第一层深度提取链接继续爬取
            if depth < max_depth:
                links = self.extract_links(html)
                for link in links[:5]:  # 限制链接数量防止过度爬取
                    _crawl(link, depth + 1)
        
        _crawl(start_url, 0)

# 使用示例
if __name__ == "__main__":
    # 1. 创建爬虫实例
    crawler = SimpleCrawler("https://httpbin.org")
    
    # 2. 定义数据处理回调函数
    def process_data(url, html):
        soup = BeautifulSoup(html, 'html.parser')
        title = soup.title.string if soup.title else "无标题"
        print(f"页面标题: {title}")
        
        # 提取所有段落文本
        paragraphs = crawler.parse_html(html, 'p')
        for i, p in enumerate(paragraphs[:3], 1):
            print(f"段落{i}: {p.get_text()[:50]}...")
    
    # 3. 开始爬取
    crawler.crawl("https://httpbin.org/html", max_depth=1, callback=process_data)
    
    # 4. 单独请求并解析示例
    html = crawler.fetch_page("https://httpbin.org/html")
    if html:
        # 使用CSS选择器
        headers = crawler.parse_html(html, 'h1')
        print(f"\n找到 {len(headers)} 个h1标签")
        
        # 使用正则表达式提取
        titles = crawler.parse_html(html, 're:<title>(.*?)</title>')
        print(f"正则提取标题: {titles}")

这个框架的核心设计思路:

  1. SimpleCrawler类封装了基本爬虫功能
  2. fetch_page处理HTTP请求和异常
  3. parse_html支持多种解析方式(CSS选择器/正则/标签查找)
  4. extract_links自动处理相对链接
  5. crawl方法实现递归爬取,避免重复访问

使用步骤:

  1. 实例化爬虫时传入基础URL
  2. 定义callback函数处理抓取到的数据
  3. 调用crawl方法开始爬取,可控制爬取深度
  4. 也可以单独使用各个方法进行灵活操作

框架特点:

  • 自动会话保持
  • 链接标准化处理
  • 防重复爬取机制
  • 支持深度控制
  • 多种解析方式

要扩展功能可以添加:代理支持、异步请求、数据存储、反爬策略等模块。

总结:先跑起来再逐步完善功能。

学习一下

好屌~

JavaScript 版本助攻,向大家学习 Orz https://github.com/j1wu/cli-scraper

最近正好在学爬虫,收藏一个,楼主加油!

屌屌的

里面的 api 没有整理 , 这个爬虫专门为了机器不足 时间来换的开发

马克,学习

 感谢关注

回到顶部