Scrapy采集新闻资源音信实验报告,scrapy分页抓取四川大学公管大学助教音信

试验对象:广东大学共用法大学官网–音讯动态页
试行指标:运用Scrapy框架进行实际信息的征集以巩固和坚实音讯搜索能力
试验进程:分析采集实体->分明采集方法->制定爬取规则->编写代码并调试->获得数码
———————————欢迎纠错和咨询!24钟头在线不打烊!!———————

至于职责思考:
1.规定爬虫入口:


        'http://ggglxy.scu.edu.cn/index.php?c=article&a=type&tid=18&page_1_page=1',
    ]```

确定爬虫入口应该是编写爬虫的第一步,但是很不幸,我在第一步就走偏了
,从公共管理学院首页进到师资队伍页面获得的网址是
>http://ggglxy.scu.edu.cn/index.php?c=article&a=type&tid=18

但是从这个网址我无法获得下一页的绝对链接,在执行爬虫的过程中,我就遇上了URLERROR的错误。
2. 爬取思路:

![图片.png](http://upload-images.jianshu.io/upload_images/5836258-6d105bf11bddd057.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
从这张图,可以看出,我们可以在目录页抓取教师姓名、教师职位、教师所属专业、教师邮箱,因此我们只需要在详情页获取教师的简介就可以了。

![下一页.png](http://upload-images.jianshu.io/upload_images/5836258-30fc8c1747de1b0c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

从网站的目录页中,每页有八项数据,我需要拿到每一项的数据的链接,同时还需要拿到「下一页」的链接。因为下一页的结构和第一页的结构相同,所以我将下一页的连接传给pasre处理,而每一项数据的链接交给pasre_content处理。
3. 代码实现:
3.1 items.py文件:
目录
  1. 浅析采集实体
  2. 分明采集方法
  3. 制定爬取规则
  4. 编写制定代码并调试
  5. 赢得数码
  6. 部分常用排错方法和技术
  7. 普遍报错消息集中
  8. 小结和清醒

class TeacherItem(scrapy.Item)
name = scrapy.Field() #名师姓名
position = scrapy.Field() #老师岗位
intro = scrapy.Field() #教师
email = scrapy .Field() #师资邮箱
major = scrapy.Field()#教员职员和工人所属专业
pass

1. 分析采集实体

我们本次数据搜集的靶子内容是四川大学公管的新闻资源音讯。首先,大家供给分析网页的基本点内容,并鲜明数据搜集的实业。

音讯资源信息首页1

新闻资源信息首页2

资源音信详情页

我们得以行使开发者工具或查看网页源码的措施对网页内容进行更深刻的剖析。

chrome开发者工具

能够看出,我们供给采集的实体一共有多少个,分别是标题(title),日期(date),内容(content)和图纸(img)。

 3.2 spider代码:
处理目录页的教师信息的代码:

2. 规定采集方法

咱俩早就理解到,采集的实体共多少个,在这之中,标题和日期在首页和详情页均有显示,由此我打算先收集首页转向详情页的链接,再进入第三层详情页实行多少搜集。
首页的消息列表是分页展现的,大家还亟需考虑采集下一页新闻列表的措施。

首页的下一页按钮

其余页的下一页按钮

着眼可见,我们并不能确切定位到下一页的url,一方面下一页按钮的url路径与其它页码的路子相同,另一方面它并不是定点在同1个主次的。
而是大家得以在<li
class=”c”></li>标签中取妥当前页面包车型客车页码,与下一页的url固定格式进行字符串连接获得实在的下一页。

def parse(self,response):
for quote in response.css(‘ul.teachers_ul.mt20.cf li.fl’):
item = TeacherItem()
item[‘name’] = quote.css(‘div.r.fr
h3.mb10::text’).extract_first()#名师名字
item[‘position’] = quote.css(‘div.r.fr
p.color_main.f14::text’).extract_first()#教授岗位
item[‘major’] = quote.css(‘div.r.fr div.desc
p::text’).extract_first()#导师所属专业
item[’email’] = response.xpath(‘//div[@class=”r
fr”]/div[@class=”desc”]/p[last()]/text()’).extract()#师资邮箱
url = response.urljoin(quote.css(‘div.l.fl
a::attr(“href”)’).extract_first())#先生详情页链接
request=scrapy.http.Request(url,callback=self.parse_content)#将赢得的音信传给详情页处理器
request.meta[‘item’]=item
yield request“`
处理下一页的链接的代码:

3. 制定爬取规则

此间本人都接纳css选取器的不二法门开始展览成分定位,并写出了完整路径(假设不明显是或不是足以精分明位到某成分,尽量写完整路径。)

url规则

div.pb30.mb30 div.right_info.p20.bgf9 ul.index_news_ul.dn li
a.fl::attr(href)

next_page规则

div.w100p div.px_box.w1000.auto.ovh.cf div.pb30.mb30
div.mobile_pager.dn li.c::text

title规则

div.w1000.auto.cf div.w780.pb30.mb30.fr div.right_info.p20
div.detail_zy_title h1::text

time规则

div.w1000.auto.cf div.w780.pb30.mb30.fr div.right_info.p20
div.detail_zy_title p::text

content规则1

content规则2

那里四个段子的路线不平等,为了保证多个段落都得以被采访到,选取范围较大的选用器。

div.w1000.auto.cf div.w780.pb30.mb30.fr div.right_info.p20
div.detail_zy_c.pb30.mb30 p span::text

img规则

div.w1000.auto.cf div.w780.pb30.mb30.fr div.right_info.p20
div.detail_zy_c.pb30.mb30 p.MsoNormal img::attr(src)

      next_page = response.xpath('//div[@class="pager cf tc pt10 pb10 mobile_dn"]/li[last()-1]/a/@href').extract_first()   #获取下一页的链接
        if next_page is not None:
            next_full_url = response.urljoin(next_page)
            yield scrapy.Request(next_full_url, callback=self.parse)  #判断是有有下一页,有的话,就将url传给自身

4. 编辑代码并调节

scrapy startproject ggnews
cd /ggnews/ggnews

在那边修改items.py的代码
# –– 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 GgnewsItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    time = scrapy.Field()
    content = scrapy.Field()
    img = scrapy.Field()

cd spiders

编写ggnews.py

import scrapy

from ggnews.items import GgnewsItem

class GgnewsSpider(scrapy.Spider):
    name = "ggnews"
    start_urls = [
        'http://ggglxy.scu.edu.cn/index.php?c=special&sid=1',
    ]

    def parse(self, response):
        for href in response.css('div.pb30.mb30 div.right_info.p20.bgf9 ul.index_news_ul.dn li a.fl::attr(href)'):
            url = response.urljoin(href.extract())
            yield scrapy.Request(url, callback=self.parse2)

            next_page = response.css('div.w100p div.px_box.w1000.auto.ovh.cf div.pb30.mb30 div.mobile_pager.dn li.c::text').extract_first()
            if next_page is not None:
                next_url = int(next_page) + 1
                next_urls = '?c=special&sid=1&page=%s' % next_url
                print next_urls
                next_urls = response.urljoin(next_urls)
                yield scrapy.Request(next_urls,callback = self.parse)

    def parse2(self, response):
        items = []
        for new in response.css('div.w1000.auto.cf div.w780.pb30.mb30.fr div.right_info.p20'):
                item = GgnewsItem()
                item['title'] = new.css('div.detail_zy_title h1::text').extract_first(),
                item['time'] = new.css('div.detail_zy_title p::text').extract_first(),
                item['content'] = new.css('div.detail_zy_c.pb30.mb30 p span::text').extract(),
                item['img'] = new.css('div.detail_zy_c.pb30.mb30 p.MsoNormal img::attr(src)').extract(),
                items.append(item)

        return items

处理每一项数据链接的代码:

5. 拿走数码

scrapy crawl ggnews -o ggnews.xml

某个爬取数据

执行结果参数

一部分xml数据呈现

 def parse_content(self,response):
        for site in response.css('div.js_infobox.cf'):
            item = response.meta['item']#接收meta传递过来的数据,即姓名、邮箱、职位等信息
            item['intro']= site.css('div.r.fr div.desc::text').extract_first()
            yield item

6. 有个别广阔的排错方法和技巧

在编辑这一个代码的进度中,小编以为成分的原则性是最难的,路径不对数据就爬不出。
3.3 执行爬虫
同等选取scrapy crawl quotes指令来推行爬虫,爬取之后下载文件,打开:

怎么防止现身错误空格

设若你在写代码的经过中,非常的大心把空格和制表符<tab>混用,就很不难报错–
赶尽杀绝办法是设置你的IDE(代码编辑器)能够为你体现区分空格和制表符,就如这么

空格和制表符

现实设置方式请自行百度:‘xxx怎么着显示空格和制表符’

图片 1

怎么检查xpath/css定位是还是不是正确

用scrapy shell举办调节
课程在此间:http://scrapy-chs.readthedocs.io/zh\_CN/1.0/topics/shell.html

数据.png

什么样查看错误消息

鉴于文件暗中认可的是unicode编码格式,所以本身爬取到的数目是一堆小编看不懂数据。作者先是尝试了同桌利用过并实用的
scrapy crawl quotes -o teacher.json -s FEED_EXPORT_ENCODING=utf-8
一声令下,结果生成的照旧unicode编码格式的公文。
3.4 处理unicode编码难题
因此网上搜寻,笔者利用了下边的法子消除难题:
修改pipelines.py文件:

7. 广泛报错新闻汇聚

import json
import codecs


class QuotesPipeline(object):
    def __init__(self):
        self.file =codecs.open('teacher.json','wb',encoding='utf-8')
    def process_item(self, item, spider):
        line=json.dumps(dict(item))+'\n'
        self.file.write(line.decode("unicode_escape"))
        return item

8. 总计和清醒

在进行多少收集的进程中,爬取数据的不二法门和规则是数额搜集的主干与精华。不仅需求对全体页面包车型客车组织和布局有深刻的知情和认得,而且亟需耐心和仔细,经过一再相比和推敲,才能使本身的爬虫规则进一步完美。

在pipelines.py这一个文件中,通过编写制定QuotesPipeline来促成对item的拍卖。它根本成就数据的查重、遗弃,验证item中的数据,将赢得的item数据保存等工作。在那之中process_item方法将收获的item完成解码,一边日常展现普通话,最后保存到json文件中。
在编制完pipelines.py后,为了运转它,必须将其插手到ITEM_PIPELINES配置中:

ITEM_PIPELINES = {
    'quotes.pipelines.QuotesPipeline':300
}

修改完那一个文件后,小编重新实施spiders,将获得的结果保存并下载:

图片 2

图片.png

本次,数据展示不荒谬,共抓取到了126个人名师的音讯,个中囊括了名师的人名、职位、所属专业、邮箱与简介。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图