You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scrapy进阶:如何跟进已抓取链接获取更多数据

跟进详情页抓取职位描述的解决方案

嘿,你已经搞定新加坡Craigslist职位列表页的基础数据抓取(标题、链接、日期)了,接下来要跟进这些链接提取详情页的职位描述对吧?这在Scrapy里其实很容易实现,核心思路就是从列表页提取详情页URL,发起新请求并指定回调函数处理详情页数据,下面我给你具体的代码扩展方案:

1. 先定义Item类(如果还没定义的话)

首先需要一个Item类来统一存储所有要抓取的数据,包括列表页字段和详情页的职位描述:

import scrapy

class CraigslistJobItem(scrapy.Item):
    title = scrapy.Field()
    post_date = scrapy.Field()
    job_url = scrapy.Field()
    job_description = scrapy.Field()

2. 扩展Spider类,添加详情页回调逻辑

修改你现有的MySpider,在parse方法里提取详情页链接,通过yield scrapy.Request发起请求,同时把列表页已抓取的item数据通过meta参数传递过去:

from scrapy.spiders import BaseSpider
from scrapy.http import Request
from your_project_name.items import CraigslistJobItem  # 替换成你的实际项目名

class MySpider(BaseSpider):
    name = "craigslist"
    allowed_domains = ["singapore.craigslist.com.sg"]
    start_urls = ["https://singapore.craigslist.com.sg/d/jobs/search/jjj"]

    def parse(self, response):
        # 遍历列表页的每个职位条目
        for job in response.xpath('//li[@class="cl-static-search-result"]'):
            item = CraigslistJobItem()
            # 提取列表页的标题、发布日期、详情页链接
            item['title'] = job.xpath('.//h3[@class="cl-static-search-result-title"]/a/text()').get().strip()
            item['post_date'] = job.xpath('.//time[@class="result-date"]/@datetime').get()
            item['job_url'] = job.xpath('.//h3[@class="cl-static-search-result-title"]/a/@href').get()
            
            # 处理相对链接,转成完整URL
            if not item['job_url'].startswith('http'):
                item['job_url'] = response.urljoin(item['job_url'])
            
            # 发起详情页请求,把已抓取的item数据传递给回调函数
            yield Request(
                url=item['job_url'],
                callback=self.parse_job_detail,
                meta={'item': item}
            )
        
        # 可选:处理翻页逻辑,如果需要抓取多页职位就保留
        next_page = response.xpath('//a[@class="button next"]/@href').get()
        if next_page:
            yield Request(url=response.urljoin(next_page), callback=self.parse)

    def parse_job_detail(self, response):
        # 获取从parse方法传递过来的item
        item = response.meta['item']
        
        # 提取职位描述(根据Craigslist页面结构调整XPath,这里是通用写法)
        description_content = response.xpath('//div[@class="postingbody"]//text()').getall()
        # 清理文本,去除多余空格和换行
        item['job_description'] = ' '.join([text.strip() for text in description_content if text.strip()])
        
        # 把完整的item yield出去,交给管道处理(比如写入CSV)
        yield item

3. 配置CSV导出(如果之前没配置的话)

如果你的项目还没设置CSV导出,可以在settings.py里添加以下配置:

FEEDS = {
    'craigslist_jobs.csv': {
        'format': 'csv',
        'fields': ['title', 'post_date', 'job_url', 'job_description'],
        'overwrite': True,
    },
}

关键要点说明

  • meta参数的作用:用来在不同请求的回调函数之间传递数据,这里把列表页抓取的标题、日期等数据传给详情页回调,避免重复抓取相同字段。
  • XPath灵活调整:如果Craigslist的页面结构有更新,你需要根据实际页面元素调整XPath表达式(比如职位描述的容器类名)。
  • 翻页逻辑可选:如果只需要抓取第一页职位,可以删掉翻页相关的代码块。

这样运行你的Spider,就能得到包含完整职位描述的CSV文件啦!

内容的提问来源于stack exchange,提问作者user3111115

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:09:56