网页源代码抓取工具(抓取四川大学公共管理学院官网()所有的新闻咨询.实验流程)
优采云 发布时间: 2021-12-03 13:04网页源代码抓取工具(抓取四川大学公共管理学院官网()所有的新闻咨询.实验流程)
从四川大学公共管理学院官网获取所有新闻查询()。
实验过程
1.确定爬取目标。
2.制定爬取规则。
3.'Write/Debug' 爬取规则。
4.获取爬取数据
1.确定爬取目标
这次我们要捕捉的目标是四川大学公共管理学院的所有新闻和信息。所以我们需要了解一下公共管理学院官网的布局。
微信截图_245.png
在这里我们发现,如果要抓取所有的新闻信息,不能在官网首页直接抓取,需要点击“更多”进入新闻主栏目。
Paste_Image.png
我们看到了具体的新闻栏目,但这显然不能满足我们的抓取需求:目前的新闻动态网页只能抓取新闻的时间、标题和网址,不能抓取新闻的内容。所以我们要进入到新闻详情页面来抓取新闻的具体内容。
2.制定爬取规则
通过第一部分的分析,我们会认为,如果要抓取一条新闻的具体信息,需要点击新闻动态页面,进入新闻详情页,才能抓取该新闻的具体内容。让我们点击一个新闻来试试看
Paste_Image.png
我们发现可以直接在新闻详情页抓取我们需要的数据:title、time、content.URL。
好了,现在我们对抓取一条新闻有了一个清晰的认识。但是如何抓取所有的新闻内容呢?
这对我们来说显然不难。
我们可以在新闻版块底部看到页面跳转按钮。然后我们可以使用“下一页”按钮来抓取所有新闻。
于是整理了一下思路,我们可以想到一个明显的爬取规则:
抓取“新闻版块”下的所有新闻链接,进入新闻详情链接即可抓取所有新闻内容。
3.'Write/Debug'爬取规则
为了使调试爬虫的粒度尽可能小,我将编写和调试模块结合起来。
在爬虫中,我会实现以下功能点:
1. 抓取页面新闻部分下的所有新闻链接
2. 通过抓取的一页新闻链接输入新闻详情,抓取所需数据(主要是新闻内容)
3. 通过循环抓取所有新闻。
对应的知识点是:
1. 抓取一个页面下的基本数据。
2. 对爬取的数据执行第二次爬取。
3.通过循环抓取网页的所有数据。
话不多说,现在就去做吧。
3.1 抓取页面新闻部分下的所有新闻链接
Paste_Image.png
通过对新闻版块源码的分析,我们发现抓取到的数据的结构是
Paste_Image.png
那么我们只需要将爬虫的selector定位到(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())
测试,通过!
Paste_Image.png
3.2 通过抓取的一页新闻链接输入新闻详情,抓取所需数据(主要是新闻内容)
现在我已经获得了一组网址,现在我需要输入每个网址来抓取我需要的标题、时间和内容。代码实现也很简单。我只需要输入网址,在原代码抓取网址时抓取即可。只需获取相应的数据。所以,我只需要再写一个爬取方法进入新闻详情页,使用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
测试,通过!
Paste_Image.png
这时候我们添加一个循环:
<p>NEXT_PAGE_NUM = 1
NEXT_PAGE_NUM = NEXT_PAGE_NUM + 1
if NEXT_PAGE_NUM