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閱讀 228,443評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,530評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,407評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,981評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,759評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,204評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,263評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,415評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,955評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,650評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,892評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,675評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,967評論 2 374

推薦閱讀更多精彩內容