最流行的python爬虫框架_Python最火爬虫框架Scrapy入门与实践
Scrapy框架簡介Scrapy 是用 Python 實現的一個為了爬取網站數據、提取結構性數據而編寫的應用框架。
Scrapy 常應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。
通常我們可以很簡單的通過 Scrapy 框架實現一個爬蟲,抓取指定網站的內容或圖片。
Scrapy架構圖(綠線是數據流向):
- Scrapy Engine(引擎):負者Spider、ItemPipeline、Downloader、Scheduler中間的通訊,信號、數據轉遞等。 - Scheduler(調度器) :它負責接受引擊發送過來的Request請求,并按照一定的方式進行整理排列,入 隊,當引擎需要時,交還給引擎。 - Downloader (下載器):負責下載Scrapy Engine(引擎)發送的所有Requests請求,并將其獲取到的 Responses交還給Scrapy Engine(引擎) ,由引擎交給Spider來處理。 - Spider (爬蟲) :它負責處理所有Responses,從中分析提取數據,獲取Item字段需要的數據,并將需要 跟進的URL提交給引擎,再次進入Scheduler(調度器)。 - Item Pipeline(管道) :它負責處理Spider 中獲取到的Item ,并進行進行后期處理(詳細分析、過濾、 存儲等)的地方。 - Downloader Middlewares (下載中間件) : 你可以當作是一個可以自定義擴 展下載功能的組件。 - Spider Middlewares (Spider中間件) : 你可以理解為是一個可以自定擴展和操作引擎和Spider中 間通信的功能組件(比如進入Spider的Responses;和從Spider出去的Requests )
制作 Scrapy 爬蟲 一共需要4步:新建項目 (scrapy startproject xxx):新建一個新的爬蟲項目
明確目標 (編寫items.py):明確你想要抓取的目標
制作爬蟲 (spiders/xxspider.py):制作爬蟲開始爬取網頁
存儲內容 (pipelines.py):設計管道存儲爬取內容
入門案例
分析: 1. 創建一個Scrapy項目。 2. 定義提取的結構化數據(Item)。 3. 編寫爬取網站的Spider并且提取出結構化數據(Item)。 4. 編寫Item Pipelines 來存儲提取到的Item(即結構化數據)。
一、新建scrapy項目工程(scrapy startproject)
在開始爬取之前,必須創建一個新的Scrapy項目,進入自定義的項目目錄中。運行下列命令: 在pycharm界面中打開 View --> Tool Windows --> Terminal
==(1) 驗證scrapy是否成功安裝:== 在Terminal中輸入 scrapy 看看是否顯示scrapy信息 倘若出現:=='scrapy' 不是內部或外部命令,也不是可運行的程序或批處理文件。==
①、碰到這個問題,一般是pip重裝或者升級過導致的,這里的解決方案是:先運行pip uninstall scrapy卸載scrapy。 ②、這里會提示是否繼續,輸入y然后回車即可。 ③、接下來重新安裝scrapy,pip install scrapy。 ④、安裝完成之后,輸入scrapy運行測試
==(2)創建scrapy項目工程== 在Terminal中輸入:
# scrapy startproject + 自定義的項目名稱Scrapy startproject ITcast
成功創建項目的目錄為:
文件說明: - scrapy.cfg 項目的配置信息,主要為Scrapy命令行工具提供一個基礎的配置信息。(真正爬蟲相關的配置信息在settings.py文件中) - items.py:設置數據存儲模板,用于結構化數據,如:Django的Model - pipelines.py:數據處理行為,如:一般結構化的數據持久化 - settings.py:配置文件,如:遞歸的層數、并發數,延遲下載等 - spiders:爬蟲目錄,如:創建文件,編寫爬蟲規則
==(3)創建寫爬蟲的文件==
# scrapy genspider +名稱 + '網站'#建立爬蟲文件scrapy genspider itcast "itcast.cn"
結果為:
二、制作爬蟲
1. 爬數據
打開 ITcast/spider目錄里的 itcast.py,默認增加了下列代碼:
# -*- coding: utf-8 -*-
import scrapy
class ItcastSpider(scrapy.Spider):
name = 'itcast'
allowed_domains = ['itcast.cn']
start_urls = ['http://itcast.cn/']
def parse(self, response):
pass
也可以自行創建itcast.py并編寫上面的代碼,只不過使用命令可以免去編寫固定代碼的麻煩要建立一個Spider, 你必須用scrapy.Spider類創建一個子類,并確定了三個強制的屬性 和 一個方法。
name = "" :這個爬蟲的識別名稱,必須是唯一的,在不同的爬蟲必須定義不同的名字。
allow_domains = [] 是搜索的域名范圍,也就是爬蟲的約束區域,規定爬蟲只爬取這個域名下的網頁,不存在的URL會被忽略。
start_urls = () :爬取的URL元祖/列表。爬蟲從這里開始抓取數據,所以,第一次下載的數據將會從這些urls開始。其他子URL將會從這些起始URL中繼承性生成。
parse(self, response) :解析的方法,每個初始URL完成下載后將被調用,調用的時候傳入從每一個URL傳回的Response對象來作為唯一參數,主要作用如下: 負責解析返回的網頁數據(response.body),提取結構化數據(生成item) 生成需要下一頁的URL請求。
將start_urls的值修改為需要爬取的第一個url
start_urls = ['http://www.itcast.cn/channel/teacher.shtml']
2. 取數據
爬取整個網頁完畢,接下來的就是的取過程了,首先觀察頁面源碼:
xpath 方法,我們只需要輸入的 xpath 規則就可以定位到相應 html 標簽節點。 Chrome 給我們提供了一鍵獲取 xpath 地址的方法(右鍵->檢查->copy->copy xpath),如下圖:
/html/head/title: 選擇HTML文檔中
標簽內的 元素/html/head/title/text(): 選擇上面提到的
元素的文字//td: 選擇所有的
元素//div[@class="mine"]: 選擇所有具有 class="mine" 屬性的 div 元素
3、編寫代碼
需要編寫四個相關聯的文件:itcast.py、items.py、settings.py、pipelines.py (管道文件)。 (1) itcast.py
# -*- coding: utf-8 -*-
import scrapy
#導入容器
from ITcast.items import ItcastItem
class ItcastSpider(scrapy.Spider):
# 爬蟲名 啟動爬蟲時需要的參數*必需
name = 'itcast'
# 爬取域范圍 允許爬蟲在這個域名下進行爬取(可選) 可以不寫
allowed_domains = ['itcast.cn']
#起始url列表 爬蟲的第一批請求,將求這個列表里獲取
start_urls = ['http://www.itcast.cn/channel/teacher.shtml']
def parse(self, response):
node_list = response.xpath("//div[@class='li_txt']")
for node in node_list:
#創建item字段對象,用來存儲信息
item = ItcastItem()
# .extract() 將xpath對象轉換圍毆Unicode字符串
name = node.xpath("./h3/text()").extract()
title = node.xpath("./h4/text()").extract()
info = node.xpath("./p/text()").extract()
item['name'] = name[0]
item['title'] = title[0]
item['info'] = info[0]
#返回提取到的每一個item數據 給管道文件處理,同時還會回來繼續執行后面的代碼
yield item
(2)items.py
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html
import scrapy
class ItcastItem(scrapy.Item):
# define the fields for your item here like:
# 與itcast.py 定義的一一對應
name = scrapy.Field()
title = scrapy.Field()
info = scrapy.Field()
#pass
(3)settings.py 找到以下字段,取消字段的注釋。
ITEM_PIPELINES = {
'ITcast.pipelines.ItcastPipeline': 100, #值越小優先級越高
}
(4) pipelines.py (管道文件)
import json
class ItcastPipeline(object):
def __init__(self):
#python3保存文件 必須需要'wb' 保存為json格式
self.f = open("itcast_pipeline.json",'wb')
def process_item(self, item, spider):
#讀取item中的數據 并換行處理
content = json.dumps(dict(item),ensure_ascii=False) + ',\n'
self.f.write(content.encode('utf=8'))
return item
def close_spider(self,spider):
#關閉文件
self.f.close()
4、結果展示 執行文命令行: scrapy crawl + 爬蟲文件的名稱。 在Terminal中輸入 scrapy crawl itcast 執行scrapy項目,生成json文件:
4. 保存數據
scrapy保存信息的最簡單的方法主要有四種,-o 輸出指定格式的文件,命令如下:
scrapy crawl itcast -o teachers.json
csv 逗號表達式,可用Excel打開
scrapy crawl itcast -o teachers.csv
xml格式
scrapy crawl itcast -o teachers.xml
==對于了解更多實戰案例 和 如何爬取"下一頁面"的用法,可以參考文章==Scrapy糗事百科爬蟲實戰代碼分析
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的最流行的python爬虫框架_Python最火爬虫框架Scrapy入门与实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 未来农村做什么生意致富 创业选的项目要有
- 下一篇: gridview 在已有数据的基础上添加