抓取scrapy中文文檔 第一個Scrapy項目實現

來源:互聯網
上載者:User

標籤:des   style   http   使用   strong   os   

使用Scrapy這個python的網路爬蟲架構抓取Scrapy中文文檔

 開發第一步:建立項目scrapy startproject myfirst

目錄結構:

myfirst

│ scrapy.cfg        Scrapy項目設定檔│└─myfirst           Scrapy項目代碼存放目錄    │  items.py     儲存從抓取的網頁中需要儲存的資料,再其中指定要儲存的域    │  pipelines.py 管道檔案,用於儲存從抓取的網頁中解析出的其他頁面的url,相當於任務隊列    │  settings.py  爬蟲設定檔    │  __init__.py     │    └─spiders       存放爬蟲定義的目錄            __init__.py


編寫items.py檔案:

from scrapy.item import Item, Field
import sys
default_encoding = ‘cp936‘
if sys.getdefaultencoding() != default_encoding:
        reload(sys)
sys.setdefaultencoding(default_encoding)
class DmozItem(Item):
         title = Field()
   link = Field()
   desc = Field()

在items.py中,定義了三個Field用於指定我們要從抓取的網頁資料中抽取的資料

  編寫爬蟲程式myfirstSpider.py,在spiders目錄下:

#encoding: utf-8
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from scrapy.http import Request

from myfirst.items import MyfirstItem
import os

#設定預設編碼
import sys
default_encoding = ‘cp936‘
if sys.getdefaultencoding() != default_encoding:
reload(sys)
sys.setdefaultencoding(default_encoding)

class ScrapyDocSpider(BaseSpider):
      name = ‘ScrapyDoc‘ #設定爬蟲的標識名
  allowed_domains = [‘scrapy-chs.readthedocs.org‘] #指定爬蟲在哪個域中抓取資料 
  start_urls = [‘http://scrapy-chs.readthedocs.org/zh_CN/latest‘]   #設定爬蟲抓取的入口url地址

      def parse(self,response):
    if response.url.split("/")[-1] == ‘‘:
      filename = response.url.split("/")[-2]
    else :
      dirname = response.url.split("/")[-2]
    #判斷是否有此目錄,如果沒有就建立
    if os.path.isdir(dirname) == False:
      os.mkdir(dirname)
    filename = ‘/‘.join(response.url.split("/")[-2:])

    #儲存檔案
    open(filename,‘wb‘).write(response.body)

    sel = HtmlXPathSelector(response)   #建立Html解析器  
    sites = sel.select(‘//li[@class="toctree-l1"]‘)
    for site in sites:
      item = MyfirstItem()
      item[‘title‘] = site.select(‘a/text()‘).extract()

      #產生串連 begin ,因為從頁面提取的串連都是相對位址  
      link = site.select(‘a/@href‘).extract()[0]
      url = response.url

      #地址形式是否為 ../spiders.html 這種形式,需要回到上級地址
      if link.split(‘/‘)[0] == ‘..‘:
        url2 = ‘/‘.join(url.split(‘/‘)[0:-2]) + ‘/‘ + ‘/‘.join(link.split(‘/‘)[1:])
      else:
        url2 = ‘/‘.join(url.split(‘/‘)[0:-1]) + ‘/‘ + link

      item[‘link‘] = [url2]
      #產生串連 end
      yield item

      #返回多個request
      yield Request(url=url2,callback=self.parse)
    return

爬蟲將從start_urls列表中的url開始,將每一個url封裝成Request對象,並將parse方法作為回呼函數,將返回的Response作為參數傳入,response即返回的響應,其中包含了headers和body,headers即響應的頭部資訊,body即響應的本文資訊(html靜態頁面或json\xml等。。)

在parse方法中即可以利用html/xml解析器通過xpath抓取特定節點的資料,儲存到items.py中的指定field中

並將解析到的頁面中的其他url轉成request返回,交給spider,由spider存放到pipeline隊列中scheduler的調度,繼續抓取下一個頁面

 

回到項目主目錄,建立doc目錄,切到doc目錄,doc作為下載的文檔存放目錄

運行爬蟲:

scrapy crawl ScrapyDoc 

啟動名為ScrapyDoc的爬蟲。。。

開始抓取頁面 。。。。。。

 

將從頁面中解析的資料儲存到item中

scrapy crawl ScrapyDoc -o myfirst.json -t json  

最後items中定義的域中的資料將作為json資料存放區到myfirst.json檔案中

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.