采集川大公管学院教师信息

一、采集前的准备

首先进入四川大学公共管理学院官网,查看其师资队伍师资队伍板块对教师信息的陈列方式。未来采集将从这里开始。
从网站陈列的方式可以看到:

教师分为三类:全职教师、客座教师、退休教师、博士后流动站。

通过点击每个版块的教师查看具体信息,每个老师的信息包括(教师的图片包含进入具体页的链接):

姓名、职称、专业、邮箱。
姓名、职称、简短简历、代表性研究成果、获奖情况、科研项目、人才培养

师资队伍开始采集全职教师的姓名、职称、专业、邮箱、图片,并进行翻页。对每个老师而言,进入详细页面继续采集简短简历、代表性研究成果、获奖情况、科研项目、人才培养的内容。

对于部分教师,其信息没有上传到官网.应考虑没有信息的默认采集格式。

二、开始采集

在这一次才采集过程,依然按照scrapy教程的步骤进行采集实践。
首先建立这一次的采集项目,项目名称是jsinfo(教师信息):

jsinfo

可以看到在jsinfo项目之下的内容目录呈以下结构:


jsinfo项目的内容目录

在正式采集之前,现在items.py这个文件中定义即将采集的字段(实际上定义了之后,感觉太难也没用)。


items.py定义采集字段

在spiders下建立jsinfo_spider.py文件,开始写第一个爬虫(这部分并没有什么意义。。。)。
import scrapy


class JsInfoSpider(scrapy.Spider):
   name = "infos"

   def start_requests(self):
       urls = [
           'http://ggglxy.scu.edu.cn/index.php?c=article&a=type&tid=18'
       ]
       for url in urls:
           yield scrapy.Request(url=url, callback=self.parse)

   def parse(self, response):
       page = response.url.split("/")[-2]
       filename = 'infos-%s.html' % page
       with open(filename, 'wb') as f:
           f.write(response.body)
       self.log('Saved file %s' % filename)

然后执行infos爬虫,可以得到师资队伍的html文件。
root@iZwz9bmo44a33isf69hxp5Z:~/venv/jsinfo# scrapy crawl infos
接着提取师资队伍页面的部分内容,如下:

打开师资队伍页面

提取教师名字

提取教师的职称

这时我想继续提取教师的专业以及他们各自的邮箱,这时发现专业与邮箱都相同标签下的文本内容,如何在同一标签下分条目抓取内容我未遇到过。考虑通过定位p[0],p[1]将同一标签下的字段截断,试过之后结果是第一个字段没有数据,而第二个字段的数据都采集下来的数据是原本第一个字段的数据。

p标签下的数据

于是推测,在这里,数据字段是从“1”开始的。修改代码之后,可以得到正确的结果。

 'jsmajor': info.xpath("//div[@class='desc']/p[1]/text()").extract_first(),
                    'jsmail': info.xpath("//div[@class='desc']/p[2]/text()").extract_first()
p标签数据分段
相同标签下的专业+邮箱

在解决这个问题之前,我是将专业和邮箱采集到一起。当然还是分开采集更加显著了。

第一页采集结果

这时爬虫infos的代码如下:

    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("//div[@class='r fr']"):
                yield {
                    'jsname': info.xpath("//h3[@class='mb10']/text()").extract_first(),
                    'jstitle': info.xpath("//p[@class='color_main f14']/text()").extract_first(),
                    'jsmajormail': info.xpath("//div[@class='desc']/p/text()").extract(),
                }

第一页的采集下来了,接下来没有去采集子页面的内容,打算先实现翻页功能。于是,先尝试用指导文档中的翻页设置:


next_page = response.xpath("//li[@href]/@href").extract_first()
        if next_page is not None:
            next_page = response.urljoin(next_page)
            yield scrapy.Request(next_page, callback=self.parse)

结果翻页是不成功的,或者出现将首页重复两次的情况。多次试验,依然失败。于是考虑到公共管理学院师资队伍就16页,或许可以以循环的方式将url全部写出来。然后照着其他资料提示,改了spider内容。

    start_urls = []

    def start_requests(self):
        i = 1
        while i <= 16:
            url = "http://ggglxy.scu.edu.cn/index.php?c=article&a=type&tid=18&page_1_page=%d" % i
            yield self.make_requests_from_url(url)
            i += 1

然后运行爬虫‘infosone’,可以发现已经成功实现了翻页。结果发现将每个页面重复爬取多次(貌似重复8次,也是不懂为什么了)。后面尝试修改代码以避免重复页面抓取,但是始终修改不对。

翻页结果1

教师基本信息的显示的xml

于是我就先把这个问题放到一边。然后先去采集详情页的内容,预想直接加入基本页代码之中,看能不能连接到一起。并且没有加入翻页的结构,只是在第一页进行试验。

import scrapy


class JsInfoSpider(scrapy.Spider):
    name = "infostwo"
    start_urls = [
        'http://ggglxy.scu.edu.cn/index.php?c=article&a=type&tid=18'
        ]

    def parse(self, response):
            for info in response.xpath('//li[@class="f1"]'):
                yield {
                    'jsname': info.xpath("//h3[@class='mb10']/text()").extract_first(),
                    'jstitle': info.xpath("//p[@class='color_main f14']/text()").extract_first(),
                    'jsmajor': info.xpath("//div[@class='desc']/p[1]/text()").extract_first(),
                    'jsmail': info.xpath("//div[@class='desc']/p[2]/text()").extract_first()
                }
            for href in response.xpath('//li[@class="f1"]/div[@class="1 f1"]/a/@href').extract():
                yield scrapy.Request(response.urljoin(href),
                                       callback=self.parse_txxinfo)

    @staticmethod
    def parse_txxinfo(self, response):
        for intro in response.xpath('//div[@class="r fr"]'):
            yield {
                'jsname': intro.xpath('h3/text()').extract_first(),
                'jsresume': intro.xpath('div[@class="desc"]/text()').extract_first(),
            }

然而结果不是想象那样,我就觉得是我逻辑出了错,于是问了其他同学,发现逻辑差不多。难道是代码错了,比对了一下,大体机构相似。后来甚至改成相同的,结果人家的能出来详情页结果,然而我的就是出来不了。不行。。。
然后我就单独写了一个爬虫去爬取详情页内容。因为上面的循环url不能 使用,依然采取了教程中的“下一页”方式。
分页的代码:

import scrapy


class JsInfoSpider(scrapy.Spider):
    name = 'infosthree'

    start_urls = ['http://ggglxy.scu.edu.cn/index.php?c=article&a=type&tid=18'
                  ]

    def parse(self, response):
        # follow links to author pages
        for href in response.xpath('//li[@class="f1"]/div[@class="1 f1"]/a/@href').extract():
            yield scrapy.Request(response.urljoin(href),
                                 callback=self.parse)
            # follow pagination links
            next_page = response.xpath('//div[@class="pager cf tc pt10 pb10 mobile_dn"]/li/a/@href').extract_first()
            if next_page is not None:
                next_page = response.urljoin(next_page)
                yield scrapy.Request(next_page, callback=self.parse_moreinfos)

        def parse_moreinfos(self, response):
            def extract_with_xpath(query):
                return response.xpath(query).extract_first ().strip ()
            yield {
                'jsname': extract_with_xpath('//div[@class="r fr"]/h3/text()'),
                'jsresume': extract_with_xpath('//div[@class="r fr"]/div[@class="desc"]/text()'),
            }

不分页的代码:

import scrapy


class JsInfoSpider(scrapy.Spider):
    name = 'infosthree'
    start_urls = ['http://ggglxy.scu.edu.cn/index.php?c=article&a=type&tid=18']

    def parse(self, response):
        # follow links to author pages
        for href in response.xpath('//div[@class="1 f1"]/a/@href'):
            yield response.follow(href, self.parse_infosthree)
    @staticmethod
    def parse_infosthree(response):
        def extract_with_xpath(query):
                return response.xpath(query).extract_first().strip()
        yield {
                'jssrc': extract_with_xpath('//div[@class="1 f1"]/img/src'),
                'jsname': extract_with_xpath('//div[@class="r fr"]/h3/text()'),
                'jsresume': extract_with_xpath('//div[@class="r fr"]/div[@class="desc"]/text()'),
         }

结果依然不行啊。于是决定只是爬取第一页的详情页内容看看,这时发现反复报的是同样的错。


错误报告

页面不存在?
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容