專欄:014:客官千所,你要的實(shí)戰(zhàn)我給你.


用理工科思維看待這個(gè)世界

系列爬蟲專欄

初學(xué)者狂魔,盡力實(shí)現(xiàn)最小化學(xué)習(xí)系統(tǒng)

主題:Scrapy 實(shí)戰(zhàn),并分別存儲(chǔ)在MySQL 和 Mongodb中


0:目標(biāo)說明

  • Scrapy 基礎(chǔ)教程
    你要的最佳實(shí)戰(zhàn)

  • 劉未鵬博客
    點(diǎn)我啊

  • 目標(biāo):獲取劉未鵬博客全站博文

    • 文章標(biāo)題:Title
    • 文章發(fā)布時(shí)間:Time
    • 文章全文:Content
    • 文章的鏈接:Url
  • 思路:

    • 分析首頁和翻頁的組成
    • 抓取全部的文章鏈接
    • 在獲取的全部鏈接的基礎(chǔ)上解析需要的標(biāo)題淫痰,發(fā)布時(shí)間最楷,全文和鏈接

1:目標(biāo)分解

Scrapy支持xpath

  • 全部鏈接獲取
# 首頁和剩余的頁獲取鏈接的xpath有點(diǎn)差異
each_page_data = selector.xpath('//div[@id="index-featured1"]/ul/li/h3[@class="entry-title"]/a/@href').extract()
each_page_data_other = selector.xpath('//div[@id="content"]/div/ul/li/h3[@class="entry-title"]/a/@href').extract()
# 全部的url放在一個(gè)列表里:item_url
  • 文章標(biāo)題
title = selector.xpath('//div[@id="content"]/div/h1[@class="entry-title"]/a/text()').extract()
  • 文章發(fā)布時(shí)間
time = selector.xpath('//div[@id="content"]/div/div[@class="entry-info"]/abbr/text()').extract()
  • 文章全文
content = selector.xpath('//div[@id="content"]/div/div[@class="entry-content clearfix"]/p/text()').extract()
  • 文章鏈接
url = selector.xpath('//div[@id="content"]/div/h1[@class="entry-title"]/a/@href').extract()

使用Scrapy 框架的基本教程:
翻譯版教程

  • 一般步驟

    • 新建項(xiàng)目
    • 定義Item : items.py文件是定義的抓取目標(biāo)
    • 編寫spider:spiders文件夾是用來編寫爬蟲文件
    • settings.py文件是用來編寫配置文件比如頭部信息,一些常量待错,比如MySQL用戶籽孙,端口等
    • pipelines.py文件是用來編寫存儲(chǔ)數(shù)據(jù)操作,比如MySQL數(shù)據(jù)庫的操作火俄,mongodb數(shù)據(jù)庫的操作
  • Scrapy 框架的原理
    經(jīng)典說明文檔

001.png
* 引擎scrapy
* 調(diào)度器 scheduler
* 下載器 downloader
* 爬蟲 spider
* 項(xiàng)目管道 pipeline

運(yùn)行流程:
Scrapy運(yùn)行流程大概如下:
首先犯建,引擎從調(diào)度器中取出一個(gè)鏈接(URL)用于接下來的抓取
引擎把URL封裝成一個(gè)請(qǐng)求(Request)傳給下載器,下載器把資源下載下來瓜客,并封裝成應(yīng)答包(Response)
然后适瓦,爬蟲解析Response
若是解析出實(shí)體(Item),則交給實(shí)體管道進(jìn)行進(jìn)一步的處理。
若是解析出的是鏈接(URL),則把URL交給Scheduler等待抓取


2:目標(biāo)實(shí)戰(zhàn)

  • 編寫Items 文件定義抓取目標(biāo)
class LiuweipengItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    Title = scrapy.Field() # 標(biāo)題
    Time = scrapy.Field() # 發(fā)布時(shí)間
    Url = scrapy.Field() # 文章鏈接
    Content = scrapy.Field() # 文章內(nèi)容
  • 編寫爬蟲程序
# 獲取整個(gè)網(wǎng)站的文章鏈接
class BlogSpider(Spider):
    name = "liuweipeng"
    start_urls = ["http://mindhacks.cn/","http://mindhacks.cn/page/2/", "http://mindhacks.cn/page/3/", "http://mindhacks.cn/page/4/"]
    def parse(self, response):
        url_item = []
        selector = Selector(response)
        each_page_data = selector.xpath('//div[@id="index-featured1"]/ul/li/h3[@class="entry-title"]/a/@href').extract()
        each_page_data_other = selector.xpath('//div[@id="content"]/div/ul/li/h3[@class="entry-title"]/a/@href').extract()
        url_item.extend(each_page_data)
        url_item.extend(each_page_data_other)
        for one in url_item:
            yield Request(one, callback=self.parse_detail)

#------------------------------------------------------------------------------------------
# 對(duì)獲取的鏈接進(jìn)行內(nèi)容的解析
    def parse_detail(self, response):
        Item = LiuweipengItem()
        selector = Selector(response)
        title = selector.xpath('//div[@id="content"]/div/h1[@class="entry-title"]/a/text()').extract()
        time = selector.xpath('//div[@id="content"]/div/div[@class="entry-info"]/abbr/text()').extract()
        content = selector.xpath('//div[@id="content"]/div/div[@class="entry-content clearfix"]/p/text()').extract()
        url = selector.xpath('//div[@id="content"]/div/h1[@class="entry-title"]/a/@href').extract()
        print(content)
        for title, time, content, url in zip(title, time, content, url):
            Item["Title"] = title
            Item["Time"] = time
            Item["Content"] = content
            Item["Url"] = url
        yield Item
  • 編寫設(shè)置文件(1):存儲(chǔ)mongodb
MONGODB_HOST = '127.0.0.1' # localhost
MONGODB_PORT = 27017   # 端口號(hào)
MONGODB_DBNAME = 'Liuweipeng' # 數(shù)據(jù)庫名
MONGODB_DOCNAME = 'blog' # 集合名
  • 編寫管道文件谱仪,存儲(chǔ)數(shù)據(jù)mongodb

import pymongo
import pymysql
from scrapy.conf import settings
class LiuweipengPipeline(object):
    def __init__(self):
        host = settings['MONGODB_HOST']
        port = settings['MONGODB_PORT']
        dbName = settings['MONGODB_DBNAME']
        client = pymongo.MongoClient(host=host, port=port)
        tdb = client[dbName]
        self.post = tdb[settings['MONGODB_DOCNAME']]  # 初始化設(shè)置數(shù)據(jù)鏈接等信息
    def process_item(self, item, spider):
        content = dict(item)
        self.post.insert(content)  # 將抓取的數(shù)據(jù)插入mongodb

效果顯示:

002.png
  • 存儲(chǔ)方式2:mysql
# 管道文件編寫方式改變?yōu)椋?# 這里導(dǎo)入的是pymysql 
    def __init__(self):
        self.connection = pymysql.connect(host='localhost',
                             user='root',
                             password='123456',
                             port=3306,
                             db='test',
                             charset='utf8')
        pass
    def process_item(self, item, spider):
        with self.connection.cursor() as cursor:
            sql = "INSERT INTO `blog`(`Title`, `Time`, `Content`, `Url`) VALUES (%s, %s, %s, %s)"
            cursor.execute(sql, (item['Title'],item["Time"], item["Content"],item["Url"]))
        self.connection.commit()

  • 需要在本地創(chuàng)建數(shù)據(jù)表:
# 在test數(shù)據(jù)庫中創(chuàng)建一個(gè)blog的數(shù)據(jù)表玻熙,定義字段如下所示:
CREATE TABLE `blog` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `Title` VARCHAR(255) COLLATE utf8_bin NOT NULL,
    `Content` VARCHAR(255) COLLATE utf8_bin NOT NULL,
    `Time` VARCHAR(255) COLLATE utf8_bin NOT NULL,
    `Url` VARCHAR(255) COLLATE utf8_bin NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
AUTO_INCREMENT=1 ;

效果顯示2:

003.png

完整版代碼:不點(diǎn)不知道bug


3:總結(jié)全文

使用Scrapy框架實(shí)現(xiàn)抓取博客,并分別使用兩種存儲(chǔ)方式疯攒。
目標(biāo)分析的很詳細(xì)了嗦随。

再補(bǔ)一句:任何實(shí)用性的東西都解決不了你所面臨的實(shí)際問題,但為什么還有看卸例?為了經(jīng)驗(yàn)称杨,為了通過閱讀抓取別人的經(jīng)驗(yàn),雖然還需批判思維看待

崇尚的思維是:
了解這是什么筷转。
知道應(yīng)該怎么做。
學(xué)會(huì)親自動(dòng)手悬而。(事實(shí)上這是我第一次使用Scrapy 框架存儲(chǔ)在mysql中呜舒,還是遇到了好些問題)


關(guān)于本人:
只有一個(gè)職業(yè):學(xué)生
只有一個(gè)任務(wù):學(xué)習(xí)
在這條路上,充滿無盡的困境笨奠,我希望成為一個(gè)精神世界豐滿的人袭蝗。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末唤殴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子到腥,更是在濱河造成了極大的恐慌朵逝,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乡范,死亡現(xiàn)場離奇詭異配名,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)晋辆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門渠脉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瓶佳,你說我怎么就攤上這事芋膘。” “怎么了霸饲?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵为朋,是天一觀的道長。 經(jīng)常有香客問我厚脉,道長习寸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任器仗,我火速辦了婚禮融涣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘精钮。我一直安慰自己威鹿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布轨香。 她就那樣靜靜地躺著忽你,像睡著了一般。 火紅的嫁衣襯著肌膚如雪臂容。 梳的紋絲不亂的頭發(fā)上科雳,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音脓杉,去河邊找鬼糟秘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛球散,可吹牛的內(nèi)容都是我干的尿赚。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼凌净!你這毒婦竟也來了悲龟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤冰寻,失蹤者是張志新(化名)和其女友劉穎须教,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斩芭,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡轻腺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了秒旋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片约计。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖迁筛,靈堂內(nèi)的尸體忽然破棺而出煤蚌,到底是詐尸還是另有隱情,我是刑警寧澤细卧,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布尉桩,位于F島的核電站,受9級(jí)特大地震影響贪庙,放射性物質(zhì)發(fā)生泄漏蜘犁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一止邮、第九天 我趴在偏房一處隱蔽的房頂上張望这橙。 院中可真熱鬧,春花似錦导披、人聲如沸屈扎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鹰晨。三九已至,卻和暖如春止毕,著一層夾襖步出監(jiān)牢的瞬間模蜡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國打工扁凛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留忍疾,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓谨朝,卻偏偏與公主長得像膝昆,于是被迫代替她去往敵國和親丸边。 傳聞我的和親對(duì)象是個(gè)殘疾皇子叠必,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容