Scrapy框架之一個小項目帶你上路

前言

上一篇章講解了如何新建一個 Scrapy 項目,帶大家瞭解了 Scrapy 框架的基本結構,還沒了解的各位可以看這裏
Scrapy框架之新建Scrapy項目詳解

這篇主要講解 Scrapy 框架中的一些基本配置,以及通過一個爬蟲來進一步的瞭解 Scrapy 的工作原理

順便提一下,這次爬取的是維基百科上的各國演員姓名,而爬取維基百科的首要條件就是需要翻牆,沒有購買VPS的小夥伴該怎麼辦呢?

由於審覈問題...如何免費翻牆請關注公衆號後,在後臺回覆大寫【FQ】

正文

先來接着看看 settings.py 中常用的配置
BOT_NAME

  • 默認: 'scrapybot'
  • 當使用 startproject 命令創建項目時其也被自動賦值

ROBOTSTXT_OBEY

  • 默認: ROBOTSTXT_OBEY = True
  • 遵守網站的機器人協議,但是一般我們都會改爲False,或者註釋掉這句

CONCURRENT_REQUESTS

  • 默認: 16
  • Scrapy downloader 併發請求(concurrent requests)的最大值

DEFAULT_REQUEST_HEADERS

  • 默認: 如下

    {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'en',
    }
    
    

    Scrapy HTTP Request使用的默認header,當然我們可以自己修改

DEPTH_LIMIT

  • 默認: 0
  • 爬取網站最大允許的深度(depth)值。如果爲0,則沒有限制

DOWNLOAD_DELAY

  • 默認: 0
  • 下載器在下載同一個網站下一個頁面前需要等待的時間。該選項可以用來限制爬取速度, 減輕服務器壓力。同時也支持小數:
`DOWNLOAD_DELAY = 0.25 # 250 ms of delay`
  • 默認情況下,Scrapy在兩個請求間不等待一個固定的值, 而是使用0.5到1.5之間的一個隨機值 DOWNLOAD_DELAY 的結果作爲等待間隔

DOWNLOAD_TIMEOUT

  • 默認: 180
  • 下載器超時時間(單位: 秒)

ITEM_PIPELINES

  • 默認: {}
  • 保存項目中啓用的pipeline及其順序的字典。該字典默認爲空,值(value)任意,不過值(value)習慣設置在0-1000範圍內,值越小優先級越高
    ITEM_PIPELINES = {
    'myscrapy.pipelines.MyscrapyPipeline': 300,
    }
    

USER_AGENT

PROXIES: 代理設置

  • 示例:
    PROXIES = [
      {'ip_port': '111.11.228.75:80', 'password': ''},
      {'ip_port': '120.198.243.22:80', 'password': ''},
      {'ip_port': '111.8.60.9:8123', 'password': ''},
      {'ip_port': '101.71.27.120:80', 'password': ''},
      {'ip_port': '122.96.59.104:80', 'password': ''},
      {'ip_port': '122.224.249.122:8088', 'password':''},
    ]
    

COOKIES_ENABLED = False

  • 禁用Cookies

除了這些配置參數, settings.py 中還有很多參數可以配置,也可以在其中自己定義數據庫的配置連接參數

接下來就是開始我們的爬蟲案例的第一部分

我們從這個各國演員分類開始
https://zh.wikipedia.org/wiki/Category:%E5%90%84%E5%9C%8B%E6%BC%94%E5%93%A1

而對應的在爬蟲文件中,我們把 allowed_domains 換成了維基百科的域名,這樣爬蟲運行時就不會採集其他域名鏈接的內容

這裏我們不用原來的start_urls,而是重寫了一個start_requests方法,在方法中定義開始爬取的鏈接等等,然後調用scrapy.Request來發送請求,請求中的幾個參數,簡單地講,url就是請求的鏈接, callback就是回調到parse這個方法,然後可以打印輸出,meta可以傳遞參數,這裏是爲了添加本地的代理(添加代理後纔可以正常訪問到維基百科)

# -*- coding: utf-8 -*-
import scrapy


class FirstSpider(scrapy.Spider):
    name = 'first'
    allowed_domains = ['wikipedia.org']

    def start_requests(self):
        start_urls = 'https://zh.wikipedia.org/wiki/Category:%E5%90%84%E5%9C%8B%E6%BC%94%E5%93%A1'
        yield scrapy.Request(url=start_urls, callback=self.parse, meta={'proxy': 'http://localhost:1080'})

    def parse(self, response):
        print(response.text)

那麼我們現在就來運行看看,到底能不能獲取返回的響應,在這裏如何運行一個 Scrapy 項目呢?

第一種方法:命令行運行

首先打開命令行,進入到你的項目文件夾下,注意,一定要是進入你的項目文件夾,否則命令找不到你的爬蟲文件,就沒有辦法執行

接着輸入命令,我這裏依舊是python3 -m,不多提了,需要注意的是,我這裏的 first 就是 name = 'first',中的 name的值,是你自己定義的爬蟲的名稱,輸完命令後回車即可

scrapy crawl first

這就是我們得到響應的html源碼

第二種方法:pycharm中的終端執行

打開 pycharm 找到左下角的 Terminal ,或者點擊在菜單欄中找

同樣我們需要進入到項目的文件夾下

然後運行

當然有人會問這前面一大堆的加載的信息是什麼?這些其實是項目運行時讀取的配置信息,在後續也會講到

第三種方法:代碼運行

每次都要輸一遍命令來執行嗎,有點麻煩啊......那麼你可以試試,加入這些代碼,來讓執行變得更加自動化

# -*- coding: utf-8 -*-
import scrapy
# 導入這倆
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings


class FirstSpider(scrapy.Spider):
    name = 'first'
    allowed_domains = ['wikipedia.org']

    def start_requests(self):
        start_urls = 'https://zh.wikipedia.org/wiki/Category:%E5%90%84%E5%9C%8B%E6%BC%94%E5%93%A1'
        yield scrapy.Request(url=start_urls, callback=self.parse, meta={'proxy': 'http://localhost:1080'})

    def parse(self, response):
        print(response.text)

# 從這裏開始執行,其它不用變動
if __name__ == "__main__":
    process = CrawlerProcess(get_project_settings())
    process.crawl('first')
    process.start()

這樣就可以直接右鍵運行了,怎麼樣,是不是變得簡單了點!

要是執行了命令,卻怎麼也獲取不到響應呢?別急,好好看看,有沒有在設置中禁用機器人協議!

ROBOTSTXT_OBEY = False

以上就是今天的內容,後續會接着以這個項目爲例來一起學習 Scrapy!


print('微信公衆號搜索 "猿獅的單身日常" ,Java技術升級、蟲師修煉,我們 不見不散!')
print('也可以掃下方二維碼哦~')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章