python爬取学校新闻_Python抓取学院新闻报告

们发现,我们能够直接在新闻详情页面抓取到我们需要的数据:标题,时间,内容.URL.

好,到现在我们清楚抓取一篇新闻的思路了.但是,如何抓取所有的新闻内容呢?

这显然难不到我们.

1240

我们在新闻栏目的最下方能够看到页面跳转的按钮.那么我们可以通过"下一页"按钮实现抓取所有的新闻.

那么整理一下思路,我们能够想到一个显而易见的抓取规则:

通过抓取'新闻栏目下'所有的新闻链接,并且进入到新闻详情链接里面抓取所有的新闻内容.

3.'编写/调试'抓取规则

为了让调试爬虫的粒度尽量的小,我将编写和调试模块糅合在一起进行.

在爬虫中,我将实现以下几个功能点:

1.爬出一页新闻栏目下的所有新闻链接

2.通过爬到的一页新闻链接进入到新闻详情爬取所需要数据(主要是新闻内容)

3.通过循环爬取到所有的新闻.

分别对应的知识点为:

1.爬出一个页面下的基础数据.

2.通过爬到的数据进行二次爬取.

3.通过循环对网页进行所有数据的爬取.

话不多说,现在开干.

3.1爬出一页新闻栏目下的所有新闻链接

1240

通过对新闻栏目的源代码分析,我们发现所抓数据的结构为

1240

那么我们只需要将爬虫的选择器定位到(li:newsinfo_box_cf),再进行for循环抓取即可.

编写代码

import scrapy

class News2Spider(scrapy.Spider):

name = "news_info_2"

start_urls = [

"http://ggglxy.scu.edu.cn/index.php?c=special&sid=1&page=1",

]

def parse(self, response):

for href in response.xpath("//div[@class='newsinfo_box cf']"):

url = response.urljoin(href.xpath("div[@class='news_c fr']/h3/a/@href").extract_first())

测试,通过!

1240

3.2通过爬到的一页新闻链接进入到新闻详情爬取所需要数据(主要是新闻内容)

现在我获得了一组URL,现在我需要进入到每一个URL中抓取我所需要的标题,时间和内容,代码实现也挺简单,只需要在原有代码抓到一个URL时进入该URL并且抓取相应的数据即可.所以,我只需要再写一个进入新闻详情页的抓取方法,并且使用scapy.request调用即可.

编写代码

#进入新闻详情页的抓取方法

def parse_dir_contents(self, response):

item = GgglxyItem()

item['date'] = response.xpath("//div[@class='detail_zy_title']/p/text()").extract_first()

item['href'] = response

item['title'] = response.xpath("//div[@class='detail_zy_title']/h1/text()").extract_first()

data = response.xpath("//div[@class='detail_zy_c pb30 mb30']")

item['content'] = data[0].xpath('string(.)').extract()[0]

yield item

整合进原有代码后,有:

import scrapy

from ggglxy.items import GgglxyItem

class News2Spider(scrapy.Spider):

name = "news_info_2"

start_urls = [

"http://ggglxy.scu.edu.cn/index.php?c=special&sid=1&page=1",

]

def parse(self, response):

for href in response.xpath("//div[@class='newsinfo_box cf']"):

url = response.urljoin(href.xpath("div[@class='news_c fr']/h3/a/@href").extract_first())

#调用新闻抓取方法

yield scrapy.Request(url, callback=self.parse_dir_contents)

#进入新闻详情页的抓取方法

def parse_dir_contents(self, response):

item = GgglxyItem()

item['date'] = response.xpath("//div[@class='detail_zy_title']/p/text()").extract_first()

item['href'] = response

item['title'] = response.xpath("//div[@class='detail_zy_title']/h1/text()").extract_first()

data = response.xpath("//div[@class='detail_zy_c pb30 mb30']")

item['content'] = data[0].xpath('string(.)').extract()[0]

yield item

测试,通过!

1240

这时我们加一个循环:

NEXT_PAGE_NUM = 1

NEXT_PAGE_NUM = NEXT_PAGE_NUM + 1

if NEXT_PAGE_NUM<11:

next_url = 'http://ggglxy.scu.edu.cn/index.php?c=special&sid=1&page=%s' % NEXT_PAGE_NUM

yield scrapy.Request(next_url, callback=self.parse)

加入到原本代码:

import scrapy

from ggglxy.items import GgglxyItem

NEXT_PAGE_NUM = 1

class News2Spider(scrapy.Spider):

name = "news_info_2"

start_urls = [

"http://ggglxy.scu.edu.cn/index.php?c=special&sid=1&page=1",

]

def parse(self, response):

for href in response.xpath("//div[@class='newsinfo_box cf']"):

URL = response.urljoin(href.xpath("div[@class='news_c fr']/h3/a/@href").extract_first())

yield scrapy.Request(URL, callback=self.parse_dir_contents)

global NEXT_PAGE_NUM

NEXT_PAGE_NUM = NEXT_PAGE_NUM + 1

if NEXT_PAGE_NUM<11:

next_url = 'http://ggglxy.scu.edu.cn/index.php?c=special&sid=1&page=%s' % NEXT_PAGE_NUM

yield scrapy.Request(next_url, callback=self.parse)

def parse_dir_contents(self, response):

item = GgglxyItem()

item['date'] = response.xpath("//div[@class='detail_zy_title']/p/text()").extract_first()

item['href'] = response

item['title'] = response.xpath("//div[@class='detail_zy_title']/h1/text()").extract_first()

data = response.xpath("//div[@class='detail_zy_c pb30 mb30']")

item['content'] = data[0].xpath('string(.)').extract()[0]

yield item

测试:

1240

Paste_Image.png

抓到的数量为191,但是我们看官网发现有193条新闻,少了两条.

为啥呢?我们注意到log的error有两条:

定位问题:原来发现,学院的新闻栏目还有两条隐藏的二级栏目:

比如:

1240

Paste_Image.png

对应的URL为

1240

Paste_Image.png

URL都长的不一样,难怪抓不到了!

那么我们还得为这两条二级栏目的URL设定专门的规则,只需要加入判断是否为二级栏目:

if URL.find('type') != -1:

yield scrapy.Request(URL, callback=self.parse)

组装原函数:

import scrapy

from ggglxy.items import GgglxyItem

NEXT_PAGE_NUM = 1

class News2Spider(scrapy.Spider):

name = "news_info_2"

start_urls = [

"http://ggglxy.scu.edu.cn/index.php?c=special&sid=1&page=1",

]

def parse(self, response):

for href in response.xpath("//div[@class='newsinfo_box cf']"):

URL = response.urljoin(href.xpath("div[@class='news_c fr']/h3/a/@href").extract_first())

if URL.find('type') != -1:

yield scrapy.Request(URL, callback=self.parse)

yield scrapy.Request(URL, callback=self.parse_dir_contents)

global NEXT_PAGE_NUM

NEXT_PAGE_NUM = NEXT_PAGE_NUM + 1

if NEXT_PAGE_NUM<11:

next_url = 'http://ggglxy.scu.edu.cn/index.php?c=special&sid=1&page=%s' % NEXT_PAGE_NUM

yield scrapy.Request(next_url, callback=self.parse)

def parse_dir_contents(self, response):

item = GgglxyItem()

item['date'] = response.xpath("//div[@class='detail_zy_title']/p/text()").extract_first()

item['href'] = response

item['title'] = response.xpath("//div[@class='detail_zy_title']/h1/text()").extract_first()

data = response.xpath("//div[@class='detail_zy_c pb30 mb30']")

item['content'] = data[0].xpath('string(.)').extract()[0]

yield item

测试:

1240

4.获得抓取数据

scrapy crawl news_info_2 -o 0016.json

学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入学习交流群

626062078,我们一起学Python!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值