創(chuàng)建項(xiàng)目 scrapy startproject + 項(xiàng)目名稱
創(chuàng)建爬蟲文件 進(jìn)入到spiders 文件夾下 創(chuàng)建爬蟲文件 scrapy genspider + 爬蟲文件名稱 + 網(wǎng)站的域
創(chuàng)建好之后打開(kāi) pycharm 選擇虛擬環(huán)境
注意:項(xiàng)目名稱和爬蟲文件的名稱不能重名
scrapt 項(xiàng)目的架構(gòu)(框架)
chinaz 項(xiàng)目文件夾
spiders 存放所有的爬蟲文件
zzw.py 爬蟲文件(解析response 響應(yīng),提取目標(biāo)數(shù)據(jù)和url)
items.py 編寫要爬取的字段
middiewares.py 中間件(爬蟲中間件,下載中間件)
piplines.py 數(shù)據(jù)管道(在里面做數(shù)據(jù)持久化)
settings.py 設(shè)置文件(設(shè)置請(qǐng)求頭,下載延遲,是否遵循robot協(xié)議,等 ....)
scrapy.cfg 配置文件(部署項(xiàng)目的時(shí)候會(huì)用到)
運(yùn)行 : 進(jìn)入chainz/ 在進(jìn)入 spiders 在執(zhí)行scrapy crawl zzw
scrapy 流程
setting.py 設(shè)置文件
ROBOTSTXT_OBEY = False 是否要遵守robot 協(xié)議,為True 表示遵守,要改為False 不遵守
DOWNLOAD_DELAY = 0 設(shè)置下載延遲,默認(rèn)為0 ,將注掉的代碼打開(kāi)
DEFAULT_REQUEST_HEADERS = {
'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
} 默認(rèn)的請(qǐng)求頭,是全局的,將注掉的代碼打開(kāi)
zzw.py 爬蟲文件
name = 'zzw':爬蟲文件的名稱,每一個(gè)爬蟲文件都有一個(gè)爬蟲的名稱,是唯一的
allowed_domains = ['chinaz.com']: allowed_domains = ['chinaz.com']
start_urls = ['http://top.chinaz.com/']: 設(shè)置要爬取的起始的url 鏈接,任務(wù),可以指定多個(gè)
response :接收相應(yīng)結(jié)果,解析數(shù)據(jù),提取新的url
response.status:獲取響應(yīng)的狀態(tài)碼
response.text:獲取響應(yīng)的html文本
response.body:獲取響應(yīng)的二進(jìn)制數(shù)據(jù)(當(dāng)response.text出現(xiàn)亂碼的時(shí)候,可以拿到二進(jìn)制數(shù)據(jù)進(jìn)行解碼)
response.headers:獲取響應(yīng)頭
response.request.headers :獲取請(qǐng)求的請(qǐng)求頭
解析數(shù)據(jù)
導(dǎo)入items.py 文件中要爬取的字段定義的類 例如: from chainz.items import ChainzItem
cate_items = ChainzItem() :實(shí)例化一個(gè)item對(duì)象
利用 response.xpath 做數(shù)據(jù)的提取 例如:
例如:方式 1. title = category_a.xpath('./text()').extract()[0]
方式 2 .title = response.xpath('./text()').extract_first(' ')
獲取出來(lái)的都是Selector對(duì)象,并且都存放在列表里面
extract():作用是將提取到的Selector對(duì)象中的data數(shù)據(jù)提取出來(lái),這里提取出來(lái)的是unicode編碼類型
extract_first(' '):取列表中的第一個(gè)元素,如果列表為空,可以在括號(hào)中添加一個(gè)默認(rèn)值,如果不設(shè)置默認(rèn)值返回的是None
將不完整的url拼接完整
例如:方式 1. cate_items['fristpage'] = urljoin(response.url,href)
方式 2. cate_items['fristpage'] = response.urljoin(href)
yield 方法:將items數(shù)據(jù)交給管道(這里使用yield)管道就使用yield
yield:將獲取到的數(shù)據(jù)都交給管道處理就使用yield 例如:yield.cate_items
發(fā)起一個(gè)請(qǐng)求:例如:yield scrapy Request(url=category_item['fristPage'],callback=self.parse_web_list_data
Request 方法需要的參數(shù):
"""
url, 發(fā)起請(qǐng)求的url地址
callback=None, 請(qǐng)求成功后的回調(diào)
method='GET', 請(qǐng)求的方式
headers=None, 請(qǐng)求頭
cookies=None, cookies
meta=None, 要傳遞的參數(shù)
encoding='utf-8', 編碼類型
priority=0, 優(yōu)先級(jí)
dont_filter=False, 是否要過(guò)濾請(qǐng)求(False去重,不會(huì)重復(fù)請(qǐng)求)
errback=None 請(qǐng)求錯(cuò)誤的回調(diào)
"""
items.py 在這里定義要爬取的字段
例如 :title = scrapy.Field() 定義分類的名稱
price = scrapy.Field() 定義價(jià)格
運(yùn)行代碼 : 進(jìn)入chainz/ 在進(jìn)入 spiders 在執(zhí)行scrapy crawl zzw
pipelines.py 管道 ,在管道里面做數(shù)據(jù)的過(guò)濾和數(shù)據(jù)的持久化
將數(shù)據(jù)存到本地
注意:在使用管道之前,要先激活管道,需要在setings 文件中激活
setting.py 設(shè)置文件
將注釋掉的代碼打開(kāi),在這里進(jìn)行管道的激活,前面表示路徑,后面跟的數(shù)字,數(shù)字越小表示優(yōu)先級(jí)越高,越先經(jīng)過(guò)哪個(gè)類
ITEM_PIPELINES = { 'chinaz.pipelines.ChinazPipeline': 300,}
回到 pipelines.py 管道文件中
定義 open_spider 方法,是一個(gè)可選的方法,有需要的時(shí)候就去調(diào)用,當(dāng)spider 方法開(kāi)啟的時(shí)候,會(huì)執(zhí)行,并且只調(diào)用一次,表示 爬蟲開(kāi)始
定義 close_spider方法, 和open_spider 方法一樣,只調(diào)用一次,表示,爬蟲結(jié)束
mongodb 數(shù)據(jù)持久化 將數(shù)據(jù)存入到 mongodb 數(shù)據(jù)庫(kù)中
return item 的作用:
在初始化中創(chuàng)建數(shù)據(jù)庫(kù)連接 例如:self.client = pymongo.MongoClient(host,port)
獲取數(shù)據(jù)庫(kù) 例如: self.db = self.client[db]
@classmethod 是一個(gè)類方法,crawler:可以從crawler里面獲取到爬蟲的核心組件(從settings.py設(shè)置文件中獲取相關(guān)參數(shù))
def from_crawler(cls, crawler):
例如:host = crawler.settings['MONGO_HOST']
port = crawler.settings['MONGO_PORT']
return cls(host,port)
在 setting.py 設(shè)置文件中 寫入mongodb數(shù)據(jù)庫(kù)相關(guān)配置如下代碼
MONGO_HOST = '127.0.0.1'
MONGO_PORT = 27017
MONGO_DB = 'chinaz-99'
在 item.py 定義方法 例如: def get_collection_name(self): return 'categroy'
回到 pipelines.py 管道文件中
col_name = self.db[item.get_collection_name()]
col_name.insert(dict(item))
定義 close_spider()方法 爬蟲結(jié)束的時(shí)候會(huì)調(diào)用 self.client.close()
mysql 數(shù)據(jù)庫(kù)持久化,將數(shù)據(jù)存放在mysql 數(shù)據(jù)庫(kù)中
在 piplines.py 管道文件中做mysql 的數(shù)據(jù)持久化
創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)連接 self.client = pymysql.Connect(host,user,pwd,db,charset=charset)
創(chuàng)建游標(biāo) self.cursor = self.client.cursor()
在setting.py 設(shè)置文件中 寫入mysql 數(shù)據(jù)庫(kù)相關(guān)配置
MYSQL_HOST = '127.0.0.1'
MYSQL_USER = 'root'
MYSQL_PWD = '123'
MYSQL_DB = 'china_999'
MYSQL_CHARSET = 'utf8'