初窺Scrapy
Scrapy是一個(gè)為了爬取網(wǎng)站數(shù)據(jù),提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應(yīng)用框架。 可以應(yīng)用在包括數(shù)據(jù)挖掘,信息處理或存儲(chǔ)歷史數(shù)據(jù)等一系列的程序中。其最初是為了 頁面抓取 (更確切來說, 網(wǎng)絡(luò)抓取 )所設(shè)計(jì)的, 也可以應(yīng)用在獲取API所返回的數(shù)據(jù)(例如 Amazon Associates Web Services ) 或者通用的網(wǎng)絡(luò)爬蟲。
基本步驟
- 選擇一個(gè)網(wǎng)站
- 定義您想抓取的數(shù)據(jù)
- 編寫提取數(shù)據(jù)的Spider
- 執(zhí)行spider,獲取數(shù)據(jù)
- 查看提取到的數(shù)據(jù)
環(huán)境準(zhǔn)備
- windows 10
- Python3.4
1.Twisted安裝
鑒于win10下安裝Scrapy總出問題,所以先把Twisted的 whl格式文件下載下來,進(jìn)行安裝
地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
選擇對(duì)于的python版本,點(diǎn)擊鏈接下載whl文件,如“ Twisted-18.7.0-cp34-cp34m-win_amd64.whl”
安裝Scrapy執(zhí)行過程中經(jīng)常出現(xiàn)的問題 building'twisted.test.raiser' extension error: Microsoft Visual C++ 10.0 is required.

執(zhí)行pip安裝
pip install Twisted-18.7.0-cp34-cp34m-win_amd64.whl
2. Scrapy安裝
pip install Scrapy
3.安裝pywin32
執(zhí)行爬蟲時(shí)可能遇到的錯(cuò)誤
No modle named ‘win32api’
解決方案:到如下地址,選擇對(duì)于版本,下載安裝pywin32
地址:https://sourceforge.net/projects/pywin32/files/pywin32/Build%20220/

3.安裝pywin32
執(zhí)行爬蟲時(shí)可能遇到的錯(cuò)誤:
No module named 'PIL'
pip install Pillow
爬蟲原理
Scrapy 使用 Twisted這個(gè)異步網(wǎng)絡(luò)庫來處理網(wǎng)絡(luò)通訊,架構(gòu)清晰,并且包含了各種中間件接口,可以靈活的完成各種需求。

綠線是數(shù)據(jù)流向,首先從初始URL開始,Scheduler會(huì)將其交給Downloader進(jìn)行下載,下載之后會(huì)交給Spider進(jìn)行分析,Spider分析出來的結(jié)果有兩種:一種是需要進(jìn)一步抓取的鏈接,例如之前分析的“下一頁”的鏈接,這些東西會(huì)被傳回Scheduler;另一種是需要保存的數(shù)據(jù),它們則被送到Item Pipeline那里,那是對(duì)數(shù)據(jù)進(jìn)行后期處理(詳細(xì)分析、過濾、存儲(chǔ)等)的地方。另外,在數(shù)據(jù)流動(dòng)的通道里還可以安裝各種中間件,進(jìn)行必要的處理。
組成部分介紹:
- Scrapy Engine:
負(fù)責(zé)組件之間數(shù)據(jù)的流轉(zhuǎn),當(dāng)某個(gè)動(dòng)作發(fā)生時(shí)觸發(fā)事件 - Scheduler:
接收requests,并把他們?nèi)腙?duì),以便后續(xù)的調(diào)度 - Downloader:
負(fù)責(zé)抓取網(wǎng)頁,并傳送給引擎,之后抓取結(jié)果將傳給spider - Spiders:
用戶編寫的可定制化的部分,負(fù)責(zé)解析response,產(chǎn)生items和URL。每一個(gè)spider代表一個(gè)特定的任務(wù) - Item Pipeline:
負(fù)責(zé)處理item,典型的用途:清洗、驗(yàn)證、持久化 - Downloader middlewares:
位于引擎和下載器之間的一個(gè)鉤子,處理傳送到下載器的requests和傳送到引擎的response(若需要在Requests到達(dá)Downloader之前或者是responses到達(dá)spiders之前做一些預(yù)處理,可以使用該中間件來完成) - Spider middlewares:
位于引擎和抓取器之間的一個(gè)鉤子,處理抓取器的輸入和輸出
(在spiders產(chǎn)生的Items到達(dá)Item Pipeline之前做一些預(yù)處理或response到達(dá)spider之前做一些處理)
一個(gè)小例子
創(chuàng)建項(xiàng)目
在開始爬取之前,您必須創(chuàng)建一個(gè)新的Scrapy項(xiàng)目。 進(jìn)入您打算存儲(chǔ)代碼的目錄中,運(yùn)行下列命令:
scrapy startproject book
創(chuàng)建項(xiàng)目
這些文件分別是:
scrapy.cfg: 項(xiàng)目的配置文件
book/: 該項(xiàng)目的python模塊。之后您將在此加入代碼。
book/items.py: 項(xiàng)目中的item文件.
book/pipelines.py: 項(xiàng)目中的pipelines文件.
book/settings.py: 項(xiàng)目的設(shè)置文件.
book/spiders/: 放置spider代碼的目錄.
建立spider
首先要進(jìn)入book目錄,使用basic模板創(chuàng)建一個(gè)spider
建立spider, scrapy genspider douban https://book.douban.com/top250?start=0
spider
pycharm 調(diào)試scrapy
建立一個(gè)main.py文件,在book文件目錄下,保證main.py和自動(dòng)生成的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即啟動(dòng),名字為douban的spider
修改setting.py
將setting.py中的遵循robot協(xié)議改為False,否則會(huì)過濾掉一些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簡(jiǎn)介
xpath使用路徑表達(dá)式在xml和html中進(jìn)行導(dǎo)航。
xpath包含標(biāo)準(zhǔn)函數(shù)庫。
xpath是一個(gè)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]不存在的時(shí)候報(bào)錯(cuò)
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方便測(cè)試語法。首先您需要進(jìn)入項(xiàng)目的根目錄,執(zhí)行下列命令來啟動(dòng)shell:scrapy shell "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"
注意:當(dāng)在終端運(yùn)行Scrapy時(shí),請(qǐng)一定記得給url地址加上引號(hào),否則包含參數(shù)的url(例如 & 字符)會(huì)導(dǎo)致Scrapy運(yùn)行失敗。
css方式提取
image.png
image.png
image.png
定義Item
Item 是保存爬取到的數(shù)據(jù)的容器;其使用方法和python字典類似, 并且提供了額外保護(hù)機(jī)制來避免拼寫錯(cuò)誤導(dǎo)致的未定義字段錯(cuò)誤。類似在ORM中做的一樣,您可以通過創(chuàng)建一個(gè) scrapy.Item 類, 并且定義類型為 scrapy.Field 的類屬性來定義一個(gè)Item。 (如果不了解ORM, 不用擔(dān)心,您會(huì)發(fā)現(xiàn)這個(gè)步驟非常簡(jiǎn)單)。首先根據(jù)需要從book獲取到的數(shù)據(jù)對(duì)item進(jìn)行建模。 我們需要從book中獲取名字,描述。 對(duì)此,在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