Scrapy采集新闻资讯实验报告

简介: 实验对象:四川大学公共管理学院官网--新闻动态页实验目的:运用Scrapy框架进行实际信息的采集以巩固和提高信息检索能力实验过程:分析采集实体->确定采集方法->制定爬取规则->编写代码并调试->得到数据---------------------...

实验对象:四川大学公共管理学院官网--新闻动态页
实验目的:运用Scrapy框架进行实际信息的采集以巩固和提高信息检索能力
实验过程:分析采集实体->确定采集方法->制定爬取规则->编写代码并调试->得到数据
---------------------------------欢迎纠错和提问!24小时在线不打烊!!---------------------


目录
  1. 分析采集实体
  2. 确定采集方法
  3. 制定爬取规则
  4. 编写代码并调试
  5. 得到数据
  6. 一些常用排错方法和技巧
  7. 常见报错信息汇总
  8. 总结和感悟

1. 分析采集实体

我们此次数据采集的目标内容是川大公管的新闻资讯。首先,我们需要分析网页的主要内容,并确定数据采集的实体。

img_1fb4791052c27840fb084493daf48190.png
新闻资讯首页1

img_04d43c32f0fc77122920ee7174e0a9b0.png
新闻资讯首页2

img_c6bdf94edd56c0e5e1e09babffae2a79.png
新闻详情页

我们可以使用开发者工具或查看网页源码的方式对网页内容进行更深入的分析。

img_383f03d9f827446b7be8718f926100ad.png
chrome开发者工具

可以看出,我们需要采集的实体一共有四个,分别是标题(title),日期(date),内容(content)和图片(img)。

2. 确定采集方法

我们已经了解到,采集的实体共4个,其中,标题和日期在首页和详情页均有显示,因此我打算先采集首页转向详情页的链接,再进入第二层详情页进行数据采集。
首页的新闻列表是分页显示的,我们还需要思考采集下一页新闻列表的方法。

img_7c4293bc87478eb2e07cac064a038e4f.png
首页的下一页按钮
img_243f256b9b2fcb4014df84c57136081c.png
其他页的下一页按钮

观察可知,我们并不能准确定位到下一页的url,一方面下一页按钮的url路径与其他页码的路径相同,另一方面它并不是固定在同一个次序的。
但是我们可以在<li class="c"></li>标签中获取当前页面的页码,与下一页的url固定格式进行字符串连接得到真正的下一页。

3. 制定爬取规则

这里我都采用css选择器的方法进行元素定位,并写出了完整路径(如果不确定是否可以准确定位到某元素,尽量写完整路径。)

img_19901ba7071a7c3fe6b036cd1c940fe5.png
url规则

div.pb30.mb30 div.right_info.p20.bgf9 ul.index_news_ul.dn li a.fl::attr(href)

img_fe4d7f27490764faed44c14194405614.png
next_page规则

div.w100p div.px_box.w1000.auto.ovh.cf div.pb30.mb30 div.mobile_pager.dn li.c::text

img_863d62f9af6d778aeda9c8b81027649d.png
title规则

div.w1000.auto.cf div.w780.pb30.mb30.fr div.right_info.p20 div.detail_zy_title h1::text

img_53ba459a1043f0e0f69dd594af579e66.png
time规则

div.w1000.auto.cf div.w780.pb30.mb30.fr div.right_info.p20 div.detail_zy_title p::text

img_91da007bd71ea2cd2356f4d9b426392d.png
content规则1

img_ef6dde1ce303491998e3859b9d3fe83d.png
content规则2

这里两个段落的路径不一样,为了保证两个段落都可以被采集到,选用范围较大的选择器。

div.w1000.auto.cf div.w780.pb30.mb30.fr div.right_info.p20 div.detail_zy_c.pb30.mb30 p span::text

img_c334067b24cf145e120658ce7a3833be.png
img规则

div.w1000.auto.cf div.w780.pb30.mb30.fr div.right_info.p20 div.detail_zy_c.pb30.mb30 p.MsoNormal img::attr(src)

4. 编写代码并调试

scrapy startproject ggnews
cd /ggnews/ggnews

在这里修改items.py的代码
# -- coding: utf-8 --

# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html

import scrapy

class GgnewsItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    time = scrapy.Field()
    content = scrapy.Field()
    img = scrapy.Field()

cd spiders

编写ggnews.py

import scrapy

from ggnews.items import GgnewsItem

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

    def parse(self, response):
        for href in response.css('div.pb30.mb30 div.right_info.p20.bgf9 ul.index_news_ul.dn li a.fl::attr(href)'):
            url = response.urljoin(href.extract())
            yield scrapy.Request(url, callback=self.parse2)

            next_page = response.css('div.w100p div.px_box.w1000.auto.ovh.cf div.pb30.mb30 div.mobile_pager.dn li.c::text').extract_first()
            if next_page is not None:
                next_url = int(next_page) + 1
                next_urls = '?c=special&sid=1&page=%s' % next_url
                print next_urls
                next_urls = response.urljoin(next_urls)
                yield scrapy.Request(next_urls,callback = self.parse)

    def parse2(self, response):
        items = []
        for new in response.css('div.w1000.auto.cf div.w780.pb30.mb30.fr div.right_info.p20'):
                item = GgnewsItem()
                item['title'] = new.css('div.detail_zy_title h1::text').extract_first(),
                item['time'] = new.css('div.detail_zy_title p::text').extract_first(),
                item['content'] = new.css('div.detail_zy_c.pb30.mb30 p span::text').extract(),
                item['img'] = new.css('div.detail_zy_c.pb30.mb30 p.MsoNormal img::attr(src)').extract(),
                items.append(item)

        return items

5. 得到数据

scrapy crawl ggnews -o ggnews.xml

img_53c9ff5b6cc2a782cdeae0ead938e46d.png
部分爬取数据
img_0a7b89ff109bfc31c7b17454f7d5aa84.png
执行结果参数
img_64bda96c962c09e425f03e6afa9d3c91.png
部分xml数据展示

6. 一些常见的排错方法和技巧

如何避免出现错误空格

如果你在写代码的过程中,不小心把空格和制表符<tab>混用,就很容易报错--
解决方法是设置你的IDE(代码编辑器)可以为你显示区分空格和制表符,就像这样

img_87b2d354025528386cecfe4e3ddcf945.png
空格和制表符

具体设置方法请自行百度:‘xxx如何显示空格和制表符’

如何检查xpath/css定位是否正确

用scrapy shell进行调试
教程在这里:http://scrapy-chs.readthedocs.io/zh_CN/1.0/topics/shell.html

如何查看错误信息

7. 常见报错信息汇总

8. 总结和感悟

在进行数据采集的过程中,爬取数据的方法和规则是数据采集的核心与精华。不仅需要对整个页面的构造和布局有深入的理解和认识,而且需要耐心和细心,经过反复对比和推敲,才能使自己的爬虫规则更加完善。

目录
相关文章
|
数据采集 中间件 数据安全/隐私保护
Scrapy 采集内容如何输出保存到 jsonline
Scrapy 采集内容将如何输出保存到 jsonline
123 0
Scrapy 采集内容如何输出保存到 jsonline
|
存储 数据采集 数据可视化
【数据采集】使用scrapy采集天气网、豆瓣数据信息
第三次实验 实验 1 1.1 题目 1.2 思路 1.2.1 发送请求 1.2.2 解析网页 1.2.3 获取结点 1.2.4 数据保存 (单线程) 1.2.4 数据保存 (多线程) 实验 2 2.1 题目 2.2 思路 2.2.1 setting.py 2.2.2 item.py 2.2.3 wt_Spider.py 2.2.4 pipelines.py 实验 3 3.1 题目 3.2 思路 3.2.1 setting.py 3.2.2 item.py 3.2.3 db_Spider.py 3.2.4 pipelines.py 福利
110 0
【数据采集】使用scrapy采集天气网、豆瓣数据信息
|
XML 数据格式 Python
Scrapy采集“人民的名义”豆瓣评价实验报告
转载请注明出处!!! 实验对象:豆瓣电影--人民的名义 实验目的:通过使用scrapy框架采集“人民的名义”评价内容,进一步体会信息检索的过程。 实验过程:分析采集实体->确定采集方法->制定爬取规则->编写代码并调试->得到数据 人民的名义 ps:由于最近豆瓣发布的 Api V2测试版 需要授权 走oauth2,但是现在不开放key申请,所以直接爬了网页。
1367 0
|
2月前
|
数据采集 存储 数据处理
Scrapy:Python网络爬虫框架的利器
在当今信息时代,网络数据已成为企业和个人获取信息的重要途径。而Python网络爬虫框架Scrapy则成为了网络爬虫工程师的必备工具。本文将介绍Scrapy的概念与实践,以及其在数据采集和处理过程中的应用。
37 1
|
2月前
|
数据采集 调度 Python
Scrapy爬虫中合理使用time.sleep和Request
Scrapy爬虫中合理使用time.sleep和Request
|
2月前
|
数据采集 中间件 Python
Scrapy爬虫:利用代理服务器爬取热门网站数据
Scrapy爬虫:利用代理服务器爬取热门网站数据
|
1月前
|
数据采集 存储 中间件
Scrapy,作为一款强大的Python网络爬虫框架,凭借其高效、灵活、易扩展的特性,深受开发者的喜爱
【6月更文挑战第10天】Scrapy是Python的高效爬虫框架,以其异步处理、多线程及中间件机制提升爬取效率。它提供丰富组件和API,支持灵活的数据抓取、清洗、存储,可扩展到各种数据库。通过自定义组件,Scrapy能适应动态网页和应对反爬策略,同时与数据分析库集成进行复杂分析。但需注意遵守法律法规和道德规范,以合法合规的方式进行爬虫开发。随着技术发展,Scrapy在数据收集领域将持续发挥关键作用。
72 4
|
2月前
|
数据采集 存储 中间件
Python高效爬虫——scrapy介绍与使用
Scrapy是一个快速且高效的网页抓取框架,用于抓取网站并从中提取结构化数据。它可用于多种用途,从数据挖掘到监控和自动化测试。 相比于自己通过requests等模块开发爬虫,scrapy能极大的提高开发效率,包括且不限于以下原因: 1. 它是一个异步框架,并且能通过配置调节并发量,还可以针对域名或ip进行精准控制 2. 内置了xpath等提取器,方便提取结构化数据 3. 有爬虫中间件和下载中间件,可以轻松地添加、修改或删除请求和响应的处理逻辑,从而增强了框架的可扩展性 4. 通过管道方式存储数据,更加方便快捷的开发各种数据储存方式
|
1月前
|
数据采集 NoSQL MongoDB
使用多进程和 Scrapy 实现高效的 Amazon 爬虫系统
在这篇博客中,将展示如何使用多进程和 Scrapy 来构建一个高效的 Amazon 爬虫系统。通过多进程处理,提高爬虫的效率和稳定性,同时利用 Redis 进行请求调度和去重。
|
1月前
|
数据采集 中间件 调度
Scrapy:高效的网络爬虫框架
Scrapy是Python的网络爬虫框架,用于快速构建和开发爬虫。它提供简单API和全功能环境,包括请求调度、HTML解析、数据存储等,让开发者专注爬虫逻辑。Scrapy工作流程包括发起请求、下载响应、解析数据、处理数据和发送新请求。其核心组件有调度器、下载器、解析器(Spiders)和Item Pipeline,广泛应用于数据挖掘、信息监测、搜索引擎和自动化测试。有效技巧包括合理设置请求参数、编写高效解析器、使用代理和防反爬策略,以及利用中间件。随着大数据和AI的发展,Scrapy在爬虫领域的地位将持续巩固。【6月更文挑战第6天】
37 0