建立乙個scrapy專案
定義提取的結構化資料(item)
編寫爬取**的 spider 並提取出結構化資料(item)
編寫 item pipelines 來儲存提取到的item(即結構化資料)
在開始爬取之前,必須建立乙個新的scrapy專案。進入自定義的專案目錄中,執行下列命令
scrapy startproject myspider
其中, myspider 為專案名稱,可以看到將會建立乙個 myspider 資料夾,目錄結構大致如下:
|___myspider
|____myspider
| |----__init__.py
| |
| |----items.py
| |
| |----pipelines.py
| |
| |----settings.py
| |----spiders
| |----__init__.py
|_____scrapy.cfg
下面來簡單介紹一下各個主要檔案的作用:
scrapy.cfg :專案的配置檔案
myspider/ :專案的python模組,將會從這裡引用**
myspider/items.py :專案的目標檔案
myspider/pipelines.py :專案的管道檔案
myspider/settings.py :專案的設定檔案
myspider/spiders/ :儲存爬蟲**目錄
我們打算抓取: **裡的所有講師的姓名、職稱和個人資訊。
開啟myspider目錄下的items.py
item 定義結構化資料字段,用來儲存爬取到的資料,有點像python中的dict,但是提供了一些額外的保護減少錯誤。
可以通過建立乙個 scrapy.item 類, 並且定義型別為 scrapy.field的類屬性來定義乙個item(可以理解成類似於orm的對映關係)。
接下來,建立乙個itcastitem 類,和構建item模型(model)。
爬蟲功能要分兩步:
爬資料
在當前目錄下輸入命令,將在myspider/spider目錄下建立乙個名為itcast的爬蟲,並指定爬取域的範圍:
scrapy genspider itcast "itcast.cn"
開啟 myspider/spider目錄裡的 itcast.py,預設增加了下列**:
import scrapy
class
itcastspider
(scrapy.spider):
name = "itcast"
allowed_domains = ["itcast.cn"]
start_urls = (
'',)
defparse
(self, response):
pass
要建立乙個spider, 你必須用scrapy.spider類建立乙個子類,並確定了三個強制的屬性 和 乙個方法。
- name = 「」 :這個爬蟲的識別名稱,必須是唯一的,在不同的爬蟲必須定義不同的名字。
將start_urls的值修改為需要爬取的第乙個url
start_urls = ("",)
修改parse()方法
def
parse
(self, response):
filename = "teacher.html"
open(filename, 'w').write(response.body)
然後執行一下看看,在myspider目錄下執行:
scrapy crawl itcast
是的,就是 itcast,看上面**,它是 itcastspider 類的 name 屬性,也就是使用 scrapy genspider命令的唯一爬蟲名。
執行之後,如果列印的日誌出現 [scrapy] info: spider closed (finished),代表執行完成。 之後當前資料夾中就出現了乙個 teacher.html 檔案,裡面就是我們剛剛要爬取的網頁的全部源**資訊。
# 注意,python2.x預設編碼環境是ascii,當和取回的資料編碼格式不一致時,可能會造成亂碼;
# 我們可以指定儲存內容的編碼格式,一般情況下,我們可以在**最上方新增:
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
# 這三行**是python2.x裡解決中文編碼的****,經過這麼多年的吐槽後python3學乖了,預設編碼是unicode了...(祝大家早日擁抱python3)
取資料
爬取整個網頁完畢,接下來的就是的取過程了,首先觀察頁面原始碼:
我們之前在myspider/items.py 裡定義了乙個itcastitem類。 這裡引入進來
from myspider.items import itcastitem
然後將我們得到的資料封裝到乙個 itcastitem 物件中,可以儲存每個老師的屬性:
from myspider.items import itcastitem
defparse
(self, response):
#open("teacher.html","wb").write(response.body).close()
# 存放老師資訊的集合
items =
for each in response.xpath("//div[@class='li_txt']"):
# 將我們得到的資料封裝到乙個 `itcastitem` 物件
item = itcastitem()
#extract()方法返回的都是unicode字串
name = each.xpath("h3/text()").extract()
title = each.xpath("h4/text()").extract()
info = each.xpath("p/text()").extract()
#xpath返回的是包含乙個元素的列表
item['name'] = name[0]
item['title'] = title[0]
item['info'] = info[0]
# 直接返回最後資料
return items
儲存資料:scrapy儲存資訊的最簡單的方法主要有四種,-o 輸出指定格式的檔案,,命令如下:
# json格式,預設為unicode編碼
scrapy crawl itcast -o teachers.json
# json lines格式,預設為unicode編碼
scrapy crawl itcast -o teachers.jsonl
# csv 逗號表示式,可用excel開啟
scrapy crawl itcast -o teachers.csv
# xml格式
scrapy crawl itcast -o teachers.xml
優化
from myspider.items import itcastitem
defparse
(self, response):
#open("teacher.html","wb").write(response.body).close()
# 存放老師資訊的集合
#items =
for each in response.xpath("//div[@class='li_txt']"):
# 將我們得到的資料封裝到乙個 `itcastitem` 物件
item = itcastitem()
#extract()方法返回的都是unicode字串
name = each.xpath("h3/text()").extract()
title = each.xpath("h4/text()").extract()
info = each.xpath("p/text()").extract()
#xpath返回的是包含乙個元素的列表
item['name'] = name[0]
item['title'] = title[0]
item['info'] = info[0]
#將獲取的資料交給pipelines
yield item
# 返回資料,不經過pipeline
#return items
scrapy 爬蟲入門(1)
pip install scrapy 就是這麼簡單 scrapy startproject words 會建立乙個words的專案目錄結構 words scrapy.cfg 專案的配置檔案 words 專案 init py items.py 專案的item檔案 pipelines.py 專案的pip...
爬蟲框架scrapy入門(一)
這段時間一直在學爬蟲,做了一些簡單的專案,爬取資料的過程中,被封過ip,需要翻牆,為了大規模的資料採集,開始學習scrapy框架。參照的是靜覓大神的 python3網路爬蟲開發實戰 本次爬取的 是scrapy官網 建議使用anaconda的一鍵安裝,我的電腦上同時有anaconda和pycham,一...
Python爬蟲框架scrapy入門
寫好,程式開始執行.spider 老大要我處理 x.com。引擎 你把第乙個需要處理的url給我吧。spider 給你,第乙個url是 x.com。引擎 hi!排程器,我這有request請求你幫我排序入隊一下。排程器 好的,正在處理你等一下。引擎 hi!排程器,把你處理好的request請求給我。...