爬蟲Scrapy 02入門程式

2021-08-10 20:19:48 字數 4470 閱讀 9222

建立乙個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請求給我。...