新闻信息检索(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liuguiyangnwpu/article/details/50459606

这个是我的github上的代码库,欢迎大家点星!


Scrapy简介

Scrapy是一个使用Python写的Crawler Framework, 简单轻巧,并且非常方便。它使用Twisted这个异步网络库来处理网络通讯,结构清晰,并且包含了各种中间件接口,可以灵活的完成各种需求。通过Zope.interface让Python支持了接口的开发方式。使用及开发者可以根据自己的实际需求自由的开发spider模块及各种中间件来完成对某类网站的定制化爬取,Scrapy在数据的序列化方面也提供了多种自己的实现,支持JSON、CSV、XML等。如果想存入数据库或者在做数据过滤后再存入自定义形式,可以通过“itempipeline”来进行定制化。

Scrapy的框架介绍

  • Scrapy Eninge

Scrapy引擎是用来控制整个系统的数据处理流程,并进行实物处理的触发。

  • Scheduler

调度程序从Scrapy引擎接受请求并排序列入队列,并在Scrapy引擎发出请求后返回给他们。

  • Downloader

下载器的主要职责是爬取网页并将网页内容返回给Spiders。

  • Spiders

Spiders是开发者自己定义用来解析页面并抓取定制url返回内容的类,每个spider都能处理一个域名或者一组域名。换句话说就是用来定义特定网站的抓取和解析规则。

  • ItemPipeline

项目管道的主要责任是负责处理有蜘蛛从网页中抽取的项目,它的主要任务是清晰、验证和存储数据。当页面被蜘蛛解析后,将被发送到项目管道,并经过几个特定的次序处理数据。每个项目管道的组件都是有一个简单的方法组成的Python类。它们获取了项目并执行它们的方法,同时还需要确定的是是否需要在项目管道中继续执行下一步或是直接丢弃掉不处理。
项目管道通常执行的过程有:
清洗HTML数据 验证解析到的数据(检查项目是否包含必要的字段) 检查是否是重复数据(如果重复就删除) 将解析到的数据存储到数据库中

  • Downloadermiddlewares

下载中间件是位于Scrapy引擎和下载器之间的模块,主要是处理Scrapy引擎与下载器之间的请求及相应。

  • Spidermiddlewares

Spider中间件是介于Scrapy引擎和spiders之间的模块,主要工作是处理spider的响应输入和请求输出。

  • Schedulermiddlewares

调度中间件是介于Scrapy引擎和调度之间的中间件,主要工作是从Scrapy发送调度的请求和相应。

数据处理流程

  • 引擎打开一个域名,时蜘蛛处理这个域名,并让蜘蛛获取第一个爬取的URL。
  • 引擎从蜘蛛那获取第一个需要爬取的URL,然后作为请求在调度中进行调度。
  • 引擎从调度那获取接下来进行爬取的页面。
  • 调度将下一个爬取的URL返回给引擎,引擎将它们通过下载中间件发送到下载器。
  • 当网页被下载器下载完成以后,响应内容通过下载中间件被发送到引擎。
  • 引擎收到下载器的响应并将它通过蜘蛛中间件发送到蜘蛛进行处理。
  • 蜘蛛处理响应并返回爬取到的项目,然后给引擎发送新的请求。
  • 引擎将抓取到的项目项目管道,并向调度发送请求。
  • 系统重复第二部后面的操作,直到调度中没有请求,然后断开引擎与域之间的联系。

任务介绍

主要是使用Scrapy去抓取网易新闻并进行本地的存取,以及后期的分析。

创建一个工程

  • 在虚拟机中创建一个工程
fighter@pc:~$ scrapy startproject News_Scrapy
New Scrapy project 'News_Scrapy' created in:
    /home/fighter/News_Scrapy

You can start your first spider with:
    cd News_Scrapy
    scrapy genspider example example.com
  • 紧接着进入你的工程目录,创建本地的git
fighter@pc:~/News_Scrapy$ git init
Initialized empty Git repository in /home/fighter/News_Scrapy/.git/
fighter@pc:~/News_Scrapy$ git remote add origin https://github.com/liuguiyangnwpu/News_Scrapy.git
fighter@pc:~/News_Scrapy$ git add .
fighter@pc:~/News_Scrapy$ git commit -am "New Scrapy Project"

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got 'fighter@pc.(none)')
  • 如果出项上述问题,证明你的本地git没有配置完成,请使用以下命令
fighter@pc:~/News_Scrapy$ git config --global user.email "liuguiyangnwpu@163.com"
fighter@pc:~/News_Scrapy$ git config --global user.name "liuguiyangnwpu"
  • 之后再进行提交
fighter@pc:~/News_Scrapy$ git commit -am "New Scrapy Project"
[master (root-commit) c9c22e4] New Scrapy Project
 6 files changed, 57 insertions(+)
 create mode 100644 News_Scrapy/__init__.py
 create mode 100644 News_Scrapy/items.py
 create mode 100644 News_Scrapy/pipelines.py
 create mode 100644 News_Scrapy/settings.py
 create mode 100644 News_Scrapy/spiders/__init__.py
 create mode 100644 scrapy.cfg
fighter@pc:~/News_Scrapy$ git push -u origin master
  • 显示一下本地目录结构
fighter@pc:~/News_Scrapy$ tree ../News_Scrapy/
../News_Scrapy/
├── News_Scrapy
│   ├── __init__.py
│   ├── items.py #主要是定义获取的内容字段,类似于实体类
│   ├── pipelines.py #项目管道文件,用来处理Spider抓取的数据
│   ├── settings.py # 项目的配置文件
│   └── spiders # 放置Spider的具体的文件
│       └── __init__.py
├── README.md
└── scrapy.cfg

2 directories, 7 files

开始定义抓取类的成员信息

我们打开项目中的items.py文件,具体信息如下

# -*- coding: utf-8 -*-
import scrapy

class NewsScrapyItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    pass

在这里定义我们所要抓取的信息

确定抓取的信息

因此,在items.py中的内容改写成如下:

# -*- coding: utf-8 -*-
import scrapy

class NewsScrapyItem(scrapy.Item):
    # define the fields for your item here like:
    news_type = scrapy.Field()
    news_date = scrapy.Field()
    news_title = scrapy.Field()
    news_source = scrapy.Field()
    news_content = scrapy.Field()

开始写爬虫

Spider是整个项目中最核心的类,在这个类里我们会定义抓取对象(域名、URL)以及抓取规则。

  • 进入spider目录,创建一个文件netease_spider.py
  • 写一个类,用来定义抓取规则,以及解析的函数
  • 这其中比较复杂的是如何定义抓取规则,这个要根据所抓取的网站来定义
  • 打开网易新闻,去审查你要抓取元素,去分析他的url
  • 之后要写一些简单的正则表达式去抓取信息
  • 推荐一个正则表示在线调试平台正则测试
  • 简单的正则表达式的例子可以去参考python使用正则表达式编写网页小爬虫

我的具体的文件内容是

#!/usr/bin/env python
# coding=utf-8

from scrapy.selector import Selector
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from News_Scrapy.items import NewsScrapyItem

class NetEaseSpider(CrawlSpider):
    name = "News_Scrapy"
    allowed_domains = ["news.163.com"]
    start_urls = ["http://news.163.com"]
    rules = [
        Rule(SgmlLinkExtractor(allow=(r'http://news.163.com/[a-zA-Z]/'))),
        Rule(SgmlLinkExtractor(allow=(r'http://news.163.com/[0-9]{2}/[0-9]{3,4}/[0-9]{1,2}/[a-zA-Z0-9]+.html')),callback="parse_item"),
    ]

    def parse_item(self,response):
        sel_resp = Selector(response)
        news_item = NewsScrapyItem()

写Response的callback函数

  • 我们分析的目标网页是习近平心系乌镇
  • 我们关心的是我们在items.py中定义的字段内容
  • 在网页中,用鼠标选中自己感兴趣的内容,然后鼠标右键,审查元素。在弹出的控制台中对选中的内容,鼠标右键,选择Copy XPath
  • 现在我们的系统剪切板中保留着我们喜欢的元素在XPath中的索引信息
  • 这样在我们的callback中就可以直接使用这个信息进行数据索引了
#!/usr/bin/env python
# coding=utf-8

from scrapy.selector import Selector
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from News_Scrapy.items import NewsScrapyItem

class NetEaseSpider(CrawlSpider):
    name = "News_Scrapy"
    allowed_domains = ["news.163.com"]
    start_urls = ["http://news.163.com"]
    rules = [
        Rule(SgmlLinkExtractor(allow=(r'http://news.163.com/[a-zA-Z]/'))),
        Rule(SgmlLinkExtractor(allow=(r'http://news.163.com/[0-9]{2}/[0-9]{3,4}/[0-9]{1,2}/[a-zA-Z0-9]+.html')),callback="parse_item"),
    ]

    def parse_item(self,response):
        sel_resp = Selector(response)
        news_item = NewsScrapyItem()
        news_item["news_type"] = sel_resp.xpath('/html/body/div[4]/div[3]/div/span[2]/a[2]/text()').extract()
        news_item["news_title"] = sel_resp.xpath('//*[@id="h1title"]/text()').extract()
        news_item["news_date"] = sel_resp.xpath('//*[@id="epContentLeft"]/div[1]/div[1]/text()').re(r'[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}')
        news_item["news_source"] = sel_resp.xpath('//*[@id="ne_article_source"]/text()').extract()
        news_item["news_content"] = sel_resp.xpath('//*[@id="endText"]/text()').extract()
        return news_item

目前为止,我们从某服务器抓取的网页并提取部分信息的任务初步搞定。接下来将抓取的数据存储到本地的数据库中。

保存数据到MongoDB中

  • 清洗HTML数据
  • 验证解析到的数据(检查项目是否包含必要的字段)
  • 检查是否是重复数据(如果重复就删除)
  • 将解析到的数据存储到数据库中

数据存储部分将存储将通过pipelines.py文件的具体操作来完成。先看一眼这个文件长什么样子。

# -*- coding: utf-8 -*-
# Define your item pipelines here

class NewsScrapyPipeline(object):
    def process_item(self, item, spider):
        return item
  • 由于我们的原始数据格式很难统一,且每个字段的长度均不一样等其他若干原因吧!我们采用MongoDB
  • 具体的Mongodb使用的简介请参考官网信息
  • 可以先去熟悉一下Mongodb的基本使用
  • 在使用前请先去安装Mongodb,并且还要安装对应的python插件
sudo apt-get install mongodb
sudo apt-get install python-pymongo python-pymongo-doc python-pymongo-ext

在全局settings.py中设置关于数据库的设置参数

# Write in settings.py
MONGODB_SERVER = 'localhost'
MONGODB_PORT = 27017
MONGODB_DB = 'python'
MONGODB_COLLECTION = 'test'

完整的pipelines.py文件内容是

# -*- coding: utf-8 -*-

import pymongo

from scrapy.exceptions import DropItem
from scrapy.conf import settings
from scrapy import log

class NewsScrapyPipeline(object):
    #Connect to the MongoDB database
    def __init__(self):
        connection = pymongo.Connection(settings['MONGODB_SERVER'], settings['MONGODB_PORT'])
        db = connection[settings['MONGODB_DB']]
        self.collection = db[settings['MONGODB_COLLECTION']]

    def process_item(self, item, spider):
        #Remove invalid data
        valid = True
        for data in item:
          if not data:
            valid = False
            raise DropItem("Missing %s of blogpost from %s" %(data, item['url']))
        if valid:
            new_moive=[{
                "news_type":item['news_type'],
                "news_date":item['news_date'],
                "news_title":item['news_title'],
                "news_source":item['news_source'],
                "news_content":item['news_content']
            }]
            self.collection.insert(new_moive)
            log.msg("Item wrote to MongoDB database %s/%s" % (settings['MONGODB_DB'], settings['MONGODB_COLLECTION']),
            level=log.DEBUG, spider=spider) 
        return item

最后将settings.py文件补充完整

# -*- coding: utf-8 -*-

# Scrapy settings for News_Scrapy project

BOT_NAME = 'News_Scrapy'

SPIDER_MODULES = ['News_Scrapy.spiders']
NEWSPIDER_MODULE = 'News_Scrapy.spiders'

# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'News_Scrapy (+http://www.yourdomain.com)'

ITEM_PIPELINES={
    'News_Scrapy.pipelines.NewsScrapyPipeline':300, # 这个是用来定义调用这个方法的优先级
    #此处可以写多个数据存储的文件,同时这个是一个分布式类似的存储机制
}

# 定义日志存储的级别和形式
LOG_LEVEL='DEBUG'

# 毕竟我们这个是web爬虫,时间长了,会被服务器发现,因此进行一些简单的伪装
# 若想彻底的骗过服务器,需要自己控制一些公网IP地址,进行轮训式抓取
DOWNLOAD_DELAY = 2 
RANDOMIZE_DOWNLOAD_DELAY = True
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.54 Safari/536.5'
COOKIES_ENABLED = True

MONGODB_SERVER = 'localhost'
MONGODB_PORT = 27017
MONGODB_DB = 'python'
MONGODB_COLLECTION = 'test'

现在来运行我们的爬虫

  • 使用的命令如下
fighter@pc:~/News_Scrapy/News_Scrapy$ pwd
/home/fighter/News_Scrapy/News_Scrapy
fighter@pc:~/News_Scrapy/News_Scrapy$ scrapy crawl News_Scrapy --logfile=test.log &
这时你的程序会在后台运行,使用tail命令来查看你的日志信息
tail -f test.log
  • 我们抓取的日志信息
2015-12-15 21:48:42+0800 [scrapy] INFO: Scrapy 0.24.2 started (bot: News_Scrapy)
2015-12-15 21:48:42+0800 [scrapy] INFO: Optional features available: ssl, http11, boto, django
2015-12-15 21:48:42+0800 [scrapy] INFO: Overridden settings: {'NEWSPIDER_MODULE': 'News_Scrapy.spiders', 'SPIDER_MODULES': ['News_Scrapy.spiders'], 'BOT_NAME': 'News_Scrapy', 'USER_AGENT': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.54 Safari/536.5', 'LOG_FILE': 'test.log', 'DOWNLOAD_DELAY': 2}
2015-12-15 21:48:42+0800 [scrapy] INFO: Enabled extensions: LogStats, TelnetConsole, CloseSpider, WebService, CoreStats, SpiderState
2015-12-15 21:48:43+0800 [scrapy] INFO: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, DefaultHeadersMiddleware, MetaRefreshMiddleware, HttpCompressionMiddleware, RedirectMiddleware, CookiesMiddleware, ChunkedTransferMiddleware, DownloaderStats
2015-12-15 21:48:43+0800 [scrapy] INFO: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware
2015-12-15 21:48:43+0800 [scrapy] INFO: Enabled item pipelines: NewsScrapyPipeline
2015-12-15 21:48:43+0800 [News_Scrapy] INFO: Spider opened
2015-12-15 21:48:43+0800 [News_Scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2015-12-15 21:48:43+0800 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023
2015-12-15 21:48:43+0800 [scrapy] DEBUG: Web service listening on 127.0.0.1:6080
2015-12-15 21:48:44+0800 [News_Scrapy] DEBUG: Crawled (200) <GET http://news.163.com> (referer: None)
2015-12-15 21:48:46+0800 [News_Scrapy] DEBUG: Crawled (200) <GET http://news.163.com/15/1215/21/BATGFD3J0001121M.html> (referer: http://news.163.com)
2015-12-15 21:48:46+0800 [News_Scrapy] DEBUG: Item wrote to MongoDB database python/test
2015-12-15 21:48:46+0800 [News_Scrapy] DEBUG: Scraped from <200 http://news.163.com/15/1215/21/BATGFD3J0001121M.html>
    {'news_content': [u'\n                ',
                      u'\n                                                                                ',
                      u'\n                            '],
     'news_date': [u'2015-12-15 21:08:20'],
     'news_source': [u'\u592e\u89c6'],
     'news_title': [u'\u4e60\u8fd1\u5e73\u4f1a\u89c1\u4fc4\u7f57\u65af\u603b\u7406\u6885\u5fb7\u97e6\u6770\u592b'],
     'news_type': []}

经过日志分析我们发现,我们的news_content和news_type类型内容为空,可能是我们在从网页中分析是出现了问题。

  • 同时我们去Mongodb中去看看
> show dbs
admin   (empty)
local   0.078GB
python  0.078GB
test    (empty)
> use python
switched to db python
> show tables;
system.indexes
test
> db.test.find();
{ "_id" : ObjectId("56701a3ebc54f41303d33c56"), "news_source" : [ "央视" ], "news_date" : [ "2015-12-15 21:08:20" ], "news_title" : [ "习近平会见俄罗斯总理梅德韦杰夫" ], "news_content" : [ "\n                ", "\n                                                                                ", "\n                            " ], "news_type" : [ ] }
{ "_id" : ObjectId("56701a40bc54f41303d33c57"), "news_source" : [ "澎湃新闻网" ], "news_date" : [ "2015-12-15 14:58:50" ], "news_title" : [ "军报:中国军队改革展开 干部调整暂停" ], "news_content" : [ "\n                ", "\n                                                                                ", "\n                            " ], "news_type" : [ ] }
{ "_id" : ObjectId("56701a42bc54f41303d33c58"), "news_source" : [ "观察者网" ], "news_date" : [ "2015-12-15 13:26:57" ], "news_title" : [ "央视真人秀男嘉宾嘴对嘴喂包子 网友:好污(图)" ], "news_content" : [ "\n                ", "\n\t\t", "\n                                                                                ", "\n                            " ], "news_type" : [ ] }
  • Ok, 证明我们流程跑通了,并且得到了部分答案。之后就是去解决为甚么内容信息和类型信息没有找到!

问题得到了解决,经过对Scrapy的调试发现,在控制台下使用命令去调试

fighter@pc:~$ scrapy shell "http://news.163.com/15/1215/14/BASR5UOF00014AED.html"
2015-12-15 23:10:56+0800 [scrapy] INFO: Scrapy 0.24.2 started (bot: scrapybot)
2015-12-15 23:10:56+0800 [scrapy] INFO: Optional features available: ssl, http11, boto, django
2015-12-15 23:10:56+0800 [scrapy] INFO: Overridden settings: {'LOGSTATS_INTERVAL': 0}
2015-12-15 23:10:56+0800 [scrapy] INFO: Enabled extensions: TelnetConsole, CloseSpider, WebService, CoreStats, SpiderState
2015-12-15 23:10:57+0800 [scrapy] INFO: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, DefaultHeadersMiddleware, MetaRefreshMiddleware, HttpCompressionMiddleware, RedirectMiddleware, CookiesMiddleware, ChunkedTransferMiddleware, DownloaderStats
2015-12-15 23:10:57+0800 [scrapy] INFO: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware
2015-12-15 23:10:57+0800 [scrapy] INFO: Enabled item pipelines: 
2015-12-15 23:10:57+0800 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023
2015-12-15 23:10:57+0800 [scrapy] DEBUG: Web service listening on 127.0.0.1:6080
2015-12-15 23:10:57+0800 [default] INFO: Spider opened
2015-12-15 23:10:58+0800 [default] DEBUG: Crawled (200) <GET http://news.163.com/15/1215/14/BASR5UOF00014AED.html> (referer: None)
[s] Available Scrapy objects:
[s]   crawler    <scrapy.crawler.Crawler object at 0x7ff82db60dd0>
[s]   item       {}
[s]   request    <GET http://news.163.com/15/1215/14/BASR5UOF00014AED.html>
[s]   response   <200 http://news.163.com/15/1215/14/BASR5UOF00014AED.html>
[s]   settings   <scrapy.settings.Settings object at 0x7ff82e3de790>
[s]   spider     <Spider 'default' at 0x7ff82c1b8750>
[s] Useful shortcuts:
[s]   shelp()           Shell help (print this help)
[s]   fetch(req_or_url) Fetch request (or URL) and update local objects
[s]   view(response)    View response in a browser

这时使用控制台去寻找对应的content的内容。

In [9]: sel.xpath('//div[@id="endText"]').extract()
Out[9]: [u'<div id="endText" class="end-text">\n                <p>2015\u5e7412\u670815\u65e5\uff0c\u300a\u89e3\u653e\u519b\u62a5\u300b\u5728\u7b2c08\u7248\u520a\u53d1\u9898\u4e3a\u300a\u9646\u519b\u7b2c26\u96c6\u56e2\u519b \u6539\u9769\u9762\u524d\u805a\u7cbe\u4f1a\u795e\u5fd9\u5907\u6218\u300b\u7684\u4e00\u7bc7\u65b0\u95fb\u62a5\u9053\u4f4e\u8c03\u62ab\u9732\uff0c\u201c\u968f\u7740\u519b\u961f\u6539\u9769\u5c55\u5f00\uff0c\u5e72\u90e8\u8c03\u6574\u6682\u505c\u3002\u201d</p><p>\u62a5\u9053\u79f0\uff0c\u4e2d\u56fd\u519b\u961f\u5386\u53f2\u6027\u6539\u9769\u62c9\u5f00\u5927\u5e55\u4e4b\u540e\uff0c\u7b2c26\u96c6\u56e2\u519b\u515a\u5458\u5e72\u90e8\u515a\u6027\u539f\u5219\u5f3a\u3001\u653f\u6cbb\u5b9a\u529b\u8db3\uff0c\u805a\u7cbe\u4f1a\u795e\u7ec3\u6253\u4ed7\uff0c\u4e00\u95e8\u5fc3\u601d\u5fd9\u5907\u6218\u3002\u7b2c26\u96c6\u56e2\u519b\u96b6\u5c5e\u4e8e\u6d4e\u5357\u519b\u533a\uff0c\u519b\u90e8\u9a7b\u5730\u4e3a\u5c71\u4e1c\u6f4d\u574a\u3002</p><p>\u62a5\u9053\u79f0\uff0c\u201c\u4e2a\u4eba\u5347\u964d\u4e0d\u5f71\u54cd\u5de5\u4f5c\uff0c\u5355\u4f4d\u6539\u9769\u4e0d\u964d\u4f4e\u6807\u51c6\u201d\u662f\u300a\u89e3\u653e\u519b\u62a5\u300b\u8bb0\u8005\u8fd1\u65e5\u8d70\u8bbf\u7b2c26\u96c6\u56e2\u519b\u90e8\u961f\u65f6\u6700\u5927\u7684\u611f\u53d7\u3002\u8be5\u96c6\u56e2\u519b\u67d0\u65c5\u65b0\u5175\u8425\u6559\u5bfc\u5458\u3001\u65c5\u653f\u6cbb\u90e8\u526f\u4e3b\u4efb\u5218\u8fde\u6da6\u7684\u804c\u52a1\u56e0\u519b\u961f\u6539\u9769\u5c55\u5f00\u800c\u6682\u505c\u8c03\u6574\u5c31\u662f\u5178\u578b\u6848\u4f8b\u3002</p><p>\u4e0a\u8ff0\u4e2d\u592e\u519b\u59d4\u673a\u5173\u62a5\u7684\u62a5\u9053\u79f0\uff0c\u201c\u5218\u8fde\u6da6\u5e74\u7eaa\u504f\u5927\u3001\u4efb\u804c\u65f6\u95f4\u8f83\u957f\uff0c\u6309\u7167\u4ee5\u5f80\u653f\u7b56\u53ef\u4ea4\u6d41\u5230\u4eba\u6b66\u90e8\u5de5\u4f5c\u3002\u4f46\u968f\u7740\u6539\u9769\u5c55\u5f00\uff0c\u5e72\u90e8\u8c03\u6574\u6682\u505c\uff0c\u4e0d\u5c11\u4eba\u66ff\u4ed6\u60cb\u60dc\u3002\u201d</p><p><!-- AD200x300_2 -->\n</p><div class="gg200x300">\n<div style="position:relative;">\n\t\t<a href="http://gb.corp.163.com/gb/legal.html" class="ad_hover_href"></a>\n<iframe src="http://g.163.com/r?site=netease&amp;affiliate=news&amp;cat=article&amp;type=logo300x250&amp;location=12" width="300" height="250" frameborder="no" border="0" marginwidth="0" marginheight="0" scrolling="no"> </iframe>\n    </div>\n</div><p>\u7136\u800c\uff0c\u5218\u8fde\u6da6\u5374\u8bf4\uff1a\u201c\u5355\u4f4d\u64a4\u5e76\u6574\u7f16\u542c\u519b\u59d4\u7684\uff0c\u4e2a\u4eba\u8fdb\u9000\u8d70\u7559\u542c\u7ec4\u7ec7\u7684\uff0c\u6211\u5fc3\u91cc\u53ea\u60f3\u7740\u4e00\u4ef6\u4e8b\uff0c\u518d\u4e3a\u90e8\u961f\u5e26\u51fa\u4e00\u6279\u597d\u5175\uff01\u201d\u8fde\u65e5\u6765\uff0c\u4ed6\u6bcf\u5929\u98ce\u91cc\u6765\u96ea\u91cc\u53bb\uff0c\u5fc3\u65e0\u6742\u5ff5\u5730\u8e72\u5728\u65b0\u5175\u8bad\u7ec3\u4e00\u7ebf\u76d1\u5bdf\u7763\u5bfc\uff0c\u8be5\u65c5\u65b0\u5175\u5728\u96c6\u56e2\u519b\u7ec4\u7ec7\u7684\u65b0\u8bad\u9a8c\u6536\u8003\u6838\u4e2d\u53d6\u5f97\u5408\u683c\u7387100%\u7684\u597d\u6210\u7ee9\u3002</p><p>2015\u5e7411\u670824\u65e5\u81f326\u65e5\uff0c\u4e2d\u592e\u519b\u59d4\u6539\u9769\u5de5\u4f5c\u4f1a\u8bae\u5728\u5317\u4eac\u4e3e\u884c\uff0c\u7531\u6b64\u62c9\u5f00\u4e86\u4e2d\u56fd\u519b\u961f\u5386\u53f2\u6027\u6539\u9769\u7684\u5927\u5e55\u3002</p><p>\u4e2d\u5171\u4e2d\u592e\u603b\u4e66\u8bb0\u3001\u56fd\u5bb6\u4e3b\u5e2d\u3001\u4e2d\u592e\u519b\u59d4\u4e3b\u5e2d\u3001\u4e2d\u592e\u519b\u59d4\u6df1\u5316\u56fd\u9632\u548c\u519b\u961f\u6539\u9769\u9886\u5bfc\u5c0f\u7ec4\u7ec4\u957f\u4e60\u8fd1\u5e73\u5728\u4e2d\u592e\u519b\u59d4\u6539\u9769\u5de5\u4f5c\u4f1a\u8bae\u4e0a\u53d1\u8868\u91cd\u8981\u8bb2\u8bdd\u6307\u51fa\uff0c\u201c\u8981\u79d1\u5b66\u5236\u5b9a\u5e72\u90e8\u8c03\u6574\u5b89\u6392\u8ba1\u5212\u65b9\u6848\uff0c\u5408\u7406\u786e\u5b9a\u5e72\u90e8\u8fdb\u9000\u53bb\u7559\uff0c\u5173\u5fc3\u548c\u89e3\u51b3\u5e72\u90e8\u5b9e\u9645\u56f0\u96be\u3002\u8001\u5e72\u90e8\u662f\u515a\u548c\u519b\u961f\u7684\u5b9d\u8d35\u8d22\u5bcc\uff0c\u8981\u7cbe\u5fc3\u505a\u597d\u8001\u5e72\u90e8\u670d\u52a1\u4fdd\u969c\u63a5\u7eed\u5de5\u4f5c\u3002\u201d</p>\n                                                                                <div class="ep-source cDGray">\n                    <span class="left"><a href="http://news.163.com/"><img src="http://img1.cache.netease.com/cnews/css13/img/end_news.png" alt="netease" width="13" height="12" class="icon"></a> \u672c\u6587\u6765\u6e90\uff1a\u6f8e\u6e43\u65b0\u95fb\u7f51  </span>\n                                    </div>\n                            </div>']

In [10]: sel.xpath('/html/body/div[4]/div[3]/div/span[2]/a[2]').extract()
Out[10]: []

这时使用response的内部成员去找到我们的新闻分类信息

In [1]: response.
response.body             response.css              response.headers          response.request          response.url
response.body_as_unicode  response.encoding         response.meta             response.selector         response.xpath
response.copy             response.flags            response.replace          response.status           

In [1]: response.url
Out[1]: 'http://news.163.com/15/1215/14/BASR5UOF00014AED.html'

这时这需要Url信息就可以将网页进行分类了!

具体的挖掘相关的信息,请参照后文的内容!

没有更多推荐了,返回首页