Scrapy爬取數(shù)據(jù)初識

初窺Scrapy

Scrapy是一個為了爬取網(wǎng)站數(shù)據(jù),提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應(yīng)用框架郑什。 可以應(yīng)用在包括數(shù)據(jù)挖掘秧荆,信息處理或存儲歷史數(shù)據(jù)等一系列的程序中宴卖。其最初是為了 頁面抓取 (更確切來說, 網(wǎng)絡(luò)抓取 )所設(shè)計的县踢, 也可以應(yīng)用在獲取API所返回的數(shù)據(jù)(例如 Amazon Associates Web Services ) 或者通用的網(wǎng)絡(luò)爬蟲瘸彤。


基本步驟

選擇一個網(wǎng)站

定義您想抓取的數(shù)據(jù)

編寫提取數(shù)據(jù)的Spider

執(zhí)行spider,獲取數(shù)據(jù)

查看提取到的數(shù)據(jù)

安裝

控制臺執(zhí)行命令pip install Scrapy,如果執(zhí)行過程中出現(xiàn)building'twisted.test.raiser' extension error: Microsoft Visual C++ 14.0 is required.則需要在網(wǎng)站https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted下載whl文件详羡,pip安裝仍律,再重新運(yùn)行pip install Scrapy,即可

image.png

原理

Scrapy 使用 Twisted這個異步網(wǎng)絡(luò)庫來處理網(wǎng)絡(luò)通訊实柠,架構(gòu)清晰,并且包含了各種中間件接口善涨,可以靈活的完成各種需求窒盐。



原理


綠線是數(shù)據(jù)流向草则,首先從初始URL開始,Scheduler會將其交給Downloader進(jìn)行下載蟹漓,下載之后會交給Spider進(jìn)行分析炕横,Spider分析出來的結(jié)果有兩種:一種是需要進(jìn)一步抓取的鏈接,例如之前分析的“下一頁”的鏈接葡粒,這些東西會被傳回Scheduler份殿;另一種是需要保存的數(shù)據(jù),它們則被送到Item Pipeline那里嗽交,那是對數(shù)據(jù)進(jìn)行后期處理(詳細(xì)分析卿嘲、過濾、存儲等)的地方夫壁。另外拾枣,在數(shù)據(jù)流動的通道里還可以安裝各種中間件,進(jìn)行必要的處理盒让。

組成部分介紹:


Scrapy Engine:

負(fù)責(zé)組件之間數(shù)據(jù)的流轉(zhuǎn)梅肤,當(dāng)某個動作發(fā)生時觸發(fā)事件


Scheduler:

接收requests,并把他們?nèi)腙犚厍眩员愫罄m(xù)的調(diào)度


Downloader:

負(fù)責(zé)抓取網(wǎng)頁姨蝴,并傳送給引擎,之后抓取結(jié)果將傳給spider


Spiders:

用戶編寫的可定制化的部分肺缕,負(fù)責(zé)解析response似扔,產(chǎn)生items和URL。每一個spider代表一個特定的任務(wù)


Item Pipeline:

負(fù)責(zé)處理item搓谆,典型的用途:清洗炒辉、驗證、持久化


Downloader middlewares:

位于引擎和下載器之間的一個鉤子泉手,處理傳送到下載器的requests和傳送到引擎的response(若需要在Requests到達(dá)Downloader之前或者是responses到達(dá)spiders之前做一些預(yù)處理黔寇,可以使用該中間件來完成)


Spider middlewares:

位于引擎和抓取器之間的一個鉤子,處理抓取器的輸入和輸出

(在spiders產(chǎn)生的Items到達(dá)Item Pipeline之前做一些預(yù)處理或response到達(dá)spider之前做一些處理)


一個小例子

創(chuàng)建項目

在開始爬取之前斩萌,您必須創(chuàng)建一個新的Scrapy項目缝裤。 進(jìn)入您打算存儲代碼的目錄中,運(yùn)行下列命令:scrapy startproject book

創(chuàng)建項目

這些文件分別是:


scrapy.cfg: 項目的配置文件

book/: 該項目的python模塊颊郎。之后您將在此加入代碼憋飞。

book/items.py: 項目中的item文件.

book/pipelines.py: 項目中的pipelines文件.

book/settings.py: 項目的設(shè)置文件.

book/spiders/: 放置spider代碼的目錄.


建立spider

首先要進(jìn)入book目錄,使用basic模板創(chuàng)建一個spider

建立spider, scrapy genspider douban https://book.douban.com/top250?start=0

spider

pycharm 調(diào)試scrapy

建立一個main.py文件姆吭,在book文件目錄下,保證main.py和自動生成的scrapy.cfg在同一層,寫入下面代碼榛做。此文件是為了方便再pycharm中調(diào)試scrapy,提高開發(fā)效率


from scrapy.cmdline import execute

import sys,os

sys.path.append(os.path.dirname(os.path.abspath(__file__)))

execute(['scrapy','crawl','douban'])

scrapy crawl douban即啟動,名字為douban的spider


修改setting.py

將setting.py中的遵循robot協(xié)議改為False检眯,否則會過濾掉一些url

# Obey robots.txt rules

ROBOTSTXT_OBEY = False

模擬瀏覽器訪問

USER_AGENT = 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'

提取想要的內(nèi)容

xpath方式提取

xpath簡介

xpath使用路徑表達(dá)式在xml和html中進(jìn)行導(dǎo)航厘擂。

xpath包含標(biāo)準(zhǔn)函數(shù)庫。

xpath是一個w3c的標(biāo)準(zhǔn)锰瘸。

xpath節(jié)點(diǎn)關(guān)系

父節(jié)點(diǎn)

子節(jié)點(diǎn)

同胞節(jié)點(diǎn)

先輩節(jié)點(diǎn)

后代節(jié)點(diǎn)

xpath語法



image.png


image.png

image.png

extract_first()是為了防止extract()[0]不存在的時候報錯


name = node.xpath('td[2]/div[1]/a/text()').extract_first().strip()

summary = node.xpath('td[2]/p[2]/span/text()').extract_first()

在Shell中嘗試Selector選擇器

一直在pycharm調(diào)試xpath太復(fù)雜了刽严,因此scrapy提供shell方便測試語法。首先您需要進(jìn)入項目的根目錄避凝,執(zhí)行下列命令來啟動shell:scrapy shell "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"

注意:當(dāng)在終端運(yùn)行Scrapy時舞萄,請一定記得給url地址加上引號,否則包含參數(shù)的url(例如 & 字符)會導(dǎo)致Scrapy運(yùn)行失敗管削。

css方式提取

image.png


image.png

image.png

定義Item

Item 是保存爬取到的數(shù)據(jù)的容器倒脓;其使用方法和python字典類似, 并且提供了額外保護(hù)機(jī)制來避免拼寫錯誤導(dǎo)致的未定義字段錯誤佩谣。類似在ORM中做的一樣把还,您可以通過創(chuàng)建一個 scrapy.Item 類, 并且定義類型為 scrapy.Field 的類屬性來定義一個Item茸俭。 (如果不了解ORM, 不用擔(dān)心吊履,您會發(fā)現(xiàn)這個步驟非常簡單)。首先根據(jù)需要從book獲取到的數(shù)據(jù)對item進(jìn)行建模调鬓。 我們需要從book中獲取名字艇炎,描述。 對此腾窝,在item中定義相應(yīng)的字段缀踪。編輯 book目錄中的 items.py 文件:


class BookItem(scrapy.Item):

? ? # define the fields for your item here like:

? ? name = scrapy.Field()

? ? summary = scrapy.Field()

? ? pass

代碼

GitHub地址https://github.com/zhangpu1211/scrapy


可能遇到的錯誤

No modle named ‘win32api’

解決方案:pip install -i https://pypi.douban.com/simple/ pypiwin32


為什么有時候自己寫的xpath明明對的,卻獲取不到數(shù)據(jù)虹脯?

原因:F12產(chǎn)生的源碼驴娃,不同于網(wǎng)頁源代碼,前者可能是js加載完的源代碼循集。response.xpath()是根據(jù)網(wǎng)頁源代碼來提取信息的唇敞。


UserWarning: You do not have a working installation of the service_identity module: 'cannot import name 'opentype''.

解決方案:pip install service_identity --force --upgrade


csv文件輸出空一行

在python中的Lib\site-packages\scrapy,編輯該路徑下的exporters.py文件咒彤,并修改如下內(nèi)容:



image.png

csv文件中文亂碼

用sublime打開文件--以...編碼保存--UTF-8 with BOM

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疆柔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子镶柱,更是在濱河造成了極大的恐慌旷档,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件歇拆,死亡現(xiàn)場離奇詭異鞋屈,居然都是意外死亡范咨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門谐区,熙熙樓的掌柜王于貴愁眉苦臉地迎上來湖蜕,“玉大人逻卖,你說我怎么就攤上這事宋列。” “怎么了评也?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵炼杖,是天一觀的道長。 經(jīng)常有香客問我盗迟,道長坤邪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任罚缕,我火速辦了婚禮艇纺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘邮弹。我一直安慰自己黔衡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布腌乡。 她就那樣靜靜地躺著盟劫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪与纽。 梳的紋絲不亂的頭發(fā)上侣签,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機(jī)與錄音急迂,去河邊找鬼影所。 笑死,一個胖子當(dāng)著我的面吹牛僚碎,可吹牛的內(nèi)容都是我干的猴娩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼听盖,長吁一口氣:“原來是場噩夢啊……” “哼胀溺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起皆看,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤仓坞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后腰吟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體无埃,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡徙瓶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了嫉称。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侦镇。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖织阅,靈堂內(nèi)的尸體忽然破棺而出壳繁,到底是詐尸還是另有隱情,我是刑警寧澤荔棉,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布闹炉,位于F島的核電站,受9級特大地震影響润樱,放射性物質(zhì)發(fā)生泄漏渣触。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一壹若、第九天 我趴在偏房一處隱蔽的房頂上張望嗅钻。 院中可真熱鬧,春花似錦店展、人聲如沸养篓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽觉至。三九已至,卻和暖如春睡腿,著一層夾襖步出監(jiān)牢的瞬間语御,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工席怪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留应闯,地道東北人。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓挂捻,卻偏偏與公主長得像碉纺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子刻撒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

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

  • Scrapy爬取數(shù)據(jù)初識 初窺Scrapy Scrapy是一個為了爬取網(wǎng)站數(shù)據(jù)骨田,提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應(yīng)用框架。 ...
    聽城閱讀 1,384評論 0 0
  • 前言 爬蟲就是請求網(wǎng)站并提取數(shù)據(jù)的自動化程序声怔,其中請求态贤,提取,自動化是爬蟲的關(guān)鍵醋火。Python作為一款出色的膠水語...
    王奧OX閱讀 3,408評論 1 8
  • 這兩天摸索了下scrapy悠汽,剛看文檔的時候覺得有點(diǎn)生無可戀箱吕,scrapy框架個人還是覺得比較難懂的,需要學(xué)習(xí)的地方...
    Treehl閱讀 5,639評論 7 10
  • 初窺Scrapy Scrapy是一個為了爬取網(wǎng)站數(shù)據(jù)柿冲,提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應(yīng)用框架茬高。 可以應(yīng)用在包括數(shù)據(jù)挖掘,信...
    君臨天下夜未央閱讀 697評論 0 1
  • T君: 你好凹俪怎栽!好久不見了,新年的新開始事情總是比較多慨亲,忙不轉(zhuǎn)的時候恨不得自己多生幾雙眼婚瓜,多長幾只手宝鼓,好去應(yīng)對撲面...
    洛陽女兒名莫愁閱讀 363評論 0 0