网页新闻抓取(抓取四川大学公共管理学院官网()所有的新闻咨询.实验流程1.确定抓取目标)

优采云 发布时间: 2022-01-12 22:00

  网页新闻抓取(抓取四川大学公共管理学院官网()所有的新闻咨询.实验流程1.确定抓取目标)

  本文摘自php中文网,作者php中文网,侵删。

  从四川大学公共管理学院官网获取所有新闻查询。实验过程

  1.确定获取目标。

  2.创建抓取规则。

  3.'Write/debug' 抓取规则。

  4.获取爬取数据

  1.识别爬取目标

  这次我们要抢的目标是四川大学公共管理学院的所有新闻资讯。所以我们需要知道公共管理学院官网的布局。

  

  微信截图_245.png

  在这里我们发现,如果要抓取所有新闻信息,不能直接在官网首页抓取,需要点击“更多”进入综合新闻版块。

  

  Paste_Image.png

  我们看到了具体的新闻版块,但这显然不能满足我们的抓取需求:当前的新闻动态页面只能抓取新闻的时间、标题和网址,而不能抓取新闻的内容。所以我们要进入新闻详情页面去抓取新闻的具体内容。

  2.创建抓取规则

  通过第一部分的分析,我们会认为如果要抓取一条新闻的具体信息,需要从新闻动态页面点击进入新闻详情页面,抓取新闻的具体内容。让我们点击新闻试试

  

  Paste_Image.png

  我们发现可以直接在新闻详情页抓取我们需要的数据:标题、时间、内容.URL。

  好了,现在我们对抢一条新闻有了清晰的认识。但是如何抓取所有的新闻内容呢?

  这对我们来说显然并不难。

  

  我们可以在新闻部分的底部看到页面跳转按钮。然后我们可以通过“下一页”按钮抓取所有新闻。

  所以整理思路后,我们可以想到一个明显的抓取规则:

  通过抓取“新闻版块”下的所有新闻链接,进入新闻详情链接即可抓取所有新闻内容。

  3.'Write/Debug' 抓取规则

  为了让调试爬虫的粒度尽可能小,我把编写和调试模块组合在一起。

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

  1.从新闻版块下的所有新闻链接中爬出一页

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

  3.通过循环抓取所有新闻。

  对应的知识点为:

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

  2.对爬取的数据进行二次爬取。

  3.通过循环爬取网页的所有数据。

  事不宜迟,我们现在就开始吧。

  3.1 爬出页面新闻版块下的所有新闻链接

  

  Paste_Image.png

  通过对新闻栏目源码的分析,我们发现抓取到的数据结构如下:

  

  Paste_Image.png

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

  编写代码

  import scrapyclass 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())

  测试并通过!

  

  Paste_Image.png

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

  现在我已经获取了一组网址,现在我需要输入每个网址来抓取我需要的标题、时间和内容。代码实现也很简单,只需要在原代码抓取网址时输入网址,抓取到对应的数据即可。所以,我只需要再写一个grab方法进入新闻详情页面,并使用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'] = responseitem['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 scrapyfrom ggglxy.items import GgglxyItemclass 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

  测试并通过!

  

  Paste_Image.png

  然后我们添加一个循环:

<p>NEXT_PAGE_NUM = 1

NEXT_PAGE_NUM = NEXT_PAGE_NUM + 1if NEXT_PAGE_NUM

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线