Scrapy 数据采集

B1:新闻数据采集
一、项目分析

采集对象:四川大学公共管理学院新闻动态栏
采集环境:Ubuntu+MobaXterm
采集目的:采集出四川大学公共管理学院新闻动态栏的191条新闻

二、采集步骤

1.采集新闻数据,首先要分析采集数据的网页有什么内容,对网页进行拆分,了解原网页的结构布局,包含什么字段(元素)。

3.png

由上图可知,该网页是一个标题集+详细页面(list+items)的形式。

5.png

借助网页开发者工具,查看网页源码,可以看见网页对应的各个元素字段。

2.分析采集任务,明确我们要采集的内容,确定要采集的字段(元素)。
基于上一步骤的分析,我们可以看见网页的具体形式,由此确定新闻数据采集的字段:标题(title)、时间(time)、详情(text)、图片(picture)。

3.制定采集方案:爬取步骤,爬取规则
爬取步骤:首先爬出标题集页面的链接,一共有10页。再通过爬出的链接进入详情页爬取每一条新闻的标题、时间、详情以及图片。
爬取规则:利用Xpath规则定位。

友情链接:Xpath语法:http://www.w3school.com.cn/xpath/xpath_syntax.asp

4.编写代码并调试
(1)修改item.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 NItem(scrapy.Item):
  # define the fields for your item here like:
  # name = scrapy.Field()
  time = scrapy.Field()
  title = scrapy.Field()
  text = scrapy.Field()
  picture = scrapy.Field()
  pass

tips:注意class的名称NItem,在写spiders中会用到。

(2)编写spiders:
newsspider.py:

import scrapy
from news.items import NItem

class NewsSpider(scrapy.Spider):
name="newsspider"#设置爬虫name,这是唯一定位实例的属性
start_urls=[     #爬取的起始网页
'http://ggglxy.scu.edu.cn/index.php?c=special&sid=1',
]
def parse(self,response):
    for href in response.xpath('//div[@class="news_c fr"]/h3[@class="mb10"]/a/@href').extract():
        yield scrapy.Request(response.urljoin(href),callback=self.parse_news)#将爬出的链接传值给parse函数
    next_page=response.xpath('//div[@class="pager cf tr pt10 pb10 mt30 mobile_dn"]/li[last()-1]/a/href').extract()
    last_page=response.xpath('//div[@class="pager cf tr pt10 pb10 mt30 mobile_dn"]/li[last()]/a/href').extract()
    if last_page is not None:#判断最后一页是否为空,如果不是,继续爬取,如果是,则停止爬取
        next_page="http://ggglxy.scu.edu.cn/"+next_page
        yield scrapy.Request(next_page, callback=self.parse)
def parse_news(self,response):
        item = NewsItem()
        item['time'] = response.xpath('//div[@class="detail_zy_title"]/p/text()').extract()#使用xpath方式选择信息
        item['title'] = response.xpath('//div[@class="detail_zy_title"]/h1/text()').extract()
        item['text'] = response.xpath('//div[@class="detail_zy_c pb30 mb30"]/p/span/text()').extract()
        item['picture'] = response.xpath('//div[@class="detail_zy_c pb30 mb30"]/p/image/@src').extract()
        yield item

tips:
(1)注意news.items中news一定是项目名称。

 import scrapy
from news.items import NItem#必须要写,否则NItem没有定义
class NewsSpider(scrapy.Spider):  

没有写from news.items import NItem:

6.png

没有将news.items写成项目名称:

7.png

(2)注意括号,符号,单词拼写等细节。

 item['time'] = response.xpath('//div[@class="detail_zy_title"]/p/text()').extract()
  item['title'] = response.xpath('//div[@class="detail_zy_title"]/h1/text()').extract()
  item['text'] = response.xpath('//div[@class="detail_zy_c pb30 mb30"]/p/span/text()').extract()
  item['picture'] = response.xpath('//div[@class="detail_zy_c pb30 mb30"]/p/image/@src').extract()  

若将中括号[]写成():

2.png

(3)路径错误。
我之前爬错了网页,结果什么都没有爬出来:

8.png

(4)注意设置判断,结束爬取。

  if last_page is not None:
    next_page="http://ggglxy.scu.edu.cn/"+next_page
    yield scrapy.http.Request(next_page,callback=self.parse)  

如果不设置判断,就只爬出来一部分数据:

9.png

5.提取数据

10.png

得到n.json:

12.png

若要得到中文的数据,可以修改settings.py: 添加

   FEED_EXPORT_ENCODING = 'utf-8'

如下图:

  SPIDER_MODULES = ['teacher.spiders']
  NEWSPIDER_MODULE = 'teacher.spiders'
  FEED_EXPORT_ENCODING = 'utf-8'#中文    

也可以在执行爬虫的时候,直接输入以下命令:

scrapy crawl yourspider -o name.json -s FEED_EXPORT_ENCODING=utf-8

得到news.json:

11.png

友情链接:unicode转中文:http://www.phpstudy.net/c.php/91841.html

B2:教师资料采集

步骤和方法与B1相同。
得到相应文件:
1.item.py:

import scrapy


class TeachersItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
name = scrapy.Field()
position = scrapy.Field()
description = scrapy.Field()  

2.tc.py

import scrapy
from teacher.items import TeachersItem

class TeacherSpider(scrapy.Spider):
name="tc"
start_urls=[
'http://ggglxy.scu.edu.cn/index.php?c=article&a=type&tid=18&page_1_page=1',
]

def parse(self,response):
    for href in response.xpath('//div[@class="l fl"]/a/@href').extract():
        yield scrapy.http.Request(response.urljoin(href), callback=self.parse_teacher)
  
    next_page=response.xpath('//div[@class="pager cf tc pt10 pb10 mobile_dn"]/li[last()-1]/a/@href').extract_first()
    last_page=response.xpath('//div[@class="pager cf tc pt10 pb10 mobile_dn"]/li[last()]/a/@href').extract_first()
    if last_page is not None:
        next_page="http://ggglxy.scu.edu.cn/"+next_page
        yield scrapy.http.Request(next_page, callback=self.parse)
  
def parse_teacher(self,response):
    item = TeachersItem()
    item['name'] = response.xpath('//div[@class="r fr"]/h3/text()').extract()
    item['position'] = response.xpath('//div[@class="r fr"]/p/text()').extract()
    item['description'] = response.xpath('//div[@class="r fr"]/div/text()').extract()
    yield item  

3.t.json

22.png
总结

耐心+细心

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

推荐阅读更多精彩内容