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

使用Scrapy這個python的網絡爬蟲框架抓取Scrapy中文文檔html

 開發第一步:新建項目scrapy startproject myfirstpython

目錄結構:json

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用於指定咱們要從抓取的網頁數據中抽取的數據dom

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

#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 ide

爬蟲將從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文件中

相關文章
相關標籤/搜索