人生苦短,我用 Python
前文傳送門:
小白學(xué) Python 爬蟲(2):前置準(zhǔn)備(一)基本類庫(kù)的安裝
小白學(xué) Python 爬蟲(3):前置準(zhǔn)備(二)Linux基礎(chǔ)入門
小白學(xué) Python 爬蟲(4):前置準(zhǔn)備(三)Docker基礎(chǔ)入門
小白學(xué) Python 爬蟲(5):前置準(zhǔn)備(四)數(shù)據(jù)庫(kù)基礎(chǔ)
小白學(xué) Python 爬蟲(6):前置準(zhǔn)備(五)爬蟲框架的安裝
小白學(xué) Python 爬蟲(7):HTTP 基礎(chǔ)
小白學(xué) Python 爬蟲(8):網(wǎng)頁(yè)基礎(chǔ)
小白學(xué) Python 爬蟲(9):爬蟲基礎(chǔ)
小白學(xué) Python 爬蟲(10):Session 和 Cookies
小白學(xué) Python 爬蟲(11):urllib 基礎(chǔ)使用(一)
小白學(xué) Python 爬蟲(12):urllib 基礎(chǔ)使用(二)
小白學(xué) Python 爬蟲(13):urllib 基礎(chǔ)使用(三)
小白學(xué) Python 爬蟲(14):urllib 基礎(chǔ)使用(四)
小白學(xué) Python 爬蟲(15):urllib 基礎(chǔ)使用(五)
小白學(xué) Python 爬蟲(16):urllib 實(shí)戰(zhàn)之爬取妹子圖
小白學(xué) Python 爬蟲(17):Requests 基礎(chǔ)使用
小白學(xué) Python 爬蟲(18):Requests 進(jìn)階操作
小白學(xué) Python 爬蟲(19):Xpath 基操
小白學(xué) Python 爬蟲(20):Xpath 進(jìn)階
小白學(xué) Python 爬蟲(21):解析庫(kù) Beautiful Soup(上)
小白學(xué) Python 爬蟲(22):解析庫(kù) Beautiful Soup(下)
小白學(xué) Python 爬蟲(23):解析庫(kù) pyquery 入門
小白學(xué) Python 爬蟲(24):2019 豆瓣電影排行
小白學(xué) Python 爬蟲(26):為啥買不起上海二手房你都買不起
小白學(xué) Python 爬蟲(27):自動(dòng)化測(cè)試框架 Selenium 從入門到放棄(上)
小白學(xué) Python 爬蟲(28):自動(dòng)化測(cè)試框架 Selenium 從入門到放棄(下)
小白學(xué) Python 爬蟲(29):Selenium 獲取某大型電商網(wǎng)站商品信息
小白學(xué) Python 爬蟲(30):代理基礎(chǔ)
小白學(xué) Python 爬蟲(31):自己構(gòu)建一個(gè)簡(jiǎn)單的代理池
小白學(xué) Python 爬蟲(32):異步請(qǐng)求庫(kù) AIOHTTP 基礎(chǔ)入門
首先恭喜看到這篇文章的各位同學(xué),從這篇文章開始,整個(gè)小白學(xué) Python 爬蟲系列進(jìn)入最后一部分,小編計(jì)劃是介紹一些常用的爬蟲框架。
說(shuō)到爬蟲框架,首先繞不過去的必然是 Scrapy 。
Scrapy 是一個(gè)基于 Twisted 的異步處理框架,是純 Python 實(shí)現(xiàn)的爬蟲框架,其架構(gòu)清晰,模塊之間的耦合程度低,可擴(kuò)展性極強(qiáng),可以靈活完成各種需求。
當(dāng)然第一件事兒還是各種官方地址:
Scrapy 官網(wǎng): https://scrapy.org/
Github:https://github.com/scrapy/scrapy
首先看一下 Scrapy 框架的架構(gòu)體系圖:
從這張圖中,可以看到 Scrapy 分成了很多個(gè)組件,每個(gè)組件的含義如下:
上面這張圖的數(shù)據(jù)流程如下:
這張圖的名詞有些多,記不住實(shí)屬正常,不過沒關(guān)系,后續(xù)小編會(huì)配合著示例代碼,和各位同學(xué)一起慢慢的學(xué)習(xí)。
先來(lái)個(gè)最簡(jiǎn)單的示例項(xiàng)目,在創(chuàng)建項(xiàng)目之前,請(qǐng)確定自己的環(huán)境已經(jīng)正確安裝了 Scrapy ,如果沒有安裝的同學(xué)可以看下前面的文章,其中有介紹 Scrapy 的安裝配置。
首先需要?jiǎng)?chuàng)建一個(gè) Scrapy 的項(xiàng)目,創(chuàng)建項(xiàng)目需要使用命令行,在命令行中輸入以下命令:
scrapy startproject first_scrapy
然后一個(gè)名為 first_scrapy
的項(xiàng)目就創(chuàng)建成功了,項(xiàng)目文件結(jié)構(gòu)如下:
first_scrapy/
scrapy.cfg # deploy configuration file
first_scrapy/ # project's Python module, you'll import your code from here
__init__.py
items.py # project items definition file
middlewares.py # project middlewares file
pipelines.py # project pipelines file
settings.py # project settings file
spiders/ # a directory where you'll later put your spiders
__init__.py
到此,我們已經(jīng)成功創(chuàng)建了一個(gè) Scrapy 項(xiàng)目,但是這個(gè)項(xiàng)目目前是空的,我們需要再手動(dòng)添加一只 Spider 。
Scrapy 用它來(lái)從網(wǎng)頁(yè)里抓取內(nèi)容,并解析抓取的結(jié)果。不過這個(gè)類必須繼承 Scrapy 提供的 Spider 類 scrapy.Spider,還要定義 Spider 的名稱和起始請(qǐng)求,以及怎樣處理爬取后的結(jié)果的方法。
創(chuàng)建 Spider 可以使用手動(dòng)創(chuàng)建,也可以使用命令創(chuàng)建,小編這里演示一下如何使用命令來(lái)創(chuàng)建,如下:
scrapy genspider quotes quotes.toscrape.com
將會(huì)看到在 spider 目錄下新增了一個(gè) QuotesSpider.py 的文件,里面的內(nèi)容如下:
# -*- coding: utf-8 -*-
import scrapy
class QuotesSpider(scrapy.Spider):
name = 'quotes'
allowed_domains = ['quotes.toscrape.com']
start_urls = ['http://quotes.toscrape.com/']
def parse(self, response):
pass
可以看到,這個(gè)類里面有三個(gè)屬性 name
、 allowed_domains
、 start_urls
和一個(gè) parse()
方法。
到這里我們就清楚了, parse()
方法中的 response 是前面的 start_urls
中鏈接的爬取結(jié)果,所以在 parse()
方法中,我們可以直接對(duì)爬取的結(jié)果進(jìn)行解析。
先看下網(wǎng)頁(yè)的 DOM 結(jié)構(gòu):
接下來(lái)要做的事情就比較簡(jiǎn)單了,獲取其中的數(shù)據(jù),然后將其打印出來(lái)。
數(shù)據(jù)提取的方式可以是 CSS 選擇器也可以是 XPath 選擇器,小編這里使用的是 CSS 選擇器,將我們剛才的 parse()
方法進(jìn)行一些簡(jiǎn)單的改動(dòng),如下:
def parse(self, response):
quotes = response.css('.quote')
for quote in quotes:
text = quote.css('.text::text').extract_first()
author = quote.css('.author::text').extract_first()
tags = quote.css('.tags .tag::text').extract()
print("text:", text)
print("author:", author)
print("tags:", tags)
首先是獲取到所有的 class 為 quote 的元素,然后將所有元素進(jìn)行循環(huán)后取出其中的數(shù)據(jù),最后對(duì)這些數(shù)據(jù)進(jìn)行打印。
程序到這里就寫完了,那么接下來(lái)的問題是,我們?nèi)绾芜\(yùn)行這只爬蟲?
Scrapy 的運(yùn)行方式同樣適用適用命令行的,首先要到這個(gè)項(xiàng)目的根目錄下,然后執(zhí)行以下代碼:
scrapy crawl quotes
結(jié)果如下:
可以看到,我們剛才 print()
的內(nèi)容正常的打印在了命令行中。
除了我們 print()
中的內(nèi)容的打印,還可以看到在 Scrapy 啟動(dòng)的過程中, Scrapy 輸出了當(dāng)前的版本號(hào)以及正在啟動(dòng)的項(xiàng)目名稱,并且在爬取網(wǎng)頁(yè)的過程中,首先訪問了 http://quotes.toscrape.com/robots.txt 機(jī)器人協(xié)議,雖然這個(gè)協(xié)議在當(dāng)前這個(gè)示例中響應(yīng)了 404的狀態(tài)碼,但是 Scrapy 會(huì)根據(jù)機(jī)器人協(xié)議中的內(nèi)容進(jìn)行爬取。
本系列的所有代碼小編都會(huì)放在代碼管理倉(cāng)庫(kù) Github 和 Gitee 上,方便大家取用。
https://docs.scrapy.org/en/latest/intro/tutorial.html
聯(lián)系客服