1.scrapy概述
使用Python開(kāi)發(fā)的主要進(jìn)行數(shù)據(jù)采集的一個(gè)應(yīng)用程序框架,核心使用它來(lái)進(jìn)行爬蟲(chóng)程序的快速開(kāi)發(fā),底層使用了twisted異步模塊,所以在進(jìn)行數(shù)據(jù)采集下載時(shí)效率非常高!
2.安裝
pip install scrapy
或者
easy_install scrapy
PS:在windows上運(yùn)行項(xiàng)目會(huì)出現(xiàn)問(wèn)題,
#如果出現(xiàn)類似于WinError這樣的的問(wèn)題,請(qǐng)安裝下面的模塊
# 安裝pypiwin32模塊,用于scrapy模塊可能調(diào)用win底層C庫(kù)進(jìn)行函數(shù)操作
pip install pypiwin32
3.創(chuàng)建項(xiàng)目
scrapy startproject <spider_name>
創(chuàng)建好的項(xiàng)目文件結(jié)構(gòu)如下:
|-- myspider/ 項(xiàng)目根目錄
|-- scrapy.cfg 項(xiàng)目配置文件 [cfg: config]
|-- myspider/ 爬蟲(chóng)模塊->爬蟲(chóng)程序開(kāi)發(fā)都在這個(gè)模塊中
|-- spiders/ 爬蟲(chóng)程序所在的目錄
|-- items.py 采集的數(shù)據(jù)->定義封裝模型類的模塊
|-- pipelines.py 采集的數(shù)據(jù)->采集完成之后進(jìn)行數(shù)據(jù)驗(yàn)證、存儲(chǔ)的模塊
|-- middlewares.py 中間件定義的模塊
|-- settings.py 項(xiàng)目設(shè)置模塊
4.爬蟲(chóng)開(kāi)發(fā)
-
- 明確自己爬取網(wǎng)頁(yè)獲取的信息定義item類型,封裝字段。
items.py文件
import scrapy class ZhilianItem(scrapy.Item): # 定義屬性字段 job = scrapy.Field() company = scrapy.Field() salary = scrapy.Field() - 明確自己爬取網(wǎng)頁(yè)獲取的信息定義item類型,封裝字段。
-
- 開(kāi)發(fā)具體爬蟲(chóng)代碼
執(zhí)行命令自動(dòng)創(chuàng)建爬蟲(chóng)文件
scrapy genspider zhilain "zhilian.cn"
將創(chuàng)建一個(gè)名為zhilian的爬蟲(chóng),并指定爬取域的范圍:"zhilian.cn"在spiders文件夾里手動(dòng)新建爬蟲(chóng)文件 zhilain.py
代碼:
import scrapy class ZhilianSpider(scrapy.Spider): #修改設(shè)置,設(shè)置符合自己需求 name = "zhilain" allowed_domains = ["zhilian.cn"] start_urls = ( 'http://www.itcast.cn/', ) def parse(self, response): pass在spiders/zhilianspider.py模塊中定義ZhilianSpider類型
繼承自scrapy.Spider
類型中的屬性:name屬性~爬蟲(chóng)名稱,用于在命令行啟動(dòng)爬蟲(chóng)時(shí)調(diào)用
類型中的屬性:start_urls屬性~采集數(shù)據(jù)的初始url地址[列表、元組]
類型中的屬性:allowed_domains屬性~采集數(shù)據(jù)的網(wǎng)站域名限制
類型中的方法:parse(self, response)采集完數(shù)據(jù)之后自動(dòng)執(zhí)行的函數(shù) -
- 數(shù)據(jù)處理
parse(self, response)函數(shù)自動(dòng)獲取爬取的數(shù)據(jù),通過(guò)自己編寫(xiě)篩選獲取具體需要的數(shù)據(jù)部分。
代碼:
#先引入之前寫(xiě)好的item模塊的封裝類型函數(shù) from .. import items #在parse(self, response)函數(shù)里處理得到response, #通過(guò)xpath、css等技術(shù)篩選得到具體數(shù)據(jù) job_items = [] # 將得到的數(shù)據(jù)封裝成item對(duì)象 item = items.ZhilianItem() item['job'] = job item['company'] = company item['salary'] = salary #將數(shù)據(jù)添加保存在列表里 job_items.append(item) #這樣直接保存在列表,不經(jīng)過(guò)pipeline return job_items #不推薦這樣,一般用管道存儲(chǔ)在數(shù)據(jù)庫(kù)里 - 數(shù)據(jù)處理
用命令直接將數(shù)據(jù)保存成文件
- json格式,默認(rèn)為Unicode編碼
scrapy crawl zhilian -o zhilian.json- json lines格式,默認(rèn)為Unicode編碼
scrapy crawl zhilian -o zhilian.jsonl- csv 逗號(hào)表達(dá)式,可用Excel打開(kāi)
scrapy crawl zhilian -o zhilian.csv- xml格式
scrapy crawl zhilian -o zhilian.xml
注意:
Python2.x默認(rèn)編碼環(huán)境是ASCII,當(dāng)和取回的數(shù)據(jù)編碼格式不一致時(shí),可能會(huì)造成亂碼;
# 可以指定保存內(nèi)容的編碼格式,一般情況下,添加:
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
# 這三行代碼是Python2.x里解決中文編碼的萬(wàn)能鑰匙,
# Python3學(xué)乖了,默認(rèn)編碼是Unicode了...
- 數(shù)據(jù)庫(kù)存儲(chǔ)
不在使用 job_items = [] 存儲(chǔ)數(shù)據(jù)
直接將獲取封裝的數(shù)據(jù)item交給pipelines#將原來(lái)的添加到列表替換 job_items.append(item) #刪除這個(gè)換為yield yield item
當(dāng)Item在Spider中被收集之后,它將會(huì)被傳遞到Item Pipeline,這些Item Pipeline組件按定義的順序處理Item。
pipelines.py文件
# 導(dǎo)入數(shù)據(jù)庫(kù)引擎對(duì)象
from sqlalchemy import create_engine
# 導(dǎo)入會(huì)話構(gòu)建對(duì)象
from sqlalchemy.orm import sessionmaker
# 替換mysqldb模塊
import pymysql
pymysql.install_as_MySQLdb()
class MyspiderPipeline(object):
def process_item(self, item, spider):
return item
#自定義的Pipeline處理模塊
class ZhilianPipeline(object):
'''
處理智聯(lián)招聘數(shù)據(jù)的pipeline,負(fù)責(zé)最終的數(shù)據(jù)驗(yàn)證和數(shù)據(jù)存儲(chǔ)
'''
def __init__(self):
#初始化對(duì)象數(shù)據(jù):可以用于初始化資源
#如:打開(kāi)文件、打開(kāi)數(shù)據(jù)庫(kù)連接等等操作
self.engine = create_engine("mysql://數(shù)據(jù)庫(kù)連接?charset=utf8")
Session = sessionmaker(bind=self.engine)
self.session = Session()
def open_spider(self, spider):
#爬蟲(chóng)開(kāi)啟時(shí)需要調(diào)用的函數(shù),經(jīng)常用于數(shù)據(jù)初始化
pass
def close_spider(self, spider):
'''
爬蟲(chóng)程序關(guān)閉時(shí)自動(dòng)調(diào)用的函數(shù)
經(jīng)常用于做一些資源回收的工作,如:關(guān)閉和數(shù)據(jù)庫(kù)的會(huì)話連接
'''
# 提交數(shù)據(jù),斷開(kāi)連接
self.session.commit()
self.session.close()
def process_item(self, item, spider):
'''
該函數(shù)會(huì)在爬蟲(chóng)采集并封裝好Item對(duì)象時(shí)自動(dòng)調(diào)用
函數(shù)中針對(duì)item數(shù)據(jù)進(jìn)行驗(yàn)證和存儲(chǔ)
'''
print ">>>>>>>>>zhilian pipelines invoking......."
# 定義sql語(yǔ)句
sql = "insert into job(job, company, salary) values('%s', '%s', '%s')"\
% (item['job'], item['company'], item['salary'])
# 執(zhí)行sql語(yǔ)句
self.session.execute(sql)
settings.py文件
#更改初始設(shè)置,將我們自己定義的添加到設(shè)置里
ITEM_PIPELINES = {
#'mySpider.pipelines.SomePipeline': 300,
"mySpider.pipelines.ZhilianPipeline":300,
}
只需啟動(dòng)爬蟲(chóng) scrapy crawl zhilain 即可在數(shù)據(jù)庫(kù)查看獲取數(shù)據(jù)。
樣圖:
