一、采集前準備#
在采集之前,首先進入四川大學公共管理學院的師資隊伍頁面查看頁面顯示結構,并用開發者工具“ctrl+shift+i”工具查看其代碼排列規則,確定采集字段內容。
基本思想是先在初始頁面采集姓名、職稱、專業、郵箱,然后通過采集的詳情頁面鏈接進入詳情頁,并采集其基本簡歷,代表性研究成果,獲獎情況、科研項目、人才培養。共10個字段。
過程的操作指導來源于scrapy的官方文檔以及老師同學的幫助。
二、新建scrapy項目#
首先新建一個scrapy項目,代碼如下:
cd venv
scrapy startproject teachersinfo
三、編寫items.py文件#
然后編寫項目的items文件,在這個文件中定義將要采集的字段。按照規定格式編寫之后,這里的字段將直接用于后面步驟中的采集過程,且便于數據的傳遞。
代碼如下:
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html
import scrapy
class TeachersinfoItem(scrapy.Item):
# 教師名字
name = scrapy.Field()
# 教師職稱
title = scrapy.Field()
# 教師院系
major = scrapy.Field()
# 教師郵箱
mail = scrapy.Field()
# 教師簡介
resume = scrapy.Field()
# 教師簡介
achieve = scrapy.Field()
# 教師代表性研究成果
prize = scrapy.Field()
# 教師獲獎情況
project = scrapy.Field()
# 教師科研項目
training = scrapy.Field()
# 教師人才培養
pass
四、編寫爬蟲#
在項目之下,可以看到基本結構:
teachersinfo的子集結構
在spiders之下新建一個爬蟲,命名為:teachers_spider.py
import scrapy
import hashlib
from scrapy.selector import Selector
from teachersinfo.items import TeachersinfoItem
class TeachersinfoSpider(scrapy.Spider):
name = "teachersinfo"
start_urls = [
'http://ggglxy.scu.edu.cn/index.php?c=article&a=type&tid=18&page_1_page=1',
]
def parse(self, response):
for info in response.xpath("http://ul[@class='teachers_ul mt20 cf']/li"):
item = TeachersinfoItem()
item['name'] = info.xpath("div[@class='r fr']/h3/text()").extract_first()
item['title'] = info.xpath("div[@class='r fr']/p/text()").extract_first()
item['major'] = info.xpath("div[@class='r fr']/div[@class='desc']/p[1]/text()").extract_first().split("E-mail:")[-1]
item['mail'] = info.xpath("div[@class='r fr']/div[@class='desc']/p[2]/text()").extract_first()
href = info.xpath("div[@class='l fl']/a/@href").extract_first()
yield scrapy.Request(response.urljoin(href), meta={'item': item}, callback=self.parse_more_info)
next_page = response.xpath("http://div[@class='pager cf tc pt10 pb10 mobile_dn']/li[last()-1]/a/@href").extract_first()
last_page = response.xpath("http://div[@class='pager cf tc pt10 pb10 mobile_dn']/li[last()]/a/@href").extract_first()
if last_page:
next_page = "http://ggglxy.scu.edu.cn/"+next_page
yield scrapy.http.Request(next_page, callback=self.parse)
@staticmethod
def parse_more_info(response):
item = response.meta['item']
item['resume'] = response.xpath("http://div[@class='desc']/text()").extract()
item['achieve'] = "".join(response.xpath('/html/body/div[3]/div[2]/div/div[2]//text()').extract())
item['prize'] = "".join(response.xpath('/html/body/div[3]/div[2]/div/div[3]//text()').extract())
item['project'] = "".join(response.xpath('/html/body/div[3]/div[2]/div/div[4]//text()').extract())
item['training'] = "".join(response.xpath('/html/body/div[3]/div[2]/div/div[5]//text()').extract())
yield item
通過其中meta方法的傳遞參數,將基礎頁面的內容與詳情頁面的內容聯系起來,不用重復采集兩次教師的姓名以及職稱。
五、執行爬蟲,并保存文件#
直接用一句代碼實現這兩步過程,將結果保存為csv格式。
scrapy crawl teachersinfo -o infos.csv
其結果顯示如下:
爬蟲teachersinfo執行的結果
將infos.csv文件下載并打開,發現excel內容為亂碼,于是采用記事本打開并另存,將編碼方式換成ANSI,然后再用excel打開即可呈現結果。顯示如下:
csv文件內容
csv文件內容
六、補充#
關于翻頁###
在進行分頁時,嘗試使用其他方式,其中xpath的sibling是一個很好的方式。
將翻頁代碼更改一下:
next_page = response.xpath('/html/body/div[4]/div[2]/div[1]/div[2]/li[@class]/following-sibling::*[1]//@href').extract_first()
if next_page is not None:
next_page = response.urljoin(next_page)
yield scrapy.http.Request(next_page, callback=self.parse)
保存成csv文件,用相同轉編碼的方式查看,可知可以得到相同的結果。
haha.csv