🗣 Wd提问: Scrapy SEO爬虫
🤖 Ai回答: Scrapy SEO爬虫实现方案
下面是一个使用Scrapy框架实现的SEO爬虫方案,用于抓取网站的关键SEO元素并进行分析。
爬虫设计思路
这个爬虫将抓取以下关键SEO元素:
页面标题(Title)
元描述(Meta Description)
H1标签内容
页面URL
响应状态码
规范链接(Canonical URL)
图片alt属性
内部链接和外部链接
页面内容关键词密度
实现代码
1、创建Scrapy项目
bash
scrapy startproject seo_spider
cd seo_spider
scrapy genspider seo_crawler 65.hk
2、定义数据模型(items.py)
python
import scrapy
class SeoItem(scrapy.Item):
url = scrapy.Field()
status = scrapy.Field()
title = scrapy.Field()
meta_description = scrapy.Field()
h1 = scrapy.Field()
canonical_url = scrapy.Field()
word_count = scrapy.Field()
image_alts = scrapy.Field()
internal_links = scrapy.Field()
external_links = scrapy.Field()
keyword_density = scrapy.Field()
3、实现爬虫(seo_crawler.py)
python
import scrapy
from seo_spider.items import SeoItem
from urllib.parse import urljoin, urlparse
from collections import Counter
import re
class SeoCrawlerSpider(scrapy.Spider):
name = 'seo_crawler'
allowed_domains = ['65.hk']
start_urls = ['http://65.hk/']
custom_settings = {
'DEPTH_LIMIT': 3,
'CONCURRENT_REQUESTS': 16,
'ROBOTSTXT_OBEY': True,
'USER_AGENT': 'Mozilla/5.0 (compatible; SEOBot/1.0; +http://yourdomain.com/bot)'
}
def parse(self, response):
创建SEO项目
item = SeoItem()
item['url'] = response.url
item['status'] = response.status
提取标题
title = response.xpath('//title/text()').get()
item['title'] = title.strip() if title else None
提取元描述
meta_desc = response.xpath('//meta[@name=description]/@content').get()
item['meta_description'] = meta_desc.strip() if meta_desc else None
提取H1标签
h1 = response.xpath('//h1/text()').get()
item['h1'] = h1.strip() if h1 else None
提取规范链接
canonical = response.xpath('//link[@rel=canonical]/@href').get()
item['canonical_url'] = urljoin(response.url, canonical) if canonical else None
提取图片alt属性
image_alts = response.xpath('//img[@alt]/@alt').getall()
item['image_alts'] = [alt.strip() for alt in image_alts if alt.strip()]
计算关键词密度
text_content = ' '.join(response.xpath('//body//text()').getall())
cleaned_text = re.sub(r'\s+', ' ', text_content).strip()
word_count = len(cleaned_text.split())
item['word_count'] = word_count
if word_count 0:
words = cleaned_text.lower().split()
word_freq = Counter(words)
keyword_density = {word: (count / word_count) * 100 for word, count in word_freq.most_common(10)}
item['keyword_density'] = keyword_density
提取链接并分类
all_links = response.xpath('//a/@href').getall()
internal_links = []
external_links = []
for link in all_links:
if not link or link.startswith(('javascript:', 'mailto:', 'tel:')):
continue
absolute_url = urljoin(response.url, link)
parsed_url = urlparse(absolute_url)
if parsed_url.netloc == '' or parsed_url.netloc == urlparse(response.url).netloc:
internal_links.append(absolute_url)
else:
external_links.append(absolute_url)
item['internal_links'] = list(set(internal_links))
item['external_links'] = list(set(external_links))
yield item
递归爬取内部链接
for link in internal_links:
if any(ext in link for ext in ['.jpg', '.png', '.pdf', '.zip']):
continue
yield scrapy.Request(link, callback=self.parse)
4、配置设置(settings.py)
python
BOT_NAME = 'seo_spider'
SPIDER_MODULES = ['seo_spider.spiders']
NEWSPIDER_MODULE = 'seo_spider.spiders'
遵守robots.txt规则
ROBOTSTXT_OBEY = True
并发请求数
CONCURRENT_REQUESTS = 16
下载延迟
DOWNLOAD_DELAY = 0.5
启用AutoThrottle扩展
AUTOTHROTTLE_ENABLED = True
设置User-Agent
USER_AGENT = 'Mozilla/5.0 (compatible; SEOBot/1.0; +http://yourdomain.com/bot)'
配置Pipeline以保存数据
ITEM_PIPELINES = {
'seo_spider.pipelines.SeoSpiderPipeline': 300,
}
启用并配置HTTP缓存
HTTPCACHE_ENABLED = True
HTTPCACHE_EXPIRATION_SECS = 0 永不过期
HTTPCACHE_DIR = 'httpcache'
5、数据存储Pipeline(pipelines.py)
python
import json
import csv
from itemadapter import ItemAdapter
class SeoSpiderPipeline:
def __init__(self):
self.file = open('seo_data.json', 'w', encoding='utf-8')
self.csv_file = open('seo_data.csv', 'w', newline='', encoding='utf-8')
self.csv_writer = csv.writer(self.csv_file)
self.csv_writer.writerow([
'URL', 'Status', 'Title', 'Meta Description', 'H1', 'Canonical URL',
'Word Count', 'Image Alts', 'Internal Links', 'External Links', 'Keyword Density'
])
def process_item(self, item, spider):
写入JSON文件
line = json.dumps(dict(item), ensure_ascii=False) + \n
self.file.write(line)
写入CSV文件
self.csv_writer.writerow([
item.get('url', ''),
item.get('status', ''),
item.get('title', ''),
item.get('meta_description', ''),
item.get('h1', ''),
item.get('canonical_url', ''),
item.get('word_count', ''),
'; '.join(item.get('image_alts', [])),
'; '.join(item.get('internal_links', [])),
'; '.join(item.get('external_links', [])),
json.dumps(item.get('keyword_density', {}))
])
return item
def close_spider(self, spider):
self.file.close()
self.csv_file.close()
6、运行爬虫
bash
scrapy crawl seo_crawler -s JOBDIR=crawls/seo_crawler
数据分析建议
收集数据后,可以进行以下SEO分析:
1、标题优化:
检查标题长度(建议50-60字符)
检测重复标题
确保包含主要关键词
2、元描述分析:
检查描述长度(建议120-160字符)
检测重复描述
确保包含关键词和行动号召
3、H1标签检查:
每个页面应有且只有一个H1标签
H1应与页面内容相关
4、规范链接问题:
检测是否有多个页面指向同一规范URL
检查规范URL是否正确
5、图片优化:
检测缺少alt属性的图片
分析alt文本是否描述性
6、链接结构:
分析内部链接分布
检测死链(404页面)
识别孤立页面
7、关键词密度:
分析关键词分布是否自然
检测关键词堆砌
注意事项
1、尊重robots.txt:确保遵守网站的爬取规则
2、速率限制:设置合理的DOWNLOAD_DELAY,避免对目标服务器造成压力
3、错误处理:增加重试中间件处理临时错误
4、内存管理:对于大型网站,考虑使用数据库存储而非文件
5、合法性:仅在获得授权的情况下爬取网站,遵守数据保护法规
这个Scrapy SEO爬虫提供了
📣 商家广告 :
👍
0
👎
IP地址: 163.100.13.20
搜索次数: 0
提问时间: 2025-11-08 14:55:38
🛒 域名购买 :
965.net.cn gang.hk robots.red xuanhuo.com.cn ndgj.cn lw.gs kaosou.com.cn diaowang.com.cn qn.gs 67.gs
❓️ 热门提问 :
好用的dns服务器 机房防雷测试 超便宜云主机 bluehost vps云主机 ip 16 pro 便宜的网站开发服务 vps网页版 MySQL源码查询优化器 ip服务代理器 个人网站注册域名 豌豆Ai站群搜索引擎系统
🌐 域名评估 :
vivo.hl.cn f.mo.cn pujs.cn ff.sx.cn vtoly.com 3.bj.cn stih.cn ijuwo.com uav.xj.cn tesla.ha.cn
⛏ 最新挖掘 :
凯里酸汤鱼 贵阳烤脑花 都匀毛尖茶 花溪牛肉粉 贵阳烤生蚝 贵阳烤豆腐 贵阳纸包鱼 贵阳特色菜
🖌 热门作画 :
🤝 关于我们:
豌豆Ai
域名
建站
站群
留痕
推广
评估
源码
开发Ai
工具
日记
价格
加盟
广告
流量
留言
联系
🗨 加入群聊 :
🔗 友情链接 :
商标注册
搜尋引擎排名
ai提问
🧰 站长工具 :Ai工具 whois查询 搜索
📢 温馨提示 :本站所有问答由Ai自动创作,内容仅供参考,若有误差请用“联系”里面信息通知我们人工修改或删除。
👉 技术支持 :本站由豌豆Ai 提供技术支持,使用的最新版:《豌豆Ai站群搜索引擎系统 V.25.10.25》搭建本站。