創(chuàng)建項目
利用scrapy命令行創(chuàng)建一個名為“tutorial”的項目
scrapy startproject tutorial
生成的目錄格式為
tutorial/
scrapy.cfg #項目配置文件
tutorial/
__init__.py
items.py
pipelines.py
settings.py
spiders/ #放置spider代碼的目錄.
__init__.py
...
定義Item
Item是保存爬取到的內(nèi)容的容器漫谷,就像是Python中的dict
類似在ORM中做的一樣,可以通過創(chuàng)建一個 scrapy.Item 類, 并且定義類型為 scrapy.Field 的類屬性來定義一個Item罐旗。
Sample of /tutorial/items.py
import scrapy
import time
#LianjiaItem繼承自scrapy.Item
class LianjiaItem(scrapy.Item):
#所有想要爬取的字段都是scrapy.Field類型
_id = scrapy.Field()
title = scrapy.Field()
acreage = scrapy.Field()
cityCode = scrapy.Field()
districtName = scrapy.Field()
face = scrapy.Field()
floor_state = scrapy.Field()
houseSellId = scrapy.Field()
latitude = scrapy.Field()
longitude = scrapy.Field()
hall = scrapy.Field()
metroRemark = scrapy.Field()
plateName = scrapy.Field()
propertyName = scrapy.Field()
referAvgPrice = scrapy.Field()
room = scrapy.Field()
showPrice = scrapy.Field()
unitPrice = scrapy.Field()
title = scrapy.Field()
tags = scrapy.Field()
crawl_date = scrapy.Field()
編寫爬蟲(Spider)
為了創(chuàng)建一個Spider平匈,必須繼承 scrapy.Spider 類腮考, 且定義以下三個屬性:
- name: 用于區(qū)別Spider忘巧。 該名字必須是唯一的,不可以為不同的Spider設定相同的名字。
- start_urls: 包含了Spider在啟動時進行爬取的url列表髓抑。 因此咙崎,第一個被獲取到的頁面將是其中之一。 后續(xù)的URL則從初始的URL獲取到的數(shù)據(jù)中提取吨拍。
-
parse()
是spider的一個方法褪猛。 被調(diào)用時,每個初始URL完成下載后生成的 Response 對象將會作為唯一的參數(shù)傳遞給該函數(shù)羹饰。 該方法負責解析返回的數(shù)據(jù)(response data)伊滋,提取數(shù)據(jù)(生成item)以及生成需要進一步處理的URL的 Request
對象。
Sample of Spider.py
import scrapy
class LianjiaSpider(scrapy.spiders.Spider):
name = "lianjia_spider"
allowed_domains = ["lianjia.com"]
start_urls = ["http://bj.lianjia.com/fangjia/" ]
def parse(self, response):
filename = response.url.split("/")[-2]
with open(filename, 'wb') as f:
f.write(response.body)
Scrapy為Spider的 start_urls 屬性中的每個URL創(chuàng)建了 scrapy.Request 對象队秩,并將 parse
方法作為回調(diào)函數(shù)(callback)賦值給了Request笑旺。
Request對象經(jīng)過調(diào)度,執(zhí)行生成 scrapy.http.Response 對象并送回給spider parse() 方法馍资。