又開新坑了,最近迷上了爬蟲禽炬,塞爾達(dá)涧卵,數(shù)據(jù)結(jié)構(gòu)。腹尖。柳恐。時間不夠用了已經(jīng)。
近幾天簡單的學(xué)習(xí)了Scrapy這個框架热幔,簡單好用乐设;
第一步 準(zhǔn)備工作
1、安裝(基于python3.x環(huán)境)
pip3 install scrapy
2绎巨、安裝pycharm
建議購買正版近尚。。场勤。
3戈锻、下載MongoDB和它的GUI工具 下載鏈接;
4歼跟、安裝pymongo
pip3 install pymongo
安裝完畢之后 終端輸入 mongod 啟動數(shù)據(jù)庫服務(wù);
2017-04-28T10:32:43.344+0800 I FTDC [initandlisten] Initializing full-time diagnostic data capture with directory '/data/db/diagnostic.data'
2017-04-28T10:32:43.345+0800 I NETWORK [thread1] waiting for connections on port 27017
開始
簡單介紹下Scrapy
簡單使用主要需要了解三個文件格遭;
1哈街、items.py
主要用來接收和暫時保存爬取到的數(shù)據(jù)
2、spider
主要負(fù)責(zé)爬取數(shù)據(jù)
3如庭、pipelines.py
如果需要存入數(shù)據(jù)庫叹卷,在這個文件中操作
爬取數(shù)據(jù)
目標(biāo):爬取最美應(yīng)用網(wǎng)頁端的APP數(shù)據(jù)
1、打開終端
scrapy startproject zhuimei
2坪它、使用 pyCharm打開工程
其中main.py 需要自己創(chuàng)建骤竹,為后面調(diào)試做準(zhǔn)備
3、接下來需要將zhuimei文件夾設(shè)置為Sources Root 以便pycharm查找module往毡;
右擊文件夾按下面圖操作
4蒙揣、打開items.py,文件中已經(jīng)存在一個和項目同名的Item开瞭,可以使用也可以重新聲明一個類懒震;
在文件中聲明一個類 zuimeiItem;
class zuimeiItem(scrapy.Item):
id = Field() # 每個APP的id編號
title = Field() #APP 大標(biāo)題
subtitle = Field() #副標(biāo)題
url = Field() #下載鏈接
date = Field() #時間
5嗤详、在Spiders文件夾下新建文件zuimeispider.py
導(dǎo)入
from scrapy import Spider,Request
from scrapy import Selector
from zhuimei.items import zuimeiItem
聲明一個類繼承于Spider
class ZuiMeiSpider(Spider):
name = "zuimei" #啟動爬蟲時以這個名為準(zhǔn)
allowd_domains = ["http://www.zuimeia.com"]
start_urls = ['http://www.zuimeia.com']
接下來解析我們爬取到的數(shù)據(jù)
利用火狐瀏覽器的 firebug 和 firepath插件來審查頁面
通過審查我們可以看到 app的title是存儲在 一個類名為“app-title”的標(biāo)簽下面的h1標(biāo)簽下个扰,所以我們使用Xpath獲取文字
sel = Selector(response)
title_list = sel.xpath(".//*[@class='app-title']/h1/text()").extract()
同理獲取到副標(biāo)題,時間和下載鏈接
subtitle_list = sel.xpath(".//*[@class='sub-title']/text()").extract()
date_list = sel.xpath(".//*[@class='pub-time']/text()").extract()
url_list = sel.xpath(".//*[@class='detail-icon']/@href").extract()
最后將獲取到的數(shù)據(jù)用item接收保存
for title,subtitle,date,url in zip(title_list,subtitle_list,date_list,url_list):
item = zuimeiItem()
item["id"] = url[5:9]
item["title"] = title
item["subtitle"] = subtitle
item["date"] = date
item["url"] = self.allowd_domains[0] + url #下載需要拼接成完整的url
yield item
可以在上述代碼中添加 print葱色,輸出爬取到的數(shù)據(jù)
到這步結(jié)束递宅,我們就可以啟動爬蟲,爬取數(shù)據(jù)了可以選擇兩個方法
1苍狰、直接打開終端办龄,進(jìn)入到項目目錄下
scrapy crawl zuimei
2、在新建的main.py中
from scrapy import cmdline
cmdline.execute("scrapy crawl zuimei".split())
打開 Run下的Edit Configurations
新建一個 python淋昭,并把main.py的路徑添加到Script俐填;
現(xiàn)在可以直接使用pycharm的debug功能了;
兩種方法其實原理上相同翔忽;
將數(shù)據(jù)存入數(shù)據(jù)庫
1英融、打開settings.py文件
#取消注釋
ITEM_PIPELINES = {
'zhuimei.pipelines.ZhuimeiPipeline': 300,
}
#添加下面代碼
MONGODB_HOST = '127.0.0.1'
MONGODB_PORT = 27017
#本地數(shù)據(jù)庫的名字可以自己起,這邊直接使用 MongoDB自帶
MONGODB_DBNAME = 'local'
2歇式、打開pipelines.py 矢赁,添加下面代碼
class ZhuimeiPipeline(object):
def __init__(self):
host = settings['MONGODB_HOST']
port = settings['MONGODB_PORT']
dbName = settings['MONGODB_DBNAME']
client = pymongo.MongoClient(host=host, port=port)
db = client[dbName]
self.post = db["zuimei"] # 連接表,表需要在MongoDB compass 中創(chuàng)建
def process_item(self, item, spider):
appInfo = dict(item)
#防止數(shù)據(jù)重復(fù)存入
self.post.update({'id':item['id']},{'$set':dict(item)},True)
return item
3贬丛、確認(rèn)數(shù)據(jù)庫服務(wù)已經(jīng)啟動
打開MongoDB Compass, connect给涕;
在 local數(shù)據(jù)庫中新建表 zuimei豺憔,注意這里一定要和pipelines中表名一致
4额获、啟動爬蟲,待程序運行結(jié)束后
結(jié)語
這只是個簡單的爬蟲恭应,只能爬取當(dāng)前頁面的數(shù)據(jù)抄邀,后面我會補全翻頁抓取的操作。