構建自己的數(shù)據(jù)王國
- 新建項目
- 明確目標
- 制作爬蟲
- 保存數(shù)據(jù)
一、新建項目(scrapy startproject)
- 在爬取前,必須創(chuàng)建一個新的scrapy項目,進入自定義的項目目錄中,運行下列命令:
scrapy startproject myspider
- 其中,myspider為項目名稱,可以看到將會創(chuàng)建一個myspider文件夾,目錄結構大致如下:
這些文件的主要作用列舉如下:
- scrapy.cfg:項目的配置文件
- myspider/:項目的python模塊,將會從這里引用代碼
- myspider/items.py:項目的目標文件
- myspider/pipelines.py:項目的管道文件
- myspider/settings.py:項目的設置文件
- myspider/spiders/:存儲爬蟲代碼目錄
二、 明確目標(myspider/items.py)
準備抓取網(wǎng)站http://www./channel/teacher.shtml網(wǎng)站里的所有講師的姓名、職稱和個人信息。
- Item用來定義結構化數(shù)據(jù)字段,用以保存爬取到的數(shù)據(jù),有點像python中的dict,但是提供了一些額外的保護減少錯誤。
- 可以在myspider/items.py中創(chuàng)建一個Item類,并且通過在Item類中繼續(xù)定義多個Field類(該類是繼承了dict)來完善該Item類
- 接下來,創(chuàng)建一個ItcastItem類,和構建item模型(model)。
import scrapy
class ItcastItem(scrapy.Item):
name = scrapy.Field()
level = scrapy.Field()
info = scrapy.Field()
三、 制作爬蟲(spiders/itcastspider.py)
爬蟲功能要分兩步:
1、爬數(shù)據(jù)
- 在當前目錄下輸入命令,將在myspider/spiders目錄下創(chuàng)建一個名為itcast的爬蟲,并指定爬取域的范圍:
scrapy genspider itcast ""
- 打開myspider/spiders目錄里的itcast.py,默認增加了下列代碼:
import scrapy
class ItcastSpider(scrapy.Spider):
name = 'itcast'
allowed_domains = ['']
start_urls = ['http://www./channel/teacher.shtml']
def parse(self, response):
pass
其實也可以由我們自行創(chuàng)建itcast.py并編寫上面的代碼,只不過使用命令可以免去編寫固定代碼的麻煩。
要建立一個spider,你必須用scrapy.spider類創(chuàng)建一個子類,并確定了三個強制的屬性和一個方法。
- name = ‘itcast’:這個爬蟲的識別名稱,必須是唯一的,在不同的爬蟲必須定義不同的名字
- allow_domains=[]:是搜索的域名范圍,也就是爬蟲的約束區(qū)域,規(guī)定爬蟲只爬取這個域名下的網(wǎng)頁,不存在的URL會被忽略
- start_urls=[]:爬取的URL元祖/列表,爬蟲從這里開始抓取數(shù)據(jù),所以,第一次下載的數(shù)據(jù)將會從這些urls開始,其他子URL將會從這些起始URL中繼承性生成。
- parse(self,response):解析的方法,每個初識URL完成下載后將被調(diào)用,調(diào)用的時候傳入從每一個URL傳回的Response對象來作為唯一參數(shù)主要作用如下:
- 負責解析返回的網(wǎng)頁數(shù)據(jù)(reponse.body),提取結構化數(shù)據(jù)(生成item)
- 生成需要下一頁的URL請求
- 將start_urls的值修改為需要爬取的第一個url
start_urls=['http://www./channel/teacher.shtml']
def parse(self, response):
filename="teacher.html"
with open(filename,'wb') as f:
f.write(response.body)
- 然后在myspider/myspider目錄下執(zhí)行
scrapy crawl itcast
- 運行后,打印的日志出現(xiàn)[scrapy.core.engine] INFO: Spider closed (finished),代表執(zhí)行完成。
2、取數(shù)據(jù)
- 爬取整個網(wǎng)頁源碼完畢,接下來是提取過程,首先觀察頁面源碼:
<div class="li_txt">
<h3> xxx </h3>
<h4> xxxxx </h4>
<p> xxxxxxx </p>
- 之前在myspider/items.py里定義了一個MyspiderItem類,這里引入進來
from myspider.items import MyspiderItem
- 然后將我們得到的數(shù)據(jù)封裝到一個MyspiderItem對象中,可以保存每個老師的屬性:
def parse(self, response):
# filename="teacher.html"
# with open(filename,'wb') as f:
# f.write(response.body)
items=[]
for each in response.xpath("http://div[@class='li_txt']"):
item=MyspiderItem()
name=each.xpath("h3/text()").extract()[0]
level=each.xpath("h4/text()").extract()[0]
info=each.xpath("p/text()").extract()[0]
item['name']=name
item['level']=level
item['info']=info
items.append(item)
return items
四、 保存數(shù)據(jù)
我們暫時先不處理管道。
scrapy保存信息的最簡單的方法主要有四中,-o輸出指定格式的文件,命令如下:
#json格式,默認為unicode編碼
scrapy crawl itcast -o teachers.json
scrapy crawl itcast -o teachers.jsonl
scrapy crawl itcast -o teachers.csv
scrapy crawl itcast -o teachers.xml
|