四川大学公共管理学院新闻内容爬取

目录##

  • 任务内容
  • 爬取过程
  • 总结

<b>任务内容</b>
此次抓取的内容为四川大学公共管理学院新闻专栏里的新闻,包括新闻的时间、标题、图片以及详情内容。

xinwen.png

这是需要爬的新闻

neirong.png

这是新闻的详情

yeshu.png

这是总新闻数(目前为止)

<b>爬取过程</b>
1.首先创建一个新闻工程,并修改其中的items.py文件

创建项目.jpg

创建了一个名为“news”的项目

gaiitems.png

修改了items.py文件,其中的time、detail、title、picture是采集的时间、新闻详情、标题、图片。day是我采集过程中需要到的一个具体日期项(后有说明原因)。

2.一步一步渐进的抓取过程
秉乘着我一贯小心翼翼的态度,我的抓取过程是慢慢来的,首先是爬取一页新闻列表(不包括新闻详情里面的内容),然后开始加入多页爬取,再到爬取多页的新闻详情(虽然过程比较麻烦,但是这样的方法能够使错误发现得快,且思路较清晰,容易跟得上)。
<p>> 2.1爬取一页新闻列表
爬取一页新闻列表的代码就比较简单了,这也是最开始学习爬虫的时候学习的代码。
这一步只需要采集新闻的标题和时间。

import scrapy
from news.items import NewsItem

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

    def parse(self, response):
       for new in response.xpath('//div[@class="newsinfo_box cf"]'):
            item = NewsItem()
            item['time'] = new.xpath('div[@class="date fl"]/span/text()').extract()
            item['day'] = new.xpath('div[@class="date fl"]/p/text()').extract()
            item['title'] = new.xpath('div[@class="news_c fr"]/h3[@class="mb10"]/a/text()').extract()
            yield item  

解析:这是在新闻列表页爬取的时间及标题数据,在列表页,可以看到时间的“年-月”和“日”是分开的,这是因为列表页将日期做成一个日历格式的原因,所以在源代码中,他们在不同的地方。所以我在时间上用了两个参数:time、day,一个爬年月,一个爬日

1.png

爬取结果显示
danye1.png

结果中的中文显示得是乱码,百度以后查到是编码问题,随后去修改了settings.py文件。增加一行代码:
FEED_EXPORT_ENCODING = 'utf-8'
<p>重新爬取以后,结果就对了。
danye2.png

<p>> 2.2爬取多页新闻列表
爬取多页需要加入循环爬取下一页的代码。

import scrapy
from news.items import NewsItem

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

    def parse(self, response):
        for new in response.xpath('//div[@class="newsinfo_box cf"]'):
            item = NewsItem()
            item['time'] = new.xpath('div[@class="date fl"]/span/text()').extract()
            item['day'] = new.xpath('div[@class="date fl"]/p/text()').extract()
            item['title'] = new.xpath('div[@class="news_c fr"]/h3[@class="mb10"]/a/text()').extract()
            yield item

        next_page = response.xpath('//div[@class="pager cf tr pt10 pb10 mt30 mobile_dn"]/li[last()-1]/a/@href').extract_first()
        last_page = response.xpath('//div[@class="pager cf tr pt10 pb10 mt30 mobile_dn"]/li[last()]/a/@href').extract_first()
        if last_page is not None:
           next_page = response.urljoin(next_page)
           yield scrapy.http.Request(next_page, callback=self.parse)  

解析:在爬取下一页时,发现这个网站爬的下一页有些问题

duoye1.png

从网站源代码的分页代码中可以看出,它的下一页是没有标志属性的,都是统一的li标签,如果在写路径的时候直接写li,爬虫是无法去按我们想的那样去爬下一页链接。这时候就需要写一些属性让爬虫识别。还好的是它的顺序都是最后一项是“尾页”,倒数第二项是“下一页”,这样只要li中增加[last()-1]的谓语,就能够顺利爬到下一页的链接。但是即使这样,还是出现一个问题。

duoye2.png

duoye3.png

图中可以看出,在新闻的最后一页,它没有尾页也没有下一页选项,它的倒数第二个选项是第九页。这就尴尬了,如果按照这个方法爬取,它分页循环爬取的时候,无法判断是否已经达到最后一页,最后会在第九页和第十页之间反复爬取。这时候,就需要设置一个判断,判断它是否是到了最后一页。仔细看最后一页的源代码,可以看到其最后一个li是没有链接的!!!这时候,我们可以利用这一点,判断其最后一个li是否有链接,如果没有了,它就是最后一页,停止继续爬行。

duoye4.png

这是爬取所有新闻的列表,共191条。

<p>> 2.3爬取多页新闻列表详情
爬取多页的时候仍然遇到了问题,我们需要链接链到详情页里面爬取新闻的内容和图片,这样的话需要在当前页面爬时间,爬标题,再进入链接里面爬内容。这样的话要分两个函数(是应该称为函数吗?)进行爬取,中间还有点绕。但我发现详情页面有时间和标题,突然顿悟可以直接链接进去进行需要的全部数据爬取,于是,把之前的代码改动了一些,进行爬取。

import scrapy
from news.items import NewsItem

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

    def parse(self, response):
        for href in response.xpath('//div[@class="news_c fr"]/h3[@class="mb10"]/a/@href').extract():
        yield scrapy.http.Request(response.urljoin(href), callback=self.parse_news)

        next_page = response.xpath('//div[@class="pager cf tr pt10 pb10 mt30 mobile_dn"]/li[last()-1]/a/@href').extract_first()
        last_page = response.xpath('//div[@class="pager cf tr pt10 pb10 mt30 mobile_dn"]/li[last()]/a/@href').extract_first()
        if last_page is not None:
            next_page = response.urljoin(next_page)
            yield scrapy.http.Request(next_page, callback=self.parse)

    def parse_news(self, response):
        for new in response.xpath('//div[@class="right_info p20"]'):
            item = NewsItem()
            item['time'] = new.xpath('div[@class="detail_zy_title"]/p/text()').extract()
            item['title'] = new.xpath('div[@class="detail_zy_title"]/h1/text()').extract()
            item['detail'] = new.xpath('div[@class="detail_zy_c pb30 mb30"]/p/span/text()').extract()
            item['picture'] = new.xpath('div[@class="detail_zy_c pb30 mb30"]/p/img/@src').extract()
            yield item  

前一个def是进入链接,然后返回到第二个def进行数据爬取。

all.png

这个是爬取的最终结果。其中还有几点其实应该进行完善。
第一,图片只是一个路径,无法显示。
第二,新闻详细内容中,有些存在较多的空格及/n、/r等乱七八糟的东西。
但是心累了,以后再慢慢研究吧。

<b>总结</b>
我觉得自己这种一点一点进行的想法挺好,至少我能懂它每一块代码在做什么,也能理清他们之间的关系。这个方法效率不高,也当真花了不少的时间,但其中的收获是满满的。
这次爬取过程懂得了分页和链接详情爬取,确实比在课堂上做的那个好得多。纠错的过程固然心累,但实践出真知,挺有道理的。
还需要学习同时爬取当前网页及链接网页内容的方法。再接再厉吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容