前言
上一篇章講解了如何新建一個 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
- 默認: 'myscrapy (+http://www.yourdomain.com )'
- 爬取的默認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('也可以掃下方二維碼哦~')