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
相关产品推荐
相关产品推荐

