scrapy爬取学院新闻信息实例

爬取工作开展思路:

首先打开川大公共管理学院首页,浏览其信息确定需要爬取的信息;再使用浏览器的开发者工具,确定需要爬取的数据的具体路径;之后使用 scrapy shell 来测试xpath或者css的表达式是否正确;最后编写scrapy代码爬取数据。

1.需要爬取哪些数据

1.png

我定义的数据爬取是直接在首页显示的这12条新闻动态,首先需要在首页获取到新闻文章的标题以及它的url地址。


12.jpg

打开新闻详情页,确定需要在该页面爬取的数据:标题和内容文本。

2.用开发者工具确定xpath表达式,并检验

学院首页html

被黄线标明的信息是我想获取的数据,获取具有class属性且其值为fl的a标签里的url地址,所以xpath表达式为:

//a[@class="fl"]/@href
新闻详情页html

在新闻详情页,想得到的数据是标题和文章内容,可以看到标题在 h1标签内,其xpath表达式是:

//div[@class="detail_zv_title"]/h1/text()
新闻详情页html

新闻详情页中,文章内容在p标签下的<span>标签中,其xpath表达式为:

//p[@class="MsoNormal"]/span/text()

3.编写news_spider.py文件

import scrapy


class StackOverflowSpider(scrapy.Spider):
    name = 'news'
    start_urls = ['http://ggglxy.scu.edu.cn/']

    def parse(self, response):
        for href in response.xpath('//a[@class="fl"]/@href'):
            url = response.urljoin(href.extract())
            yield scrapy.Request(url, callback=self.parse_news)
    def parse_news(self, response):
        yield {
            'title': response.xpath('//div[@class="detail_zy_title"]/h1/text()').extract(),
            'content': response.xpath('//p[@class="MsoNormal"]/span/text()').extract(),

        }

执行代码后,得到是:


4.PNG

不太理想的是它爬取的数据是这样的:

image.png

但是,输出为xml文件显示出来的是正常的中文,如果输出为json文件又变成了unicode编码。

4.爬取过程中遇到的问题

4.1关于定义item的问题
6.PNG

我在创建scrapy爬取工程时,并没有自定义item文件,因为在编写news_spider.py并没有用到它,但还是成功爬取了信息。所以我现在也不太清楚是否一定到去定义item文件,去定义它有什么好处。

4.2xpath表达式定义出错导致爬取的数据变少了

我在爬取新闻详情页时,发现只爬取到了一条文章的内容,之后才发现是

'content': response.xpath('//p[@align="left"]/span/text()').extract()

这一行出错,我这一句是根据第一篇文章编写,原以为每篇文章的align属性的值都是left,之后检查发现,只有第一篇符合。所以导致,只爬取定义一篇文章的内容。
之后改为

'content': response.xpath('//p[@class="MsoNormal"]/span/text()').extract()

发现每篇文章到被抓取到了。

4.3中文爬取输出Unicode编码

我爬取的信息在终端上显示出来是这样的

2017-05-15 22:44:30 [scrapy.core.scraper] DEBUG: Scraped from <200 http://ggglxy.scu.edu.cn/index.php?c=article&id=915>
{'content': [u'2017', u'\u5e74', u'3', u'\u6708', u'24', u'\u65e5\u4e0b\u5348\uff0c\u7f8e\u56fd\u534e\u76db\u987f\u5927\u5b66\u827e\u4e39\u526f\u6559\u6388\uff08', u'Daniel Abramson', u'\uff09\u5b66\u672f\u8bb2\u5ea7\u300a\u90fd\u6c5f\u5830\u704c\u533a\u7684\u957f\u671f\u793e\u4f1a\u751f\u6001\u97e7\u6027\u53ca\u5176\u5bf9\u571f\u5730\u653f\u7b56\u3001\u6751\u843d\u89c4\u5212\u548c\u793e\u533a\u6cbb\u7406\u7684\u542f\u793a\u300b\uff08', u'Long-term Social-Ecological Resilience in the Dujiangyan Irrigation District:\r\nImplications for Land Policy, Settlement Planning, and Community Governance', u'\uff09\u5728\u516c\u5171\u7ba1\u7406\u5b66\u9662', u'214', u'\u6210\u529f\u4e3e\u529e\u3002\u56db\u5ddd\u5927\u5b66\u516c\u5171\u7ba1\u7406\u5b66\u9662\u5218\u6da6\u79cb\u6559\u6388\u4e3b\u6301\u4e86\u6b64\u6b21\u8bb2\u5ea7\uff0c\u571f\u5730\u8d44\u6e90\u4e0e\u623f\u5730\u4ea7\u7ba1\u7406\u7cfb\u9a6c\u7231\u6167\u526f\u6559\u6388\u3001\u571f\u5730\u8d44\u6e90\u7ba1\u7406\u

并不是显示的中文,包括输出的json文件也是这种样子,查询网上信息得到的结果是需要去修改目录下pipelines.py 文件为:

import json
import codecs
class FilterWordsPipeline(object):
    def __init__(self):
        # self.file = open('data.json', 'wb')
        self.file = codecs.open(
            'scraped_data_utf8.json', 'w', encoding='utf-8')
    def process_item(self, item, spider):
        line = json.dumps(dict(item), ensure_ascii=False) + "\n"
        self.file.write(line)
        return item
    def spider_closed(self, spider):
        self.file.close()

但我有按照它说的去修改问题并没有得到解决,自己研究出来了两种办法:一种是网上有在线的unicode转换工具可以转换为中文;另外一种是将爬取到信息不再导出为json文件而是xml文件,这个问题就得到解决了,它是正常显示的中文。我也觉得这是一件很神奇的事情。

7.PNG

爬取工作开展思路:

首先打开川大公共管理学院首页,浏览其信息确定需要爬取的信息;再使用浏览器的开发者工具,确定需要爬取的数据的具体路径;之后使用 scrapy shell 来测试xpath或者css的表达式是否正确;最后编写scrapy代码爬取数据。

1.需要爬取哪些数据

1.png

我定义的数据爬取是直接在首页显示的这12条新闻动态,首先需要在首页获取到新闻文章的标题以及它的url地址。


12.jpg

打开新闻详情页,确定需要在该页面爬取的数据:标题和内容文本。

2.用开发者工具确定xpath表达式,并检验

学院首页html

被黄线标明的信息是我想获取的数据,获取具有class属性且其值为fl的a标签里的url地址,所以xpath表达式为:

//a[@class="fl"]/@href
新闻详情页html

在新闻详情页,想得到的数据是标题和文章内容,可以看到标题在 h1标签内,其xpath表达式是:

//div[@class="detail_zv_title"]/h1/text()
新闻详情页html

新闻详情页中,文章内容在p标签下的<span>标签中,其xpath表达式为:

//p[@class="MsoNormal"]/span/text()

3.编写news_spider.py文件

import scrapy


class StackOverflowSpider(scrapy.Spider):
    name = 'news'
    start_urls = ['http://ggglxy.scu.edu.cn/']

    def parse(self, response):
        for href in response.xpath('//a[@class="fl"]/@href'):
            url = response.urljoin(href.extract())
            yield scrapy.Request(url, callback=self.parse_news)
    def parse_news(self, response):
        yield {
            'title': response.xpath('//div[@class="detail_zy_title"]/h1/text()').extract(),
            'content': response.xpath('//p[@class="MsoNormal"]/span/text()').extract(),

        }

执行代码后,得到是:


4.PNG

不太理想的是它爬取的数据是这样的:

image.png

但是,输出为xml文件显示出来的是正常的中文,如果输出为json文件又变成了unicode编码。

4.爬取过程中遇到的问题

4.1关于定义item的问题
6.PNG

我在创建scrapy爬取工程时,并没有自定义item文件,因为在编写news_spider.py并没有用到它,但还是成功爬取了信息。所以我现在也不太清楚是否一定到去定义item文件,去定义它有什么好处。

4.2xpath表达式定义出错导致爬取的数据变少了

我在爬取新闻详情页时,发现只爬取到了一条文章的内容,之后才发现是

'content': response.xpath('//p[@align="left"]/span/text()').extract()

这一行出错,我这一句是根据第一篇文章编写,原以为每篇文章的align属性的值都是left,之后检查发现,只有第一篇符合。所以导致,只爬取定义一篇文章的内容。
之后改为

'content': response.xpath('//p[@class="MsoNormal"]/span/text()').extract()

发现每篇文章到被抓取到了。

4.3中文爬取输出Unicode编码

我爬取的信息在终端上显示出来是这样的

2017-05-15 22:44:30 [scrapy.core.scraper] DEBUG: Scraped from <200 http://ggglxy.scu.edu.cn/index.php?c=article&id=915>
{'content': [u'2017', u'\u5e74', u'3', u'\u6708', u'24', u'\u65e5\u4e0b\u5348\uff0c\u7f8e\u56fd\u534e\u76db\u987f\u5927\u5b66\u827e\u4e39\u526f\u6559\u6388\uff08', u'Daniel Abramson', u'\uff09\u5b66\u672f\u8bb2\u5ea7\u300a\u90fd\u6c5f\u5830\u704c\u533a\u7684\u957f\u671f\u793e\u4f1a\u751f\u6001\u97e7\u6027\u53ca\u5176\u5bf9\u571f\u5730\u653f\u7b56\u3001\u6751\u843d\u89c4\u5212\u548c\u793e\u533a\u6cbb\u7406\u7684\u542f\u793a\u300b\uff08', u'Long-term Social-Ecological Resilience in the Dujiangyan Irrigation District:\r\nImplications for Land Policy, Settlement Planning, and Community Governance', u'\uff09\u5728\u516c\u5171\u7ba1\u7406\u5b66\u9662', u'214', u'\u6210\u529f\u4e3e\u529e\u3002\u56db\u5ddd\u5927\u5b66\u516c\u5171\u7ba1\u7406\u5b66\u9662\u5218\u6da6\u79cb\u6559\u6388\u4e3b\u6301\u4e86\u6b64\u6b21\u8bb2\u5ea7\uff0c\u571f\u5730\u8d44\u6e90\u4e0e\u623f\u5730\u4ea7\u7ba1\u7406\u7cfb\u9a6c\u7231\u6167\u526f\u6559\u6388\u3001\u571f\u5730\u8d44\u6e90\u7ba1\u7406\u

并不是显示的中文,包括输出的json文件也是这种样子,查询网上信息得到的结果是需要去修改目录下pipelines.py 文件为:

import json
import codecs
class FilterWordsPipeline(object):
    def __init__(self):
        # self.file = open('data.json', 'wb')
        self.file = codecs.open(
            'scraped_data_utf8.json', 'w', encoding='utf-8')
    def process_item(self, item, spider):
        line = json.dumps(dict(item), ensure_ascii=False) + "\n"
        self.file.write(line)
        return item
    def spider_closed(self, spider):
        self.file.close()

但我有按照它说的去修改问题并没有得到解决,自己研究出来了两种办法:一种是网上有在线的unicode转换工具可以转换为中文;另外一种是将爬取到信息不再导出为json文件而是xml文件,这个问题就得到解决了,它是正常显示的中文。我也觉得这是一件很神奇的事情。

7.PNG
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 224,764评论 6 522
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,235评论 3 402
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 171,965评论 0 366
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 60,984评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 69,984评论 6 399
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,471评论 1 314
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,844评论 3 428
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,818评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,359评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,385评论 3 346
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,515评论 1 354
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,114评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,836评论 3 338
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,291评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,422评论 1 275
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,064评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,581评论 2 365

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,429评论 25 707
  • 有钱买书装满屋,不看不学等于无。铜臭满身为少德,学问需要下功夫。 老包关公和钟馗,磨刀霍霍抖神威。神州齐筑中国梦,...
    刘现辉民俗画阅读 543评论 0 1
  • 下面和大给大家分享点干货啊,利用目标细分法做市调,这是大家感兴趣的是吧,这批大家都要背下来背的和自己名字一样熟。记...
    杨星河阅读 1,845评论 0 0
  • 不想以这样的方式活下去也不愿意见人低头哈腰的我没做错就是没做错凭什么呢到底有没有人考虑我的感受
    cc你知阅读 120评论 0 0