网页新闻抓取(Python案例scrapy抓取学院新闻报告任务抓取公共管理学院官网)
优采云 发布时间: 2022-03-29 15:17网页新闻抓取(Python案例scrapy抓取学院新闻报告任务抓取公共管理学院官网)
蟒蛇案例
scrapy 抓取大学新闻报道
任务
从四川大学公共管理学院官方网站获取所有新闻和查询。
实验过程
1.确定获取目标。
2.创建抓取规则。
3.编写/调试抓取规则。
4.获取爬取数据
1.识别爬取目标
这次我们要抢的目标是四川大学公共管理学院的所有新闻资讯。所以我们需要知道公共管理学院官网的布局。
在这里我们发现,如果要抓取所有新闻信息,不能直接在官网首页抓取,需要点击“更多”进入综合新闻版块。
我们看到了具体的新闻板块,但这显然不能满足我们的抓取需求:目前的新闻动态网页只能抓取新闻的时间、标题和网址,而不能抓取新闻的内容。所以我们要进入新闻详情页面去抓取新闻的具体内容。
2.创建抓取规则
通过第一部分的分析,我们会认为如果要抓取一条新闻的具体信息,需要从新闻动态页面点击进入新闻详情页面,抓取新闻的具体内容。让我们点击新闻试试
我们发现可以直接在新闻详情页抓取我们需要的数据:标题、时间、内容.URL。
好了,现在我们对抢一条新闻有了清晰的认识。但是如何抓取所有的新闻内容呢?
这对我们来说显然并不难。
我们可以在新闻部分的底部看到页面跳转按钮。然后我们可以通过“下一页”按钮抓取所有新闻。
所以整理思路后,我们可以想到一个明显的抓取规则:
通过抓取新闻版块下的所有新闻链接,进入新闻详情链接即可抓取所有新闻内容。
3.编写/调试抓取规则
为了让调试爬虫的粒度尽可能小,我把编写和调试模块组合在一起。
在爬虫中,我将实现以下功能点:
1.从新闻版块下的所有新闻链接中爬出一页
2.通过一个页面上爬取的新闻链接,进入新闻详情,爬取需要的数据(主要是新闻内容)
3.通过循环抓取所有新闻。
对应的知识点为:
1.爬出一个页面下的基础数据。
2.对爬取的数据进行二次爬取。
3.通过循环爬取网页的所有数据。
事不宜迟,我们现在就开始吧。
3.1 爬出页面新闻版块下的所有新闻链接
通过对新闻栏目源码的分析,我们发现抓取到的数据结构如下:
那么我们只需要将爬虫的选择器定位到(li:newsinfo_box_cf),然后执行for循环即可抓取。
编写代码
import scrapyclass News2Spider(scrapy.Spider):
测试并通过!
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] = response item[title] = response.xpath("//div[@class=detail_zy_title]/h1/text()").extract_first()
整合到原代码中后,有:
import scrapyfrom ggglxy.items import GgglxyItemclass News2Spider(scrapy.Spider):
测试并通过!
然后我们添加一个循环:
NEXT_PAGE_NUM = 1 NEXT_PAGE_NUM = NEXT_PAGE_NUM + 1
添加到原创代码中:
import scrapyfrom ggglxy.items import GgglxyItem
测试:
Paste_Image.png
捕获的数量是191,但我们在官网上找到了193条新闻,少了两条。
为什么?我们注意到日志中有两个错误:
定位问题:原来学院新闻栏目有两个隐藏的二级栏目:
例如:
Paste_Image.png
对应的网址是
Paste_Image.png
网址都不一样,难怪抓不到!
那么我们要对这两个二级列的url设置特殊的规则,只需要添加判断是否是二级列:
if URL.find(type) != -1: yield scrapy.Request(URL, callback=self.parse)
组装原函数:
import scrapy
测试:
4.获取爬取数据
scrapy crawl news_info_2 -o 0016.json
如果您在学习过程中遇到任何问题或想获取学习资源,欢迎加入学习交流群
626062078,一起学Python吧!