使用Scrapy編寫你的第一個(gè)爬蟲

初窺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)備

  1. windows 10
  2. 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.

20180801184513.png

執(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/

917446-20160411111406957-1216645592.png

3.安裝pywin32

執(zhí)行爬蟲時(shí)可能遇到的錯(cuò)誤:
No module named 'PIL'

pip install Pillow

爬蟲原理

Scrapy 使用 Twisted這個(gè)異步網(wǎng)絡(luò)庫來處理網(wǎng)絡(luò)通訊,架構(gòu)清晰,并且包含了各種中間件接口,可以靈活的完成各種需求。


dj7oums417.png

綠線是數(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容