1-1主要內(nèi)容lscrapy概述及安裝lscrapy基礎(chǔ)操作n入門程序l核心APIl案例操作~10個(gè)爬蟲程序[10個(gè)不同的類型的網(wǎng)站數(shù)據(jù)]lscrapy shelll深度爬蟲l請求響應(yīng)對象l分布式操作等等1-2內(nèi)容1.scrapy概述官方網(wǎng)站:http://scrapy.org [orginzation]使用Python開發(fā)的主要進(jìn)行數(shù)據(jù)采集的一個(gè)應(yīng)用程序框架,核心使用它來進(jìn)行爬蟲程序的快速開發(fā),底層使用了twisted異步模塊,所以在進(jìn)行數(shù)據(jù)采集下載時(shí)效率非常高!ubuntu/macos 下,在有完善的python環(huán)境的基礎(chǔ)上直接安裝 scrapywindows下:注意~安裝分兩步進(jìn)行l(wèi)先安裝scrapy# 管理員身份運(yùn)行cmd窗口pip install scrapyoreasy_install scrapyPS:注意安裝完scrapy之后,可以正常的進(jìn)行scrapy項(xiàng)目的開發(fā),但是在windows上運(yùn)行項(xiàng)目會(huì)出現(xiàn)問題,如果出現(xiàn)類似于WinError這樣的的問題,請安裝下面的模塊l安裝win32# 需要安裝一個(gè)pypiwin32模塊,用于scrapy模塊可能調(diào)用win底層C庫進(jìn)行函數(shù)操作pip install pypiwin322.項(xiàng)目開發(fā)——?jiǎng)?chuàng)建scrapy項(xiàng)目通過執(zhí)行如下命令,來創(chuàng)建scrapy項(xiàng)目# 通過scrapy命令,加上startproject選項(xiàng),創(chuàng)建一個(gè)名稱為spider_name的爬蟲項(xiàng)目scrapy startproject在pycharm中直接運(yùn)行工具中的cmd終端窗口,執(zhí)行如下命令創(chuàng)建一個(gè)爬蟲項(xiàng)目
scrapy startproject myspider
注意:關(guān)于終端窗口、命令窗口、shell窗口
windows系統(tǒng)中:終端窗口、命令窗口 -> cmd窗口
新系統(tǒng)中win10:shell窗口->power shell->可以執(zhí)行常見的linux命令
終端窗口~Terminal
ubuntu(like linux/unix)系統(tǒng)中:終端~shell->shell命令窗口
Terminal->shell窗口
Mac OS: 終端->shell窗口
創(chuàng)建好的項(xiàng)目文件結(jié)構(gòu)如下:
|-- myspider/? 項(xiàng)目根目錄
? ? |-- scrapy.cfg? 項(xiàng)目配置文件 [cfg: config]
|-- myspider/? 爬蟲 模塊->以后的爬蟲程序開發(fā)都在這個(gè)模塊中
|-- spiders/? 爬蟲程序所在的目錄
|-- items.py? 采集的數(shù)據(jù)->定義封裝模型類的模塊
|-- pipelines.py 采集的數(shù)據(jù)->采集完成之后進(jìn)行數(shù)據(jù)驗(yàn)證、存儲的模塊
|-- middlewares.py 中間件定義的模塊
|-- settings.py 項(xiàng)目設(shè)置模塊
3. 開發(fā)爬蟲程序
準(zhǔn)備工作,分三步進(jìn)行
(1) 分析爬蟲要采集的url地址,分析采集的數(shù)據(jù)字段
http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%8C%97%E4%BA%AC&kw=%E7%88%AC%E8%99%AB&sm=0&sg=cab76822e6044ff4b4b1a907661851f9&p=1
http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%8C%97%E4%BA%AC&kw=%E7%88%AC%E8%99%AB&sm=0&sg=cab76822e6044ff4b4b1a907661851f9&p=2
招聘崗位:job
發(fā)布公司:company
薪水待遇:salary
(2) 定義采集的字段封裝的Item類型,在items.py模塊中,定義Item類
我們通過scrapy項(xiàng)目中的items.py模塊定義封裝采集數(shù)據(jù)字段的類型
為了能使用scrapy提供的各種內(nèi)置功能,讓定義的類型繼承自scrapy.Item類型;類型中的字段屬性通過scrapy.Field()進(jìn)行定義!
import scrapy
class ZhilianItem(scrapy.Item):
? ? '''
? ? 自定義封裝智聯(lián)招聘的item類型,用于封裝采集到的智聯(lián)網(wǎng)站的數(shù)據(jù)
? ? '''
? ? # 定義屬性字段
? ? job = scrapy.Field()
? ? company = scrapy.Field()
? ? salary = scrapy.Field()
(3) 在spiders/zhilianspider.py中開發(fā)爬蟲程序,采集初步數(shù)據(jù)
為了可以直接使用scrapy內(nèi)置的爬蟲操作,讓scrapy自動(dòng)采集數(shù)據(jù),我們需要定義一個(gè)爬蟲處理類
l 在spiders/zhilianspider.py模塊中定義ZhilianSpider類型
l 繼承自scrapy.Spider
l 類型中的屬性:name屬性~爬蟲名稱,用于在命令行啟動(dòng)爬蟲時(shí)調(diào)用
l 類型中的屬性:start_urls屬性~采集數(shù)據(jù)的初始url地址[列表、元組]
l 類型中的屬性:allowed_domains屬性~采集數(shù)據(jù)的網(wǎng)站域名限制
l 類型中的方法:parse(self, response)采集完數(shù)據(jù)之后自動(dòng)執(zhí)行的函數(shù)
數(shù)據(jù)處理
(4) 核心:在pipelines.py模塊中,定義處理Item數(shù)據(jù)的piplelines,將數(shù)據(jù)存儲到數(shù)據(jù)庫中給其他項(xiàng)目做數(shù)據(jù)準(zhǔn)備
備注:
引擎:engine->scrapy引擎模塊:engine.py
調(diào)度器:scheduler->scrapy調(diào)度模塊:scheduler.py
下午課程安排:
l 回顧:python~orm操作
l 了解:orm->mysqldb\pymysql\sqlalchemy
n mysqldb:2.4- 3.4- [2.7—兼容性很差]【了解】
n pymysql:逐步取代mysqldb成為主流底層orm操作模塊
n sqlalchemy:逐步成為python操作mysql數(shù)據(jù)庫的主流模塊
n 擴(kuò)展:了解python操作oracle數(shù)據(jù)庫、mongdb數(shù)據(jù)庫\postgresql數(shù)據(jù)庫的核心操作模塊
l 掌握:sqlalchemy 操作數(shù)據(jù)
n 回顧面向?qū)ο蟮姆庋b
n 爬蟲中數(shù)據(jù)處理的使用——爬蟲程序中使用sqlalchemy操作數(shù)據(jù)
l 擴(kuò)展:pymongo 操作數(shù)據(jù)
l 核心:項(xiàng)目案例~10個(gè)爬蟲程序[10個(gè)不同的類型的網(wǎng)站數(shù)據(jù)]
n 3種不同數(shù)據(jù)的采集(技術(shù)實(shí)現(xiàn))
u 反爬蟲較為復(fù)雜網(wǎng)站的數(shù)據(jù)操作[selenium + phantomjs]
l 新浪微博登錄之后的個(gè)人中心頁面數(shù)據(jù),提取[微博主名稱、發(fā)布的微博,發(fā)布的時(shí)間]
u 智聯(lián)招聘網(wǎng)站數(shù)據(jù)的采集[工作、公司、薪水]->mysql、mongodb
u 段子來了[段子、發(fā)布時(shí)間、發(fā)布人]->mysql、mongodb
n 采集5W條商品數(shù)據(jù)
u 商品圖片、名稱、單價(jià)、描述[、 類型]
u 統(tǒng)計(jì)采集的時(shí)間、數(shù)據(jù)量大小
n 任務(wù):和10班的同學(xué)進(jìn)行溝通,提供爬蟲程序采集適量數(shù)據(jù)
u 1~5個(gè)人一組,負(fù)責(zé)對方一個(gè)項(xiàng)目的數(shù)據(jù)提供
1. orm操作
orm:object relation mapping 對象關(guān)系映射,主要用于將程序中的數(shù)據(jù)和數(shù)據(jù)庫中的記錄進(jìn)行對應(yīng)之后的增刪改查操作的一種編程思想
2. 常規(guī)的orm操作
python->mysqldb完成基礎(chǔ)的orm操作
mysqldb->python2.4- python-3.4-
python->pymysql完成基礎(chǔ)操作,替代mysqldb
pymysql.install_as_MySQLdb()
python高效orm處理->sqlalchemy較為完善的框架,可以直接進(jìn)行數(shù)據(jù)的CRUD
3. sqlalchemy
核心主要針對mysql數(shù)據(jù)庫的一個(gè)orm操作模塊,對py2\py3都有良好的支持
mysqldb/pymysql/sqlalchemy->官方文檔[操作手冊]
4. 爬蟲中對于sqlalchemy的使用
爬蟲的核心:采集數(shù)據(jù)->數(shù)據(jù)存儲[內(nèi)存、文件、數(shù)據(jù)庫]
數(shù)據(jù)采集->數(shù)據(jù)篩選->數(shù)據(jù)存儲->數(shù)據(jù)清洗->數(shù)據(jù)分析->結(jié)果呈現(xiàn)
數(shù)據(jù)篩選:
scrapy框架默認(rèn)提供了各種篩選方式,通過選擇器Selector進(jìn)行處理,內(nèi)建并且封裝好,可以直接通過response響應(yīng)對象調(diào)用
重點(diǎn)內(nèi)容:爬蟲采集數(shù)據(jù)篩選測試
進(jìn)入命令行,執(zhí)行命令
scrapy shell “url”
執(zhí)行之后進(jìn)入python命令行,此時(shí)~響應(yīng)的數(shù)據(jù)已經(jīng)被包含到response變量中了,可以直接操作response進(jìn)行數(shù)據(jù)篩選測試
scrapy完整的項(xiàng)目流程
l 創(chuàng)建爬蟲項(xiàng)目[可以包含多個(gè)爬蟲程序]
n scrapy startproject myspider
l 定義采集數(shù)據(jù)的Item封裝類型
n 修改myspider/items.py,添加ZhilianItem
n 繼承scrapy.Item
n 屬性通過scrapy.Field()定義
l 開發(fā)爬蟲程序
n 在myspider/spiders/添加zhilianspider.py模塊
n 定義ZhilianSpider類型【爬蟲程序】
n 繼承scrapy.Spider
n name屬性:爬蟲名稱,用于在命令行啟動(dòng)指定爬蟲使用
n allowed_domains屬性:域名限制~限制爬蟲只能在某個(gè)域名下進(jìn)行數(shù)據(jù)采集
n start_urls屬性:元組/列表,定義了所有初始采集數(shù)據(jù)的url路徑
n parse(self, response)函數(shù):函數(shù)中的response參數(shù)接受了下載模塊采集到的url中的數(shù)據(jù)
u 這個(gè)函數(shù)中,可以進(jìn)行數(shù)據(jù)的xpath/re/css選擇器進(jìn)行篩選
u 將篩選得到的數(shù)據(jù),封裝在ZhilianItem對象中
u 通過協(xié)程的方式將item對象交給pipelines.py模塊進(jìn)行處理
l yield item
l 開發(fā)管道模塊
n 修改myspider/pipelines.py模塊,添加ZhilianPipleline類型
u __init__(self):主要用于進(jìn)行資源的初始化操作,如打開文件、打開和數(shù)據(jù)庫的連接等等,有必要編寫
l 初始化了sqlalchemy的數(shù)據(jù)庫連接
u open_spider(self, spider):當(dāng)spider爬蟲啟動(dòng)的時(shí)候自動(dòng)調(diào)用的函數(shù),也經(jīng)常用于精確的資源初始化工作,一般不寫
u close_spider(self, spider):當(dāng)spider爬蟲關(guān)閉的時(shí)候自動(dòng)調(diào)用的函數(shù),經(jīng)常用于資源的回收,如關(guān)閉打開的文件、關(guān)閉數(shù)據(jù)庫連接等等,有必要編寫
l 關(guān)閉了sqlalchemy的數(shù)據(jù)庫連接
u process_item(self, item, spider):核心處理函數(shù),進(jìn)行采集到的數(shù)據(jù)item中的實(shí)際數(shù)據(jù)的驗(yàn)證、存儲工作,必須寫
l 通過sqlalchemy進(jìn)行了數(shù)據(jù)的存儲
n 修改myspider/settings.py設(shè)置文件,添加ITEM_PIPELINES = []配置選項(xiàng)中,將我們自定義的ZhilianPipeline注冊給scrapy
l 完成!數(shù)據(jù)被正確采集到了數(shù)據(jù)庫中
注意問題:
Python2的編碼問題、數(shù)據(jù)庫交互時(shí)的編碼問題
網(wǎng)頁數(shù)據(jù)分析問題[耗時(shí)耗力,要有耐心]
注意scrapy的編程步驟!