使用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文件中