Python爬虫框架PySpider如何合并长文章的内分页

文章很长,内部有多个分页,请问如何每个分页都采集后再合成一个完整的文章?

比如漫画的一个篇章有很多个页面,但是都属于同一话,采集完后要归类到同一个页面。

Url 一般是这种格式。

https://www.dmzj.com/view/jinshangxiang/83169.html#@page=1
https://www.dmzj.com/view/jinshangxiang/83169.html#@page=2
https://www.dmzj.com/view/jinshangxiang/83169.html#@page=3
Python爬虫框架PySpider如何合并长文章的内分页


2 回复

PySpider处理长文章分页合并,核心是使用self.crawl回调链传递数据。这里给个完整示例:

from pyspider.libs.base_handler import *

class Handler(BaseHandler):
    crawl_config = {
        'headers': {'User-Agent': 'Mozilla/5.0'},
        'timeout': 30
    }
    
    @every(minutes=24 * 60)
    def on_start(self):
        # 起始页(包含分页链接)
        self.crawl('http://example.com/article/1', 
                  callback=self.index_page)
    
    @config(priority=2)
    def index_page(self, response):
        # 提取所有分页链接
        pages = []
        for link in response.doc('a[href*="page"]').items():
            pages.append(link.attr.href)
        
        # 如果有分页,收集所有页面内容
        if pages:
            article_parts = [response.text]  # 保存第一页内容
            for page_url in pages[:3]:  # 限制前3页防止过多请求
                self.crawl(page_url, 
                          callback=self.parse_page,
                          save={'parts': article_parts})
        else:
            # 无分页直接处理
            self.process_full_article(response.text)
    
    def parse_page(self, response):
        article_parts = response.save['parts']
        article_parts.append(response.text)
        
        # 判断是否最后一页(根据页面特征)
        if not response.doc('a.next-page').items():
            # 合并所有分页内容
            full_article = self.merge_articles(article_parts)
            self.process_full_article(full_article)
    
    def merge_articles(self, parts):
        """合并分页内容的逻辑"""
        # 简单去重合并(根据实际需求调整)
        seen = set()
        merged_lines = []
        for part in parts:
            lines = part.split('\n')
            for line in lines:
                stripped = line.strip()
                if stripped and stripped not in seen:
                    seen.add(stripped)
                    merged_lines.append(line)
        return '\n'.join(merged_lines)
    
    def process_full_article(self, content):
        """处理完整文章"""
        # 这里实现你的存储或处理逻辑
        print(f"文章长度: {len(content)} 字符")
        # 可以保存到数据库或文件
        with open('full_article.txt', 'w', encoding='utf-8') as f:
            f.write(content)

if __name__ == '__main__':
    from pyspider.run import main
    main()

关键点:

  1. response.save在回调间传递数据列表
  2. parse_page中判断最后一页后触发合并
  3. 合并时根据实际网页结构去重(示例用了简单行去重)

实际使用时需要调整:

  • 分页链接选择器('a[href*="page"]'
  • 最后一页判断条件('a.next-page'
  • 合并逻辑(可能需要更精细的HTML解析)

建议用XPath或CSS选择器精准提取正文区域再合并。


加一个 if 判断,翻页 css、url 路径或者其他,然后循环获取所有的翻页内容,article += content

回到顶部