新闻数据抓取

新闻数据抓取

这篇文章,主要是记录自己学习爬虫过程。

整篇部分会分为2篇文章,
  • 1,爬取http的网页(新闻网站):获取各类主题的新闻的内容,eg:金融,体育,娱乐等等。
  • 2,爬取https的网页(豆瓣):获取豆瓣电影的影评。
从简到难,所以我们先http从爬取

第一部分:爬虫基础

1,简单的知识的介绍

先简单看一下http和https两者的概念的区别参考

1.1、HTTP和HTTPS的基本概念

  HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。
  HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
  HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

1.2、HTTP与HTTPS有什么区别?

HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。

HTTPS和HTTP的区别主要如下:
 1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
 2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
 3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
 4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
1.3 HTTPS的工作原理

  我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。

这里写图片描述
简单的来说,对于爬取网页的内容来说:http在爬取过程中不需要输入账号密码,而https需要输入账号和密码,以及由于密码账号会带来的一系列的问题。导致,爬取https相对复杂一点。

二,选用的框架 scarpy

2.1介绍一下scrapy

这里
有Scarpy简单的框架的介绍

这里写图片描述

2.1.1 Scrapy结构
  • 引擎(Scrapy Engine)
  • 调度器(Scheduler)
  • 下载器(Downloader)
  • 蜘蛛(Spiders)
  • 项目管道(Item Pipeline)
  • 下载器中间件(Downloader Middlewares
  • 蜘蛛中间件(Spider Middlewares)
  • 调度中间件(Scheduler Middlewares)
2.1.2 data flow

数据的flow,由执行的engine控制的,如图的各个步骤。
* Step1:scrapy engine先获取初始化的URL(Requests)。
* Step2: 然后交给Scheduler调度Requests,并且请求下一个URL.
* Step3: Scheduler返回下一个Requests给scrapy engine
* Step4: scrapy engine通过 Downloader Middlewares 将requests发送给下载器 Downloader (process_request()).
* Step5: 一旦Downloader Middlewares完成一个网页的下载之后,会产生一个响应Response,并且会将它通过Downloader Middlewares 发送回scrapy engine (process_response())。
* Step6: scrapy engine在接受到Response之后,通过Spider Middlewares会将它发送给Spider做进一步的处理。
* Step7: Spider处理完Response后会返回 scraped items and new Requests(下一页的链接)给scrapy engine。
* Step8: crapy engine 将处理后的items 发送给 Item Pipelines,然后把Requests会被传回Scheduler,并且请求下一个可能的URL进行爬取。
* Step9:以上从step1重复执行,直到在 Scheduler没有多余的URL进行请求

HINTS: 解释一下step7
Spider分析出来的结果有两种:
* 一种是需要进一步抓取的链接, 如 “下一页” 的链接, 它们会被传回Scheduler;
* 另一种是需要保存的数据, 它们被送到Item Pipeline里, 进行后期处理(详细分析、 过滤、 存储等)。

2.1.3 爬取流程
  • 先初始化请求URL列表, 并指定下载后处理response的回调函数。
  • 在parse回调中解析response并返回字典,Item对象,Request对象或它们的迭代对象。
  • 在回调函数里面, 使用选择器解析页面内容, 并生成解析后的结果Item。
  • 最后返回的这些Item通常会被持久化到数据库中(使用Item Pipeline)或者使用Feed exports将其保存到文件中

第三部分,抓取中国新闻网 半年的各类新闻

我的环境是Python3.6+Scrapy,Windows,IDE:PyCharm

3.1 新建一个scrapy的project**

在命令行中输入中 scrapy startproject qqnews
会出现以下的文件

这里写图片描述

3.1.1 qqnew.py中编写我们主要的爬取的code**
  • step1:code从各类新闻链接进入
  • step2: 对应的日期新闻链接,抓取每一天的URL
  • step3: 在每一天的URL链接中,抓取新闻标题和新闻内容的链接
  • step4: 抓取新闻标题和新闻的内容

这里写图片描述
首先我们需要 import 对应的文件

from scrapy.spiders import Spider
from qqnews.items import QqnewsItem

spider会自动从start_urls抓取网页,可以包括多个url。

并且会默认调用 parse这个function, parse是当spider抓取一个网页后默认调用callback。

Hint:因为要抓取半年的新闻的数据,所以先通过start_urls, 获得半年来每个月的url,可以观察出url的规律,例如下面两天URL很容易能够看出来规律,
我们可以通过拼接字符串可以将每一天的URL抓取出来
* 每一天:http://www.chinanews.com/scroll-news/sh/2017/0704/news.shtml
* 每一个月:http://www.chinanews.com/scroll-news/sh/2017/0606/news.shtml

code中最后一句就是由scrapy.Request(url_month,callback=self.parse_month)
* url_month:是解析拼接出来接下来要抓取的每一天的网址
* callback=self.parse_month:这句话的意思是,对于每一天的url会调用自定义的parse_month来解析每一天的网页的内容

class QQNewsSpider(Spider):
    name = 'qqnews'
    start_urls=[#'http://www.chinanews.com/society.shtml',
                #'http://www.chinanews.com/mil/news.shtml',
                'http://finance.chinanews.com/it/gd.shtml',
            ]
    def parse(self,response):
        #找到所有连接的入口,一条一条的新闻做解析 //*[@id="news"] //*[@id="news"]/div[2]/div[1]/div[1]/em/a
        for month in range(1,8):
            for day in range(1,31):
                if month is 2 and day>28 :
                    continue
                elif month is 7 and day>6:
                    continue
                else:
                    if day in range(1,10):
                        url_month='http://www.chinanews.com/scroll-news/it/2017/0'+str(month)+'0'+str(day)+'/news.shtml'
                    else:
                        url_month='http://www.chinanews.com/scroll-news/it/2017/0'+str(month)+str(day)+'/news.shtml'
                    yield scrapy.Request(url_month,callback=self.parse_month)

由前面的code中我们已经得到了,对应每一天的新闻的链接URL,所以接下来我们应该抓取对应页面的新闻标题和新闻的内容。
也就是自定义的def parse_month(self,response)处理的内容。
配合chrome浏览器右键“检查”,找到对应每天的新闻标题

scrapy提供了方便的办法从网页中解析数据,文章中选用的是Xpath进行解析。

Hint:
* //ul/li表示选择所有的ul标签下的li标签
* a/@href表示选择所有a标签的href属性
* a/text()表示选择a标签文本
* div[@id=”content_right”]表示选择所有id属性是content_right的div标签

    def parse_month(self,response):
        #print(response.body)
        #到了没一个月的页面下,提取每一天的url
        urls=response.xpath('//div[@id="content_right"]/div[@class="content_list"]/ul/li/div[@class="dd_bt"]/a/@href').extract()
        for url in urls:
            yield scrapy.Request(url,callback=self.parse_news)

再找到新闻标题对应的新闻的内容URL之后,我们就可以抓取每天的新闻标题和对应的新闻内容。

然后通过self.parse_news,
将其中标题和内容存储下来,这是我们用到了最先import的item=QqnewsItem()

    def parse_news(self,response):
        item=QqnewsItem()
        item['title']=response.xpath('//div[@class="con_left"]/div[@id="cont_1_1_2"]/h1/text()').extract()
        item['text']='\n'.join(response.xpath('//div[@class="left_zw"]/p/text()').extract())
        yield item

在items.py添加一些类

class QqnewsItem(scrapy.Item):
    # define the fields for your item here like:
    text=scrapy.Field()#新闻的内容
    title=scrapy.Field()#新闻的标题

最后,如果想要将抓取到底内容保存到一个文件中可以新建一个begin.py中直接执行下面这句话就可以了。

在begin.py

from scrapy import cmdline
cmdline.execute("scrapy crawl qqnews -o IT.csv".split())

然后我们可以根据fastText,将爬取的数据处理成fastText的格式后,直接训练即可。

参考文章:

https://www.cnblogs.com/wqhwe/p/5407468.html

https://doc.scrapy.org/en/master/topics/architecture.html

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值