標籤: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檔案中