關鍵詞:多重頁面數(shù)據爬取
在[學院教師信息爬取報告(一)][1]中,我們使用的是兩個爬蟲分別爬取同一網站的不同頁面蛙粘。而教師列表頁與詳情頁存在著大量的信息重復艰猬,所以將兩者綜合生成新的教師詳情列表數(shù)據是一個不錯的方案聪富。
[1]: http://www.reibang.com/writer#/notebooks/12252479/notes/12125419
定義元數(shù)據
根據將要爬取的頁面數(shù)據信息,在你建立的項目目錄items.py文件下定義你的item
class TeachersItem(scrapy.Item):
introduction = scrapy.Field()
#該數(shù)據來自教師詳情頁
name = scrapy.Field()
title = scrapy.Field()
subject = scrapy.Field()
email = scrapy.Field()
#該四項數(shù)據來自教師列表頁
爬蟲代碼
import scrapy
from teacher.items import TeachersItem
class TeacherSpider(scrapy.Spider):
name = 'Teachers'
allowed_domains = ['ggglxy.scu.edu.cn']
start_urls = ['http://ggglxy.scu.edu.cn/index.php?c=article&a=type&tid=18']
def parse(self, response):
teacher_urls = response.xpath('//ul[@class="teachers_ul mt20 cf"]/li[@class="fl"]')
#該句是生成包含每個教師列表item的url列表
for teacher_url in teacher_urls:
item = TeachersItem()
item['name'] = teacher_url.xpath('./div[@class="r fr"]/h3/text()').extract()
item['title'] = teacher_url.xpath('./div[@class="r fr"]/p/text()').extract()
item['subject'] = teacher_url.xpath('./div[@class="r fr"]/div[@class="desc"]/p[1]/text()').extract()
item['email'] = teacher_url.xpath('./div[@class="r fr"]/div[@class="desc"]/p[2]/text()').extract()
#該四項數(shù)據位于起始頁玻靡,爬取代碼位于parse函數(shù)內部
urls = response.xpath('//ul[@class="teachers_ul mt20 cf"]/li[@class="fl"]/div[1]/a/@href').extract()
#該句是生成包含每個教師詳情item的url列表剃浇,這里已經進入第二層級頁
for url in urls:
url = response.urljoin(url)
#該句將url補全刀疙,生成完整的絕對路徑
yield scrapy.Request(url, meta={'item': item}, callback = self.parse_teacher_x)
#返回Request嗓袱,發(fā)送服務器請求奸披,此時使用meta傳值,回調parse_teacher_x函數(shù)
next = response.xpath('//div[@class="pager cf tc pt10 pb10 mobile_dn"]/li[last()-1]/a/@href').extract_first()
#該句構造分頁蝎土,這里last()函數(shù)僅適用于網頁結構良好的分頁视哑,此處next可看情況自己構造
if next is not None:
next = response.urljoin(next)
yield scrapy.Request(next, callback = self.parse)
def parse_teacher_x(self, response):
item = response.meta['item']
item['introduction'] = response.xpath('/html/body/div[3]/div[2]/div/div[1]/div[2]/div/text()').extract()
yield item
簡單說明:
- 正確獲取item各個數(shù)據項的urls列表,使用response.urljoin()生成url絕對值瘟则,同時返回Request使其作為新地址入口(即其余未定義數(shù)據項入口)黎炉。
- 使用meta傳已獲得的數(shù)據項的值,作為參數(shù)傳遞醋拧。
- 回調函數(shù)的寫法慷嗜,自己要揣摩。