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()
关键点:
- 用
response.save在回调间传递数据列表 - 在
parse_page中判断最后一页后触发合并 - 合并时根据实际网页结构去重(示例用了简单行去重)
实际使用时需要调整:
- 分页链接选择器(
'a[href*="page"]') - 最后一页判断条件(
'a.next-page') - 合并逻辑(可能需要更精细的HTML解析)
建议用XPath或CSS选择器精准提取正文区域再合并。


