基于Scrapy框架的Python新闻爬虫

概述

该项目是基于Scrapy框架的Python新闻爬虫,能够爬取网易,搜狐,凤凰和澎湃网站上的新闻,将标题,内容,评论,时间等内容整理并保存到本地

详细

代码下载:http://www.demodashi.com/demo/13933.html

一、开发背景

Python作为数据处理方面的一把好手,近年来的热度不断增长。网络爬虫可以说是Python最具代表性的应用之一,那么通过网络爬虫来学习Python以及网络和数据处理的相关内容可以说是再合适不过了。

Scrapy是由Python语言开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。相比于传统的爬虫来说,基于scrapy框架的爬虫更加结构化,同时也更加高效,能完成更加复杂的爬取任务。

二、爬虫效果

1、标题

2、内容

3、评论

4、日期,热度和ID

5、程序运行图

三、具体开发

1、任务需求

1. 爬取网易,搜狐,凤凰和澎湃新闻网站的文章及评论

2. 新闻网页数目不少于10万页

3. 每个新闻网页及其评论能在1天内更新

2、功能设计

1. 设计一个网络爬虫,能够爬取指定网站的全部页面,并提取其中的文章及评论内容

2. 定时运行网络爬虫,实现每日更新数据

3、系统架构

首先简单介绍下scrapy框架,这是一个爬虫框架

绿线是数据流向,

(1)首先从初始URL 开始,Scheduler 会将其交给 Downloader 进行下载,

(2)下载之后会交给 Spider 进行分析,这里的spider就是爬虫的核心功能代码

(3)Spider分析出来的结果有两种:一种是需要进一步抓取的链接,它们会通过middleware传回 Scheduler ;另一种是需要保存的数据,送入Item Pipeline ,进行处理和存储

(4)最后将所有数据输出并保存为文件

4、实际项目

(1)项目结构

可以看到,NewsSpider-master是完整项目文件夹,下面存放有对应各个网站的爬虫启动脚本debug_xx.py,scrapyspider文件夹存放scrapy框架所需的相关文件,spiders文件夹存放实际的爬虫代码

(2)爬虫引擎

以网易新闻的爬虫news_163.py为例,简要说明部分核心代码:

①定义一个爬虫类:

class news163_Spider(CrawlSpider):
    # 网易新闻爬虫名称
    name = "163news"
    # 伪装成浏览器
    headers = {
        ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36‘,
    }
    #网易全网
    allowed_domains = [
        "163.com"
    ]
    #新闻版
    start_urls = [
        ‘http://news.163.com/‘
    ]
    #正则表达式表示可以继续访问的url规则,http://news.163.com/\d\d\d\d\d(/([\w\._+-])*)*$
    rules = [
        Rule(LinkExtractor(
        allow=(
            (‘http://news\.163\.com/.*$‘)
        ),
        deny = (‘http://.*.163.com/photo.*$‘)
        ),
        callback="parse_item",
        follow=True)
    ]

②网页内容分析模块

根据不同内容的Xpath路径从页面中提取内容,由于网站在不同时间的页面结构不同,因此按照不同页面版式划分成几个if判断句块;

def parse_item(self, response):
    # response是当前url的响应
    article = Selector(response)
    article_url = response.url
    global count
    # 分析网页类型
    # 比较新的网易新闻 http://news.163.com/05-17/
    if get_category(article) == 1:
        articleXpath = ‘//*[@id="epContentLeft"]‘
        if article.xpath(articleXpath):
            titleXpath = ‘//*[@id="epContentLeft"]/h1/text()‘
            dateXpath = ‘//*[@id="epContentLeft"]/div[1]/text()‘
            contentXpath = ‘//*[@id="endText"]‘
            news_infoXpath =‘//*[@id="post_comment_area"]/script[3]/text()‘

            # 标题
            if article.xpath(titleXpath):
                news_item = newsItem()
                news_item[‘url‘] = article_url
                get_title(article, titleXpath, news_item)
                # 日期
                if article.xpath(dateXpath):
                    get_date(article, dateXpath, news_item)
                # 内容
                if article.xpath(contentXpath):
                    get_content(article, contentXpath, news_item)
                    count = count + 1
                    news_item[‘id‘] = count
                # 评论
                try:
                    comment_url = get_comment_url(article, news_infoXpath)
                    # 评论处理
                    comments = get_comment(comment_url, news_item)[1]
                    news_item[‘comments‘] = comments
                except:
                    news_item[‘comments‘] = ‘ ‘
                    news_item[‘heat‘] = 0
                yield news_item

根据正则表达式匹配页面内容中的日期信息:

‘‘‘通用日期处理函数‘‘‘
def get_date(article, dateXpath, news_item):
    # 时间
    try:
        article_date = article.xpath(dateXpath).extract()[0]
        pattern = re.compile("(\d.*\d)")  # 正则匹配新闻时间
        article_datetime = pattern.findall(article_date)[0]
        #article_datetime = datetime.datetime.strptime(article_datetime, "%Y-%m-%d %H:%M:%S")
        news_item[‘date‘] = article_datetime
    except:
        news_item[‘date‘] = ‘2010-10-01 17:00:00‘

其他函数:

‘‘‘网站分类函数‘‘‘
def get_category(article):

‘‘‘字符过滤函数‘‘‘
def str_replace(content):

‘‘‘通用正文处理函数‘‘‘
def get_content(article, contentXpath, news_item):

‘‘‘评论信息提取函数‘‘‘
def get_comment_url(article, news_infoXpath):

‘‘‘评论处理函数‘‘‘
def get_comment(comment_url, news_item):

(3)运行爬虫并格式化存储

①在settings.py中进行配置

import sys
# 这里改成爬虫项目的绝对路径,防止出现路径搜索的bug
sys.path.append(‘E:\Python\以前的项目\\NewsSpider-master\scrapyspider‘)

# 爬虫名称
BOT_NAME = ‘scrapyspider‘

# 设置是否服从网站的爬虫规则
ROBOTSTXT_OBEY = True

# 同时并发请求数,越大则爬取越快同时负载也大
CONCURRENT_REQUESTS = 32

#禁止cookies,防止被ban
COOKIES_ENABLED = False

# 输出的编码格式,由于Excel默认是ANSI编码,所以这里保持一致
# 如果有其他编码需求如utf-8等可自行更改
FEED_EXPORT_ENCODING = ‘ANSI‘

# 增加爬取延迟,降低被爬网站服务器压力
DOWNLOAD_DELAY = 0.01

# 爬取的新闻条数上限
CLOSESPIDER_ITEMCOUNT = 500

# 下载超时设定,超过10秒没响应则放弃当前URL
DOWNLOAD_TIMEOUT = 100
ITEM_PIPELINES = {
    ‘scrapyspider.pipelines.ScrapyspiderPipeline‘: 300,# pipeline中的类名
}

②运行爬虫并保存新闻内容

爬取下来的新闻内容及评论需要格式化存储,如果在IDE中运行debug脚本,则效果如下:

爬取后会保存为.csv文件,使用Excel打开即可查看:

③如果需要将评论单独提取出来,可以使用csv_process.py,效果如下:

四、其他补充

暂时没有

代码下载:http://www.demodashi.com/demo/13933.html

注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

原文地址:https://www.cnblogs.com/demodashi/p/9582460.html

时间: 2024-10-07 08:06:05

基于Scrapy框架的Python新闻爬虫的相关文章

基于scrapy框架的爬虫

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. scrapy 框架 高性能的网络请求 高性能的数据解析 高性能的持久化存储 深度爬取 全站爬取 分布式 中间件 请求传参 环境的安装 mac/linux:pip install scrapy windows: pip install wheel twisted(异步相关,scrapy 的异步由twisted实现) 一定要在twisted安装成功的情况下执行后面的

scrapy框架与python爬虫

原文地址:https://www.cnblogs.com/xifengqidama/p/9724275.html

基于Flask框架的Python web程序的开发实战 <一> 环境搭建

最近在看<Flask Web开发基于Python的Web应用开发实战>Miguel Grinberg著.安道译 这本书,一步步跟着学习Flask框架的应用,这里做一下笔记 电脑只安装一个Python2.7就行了,用的IDE还是官方那个跟记事本差不多的编辑器,先原始一点,以后再用PyCharm开发,我系统是Win8.1 x64 一:虚拟环境配置 虚拟环境使用第三方工具virtualenv创建,打开cmd,输入virtualenv命令来检测是否已经安装,我已经装过了,所以会提示:You must

Python网络爬虫之Scrapy框架(CrawlSpider)

目录 Python网络爬虫之Scrapy框架(CrawlSpider) CrawlSpider使用 爬取糗事百科糗图板块的所有页码数据 Python网络爬虫之Scrapy框架(CrawlSpider) 提问:如果想要通过爬虫程序去爬取"糗百"全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法二:基于CrawlSpider的自动爬取进行实现(更加简洁和高效). CrawlSpider使

爬虫学习 16.Python网络爬虫之Scrapy框架(CrawlSpider)

爬虫学习 16.Python网络爬虫之Scrapy框架(CrawlSpider) 引入 提问:如果想要通过爬虫程序去爬取"糗百"全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法二:基于CrawlSpider的自动爬取进行实现(更加简洁和高效). 今日概要 CrawlSpider简介 CrawlSpider使用 基于CrawlSpider爬虫文件的创建 链接提取器 规则解析器 今日详

Scrapy框架之基于RedisSpider实现的分布式爬虫

需求:爬取的是基于文字的网易新闻数据(国内.国际.军事.航空). 基于Scrapy框架代码实现数据爬取后,再将当前项目修改为基于RedisSpider的分布式爬虫形式. 一.基于Scrapy框架数据爬取实现 1.项目和爬虫文件创建 $ scrapy startproject wangyiPro $ cd wangyiPro/ $ scrapy genspider wangyi news.163.com # 基于scrapy.Spider创建爬虫文件 2.爬虫文件编写--解析新闻首页获取四个板块的

18、python网路爬虫之Scrapy框架中的CrawlSpider详解

CrawlSpider的引入: 提问:如果想要通过爬虫程序去爬取"糗百"全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法二:基于CrawlSpider的自动爬取进行实现(更加简洁和高效) CrawlSpider的简介: CrawlSpider其实是Spider的一个子类,除了继承到Spider的特性和功能外,还派生除了其自己独有的更加强大的特性和功能.其中最显著的功能就是"

python爬虫----(2. scrapy框架)

Scrapy框架,Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试. 刚开始学习这个框架.不太好评论.只是感觉这个框架有些Java的感觉,需要太多的其他模块的支持. (一)创建 scrapy 项目 # 使用 scrapy startproject scrapy_test ├── scrapy_test │   ├── scrapy.cfg │   └── scrapy_test │

Python网络爬虫实战-Scrapy视频教程 Python系统化项目实战课程 Scrapy技术课程

课程目录01.scrapy是什么.mp4Python实战-02.初步使用scrapy.mp4Python实战-03.scrapy的基本使用步骤.mp4Python实战-04.基本概念介绍1-scrapy命令行工具.mp4Python实战-05.本概念介绍2-scrapy的重要组件.mp4Python实战-06.基本概念介绍3-scrapy中的重要对象.mp4Python实战-07.scrapy内置服务介绍.mp4Python实战-08.抓取进阶-对"西刺"网站的抓取.mp4Python